如何使用预先计算的距离矩阵来使用 KNeighborsClassifier?

问题描述 投票:0回答:2

我需要使用

KNeighborsClassifier
中的
scikit-learn
类对数据集进行分类。在 documentation 中,它说您可以使用预先计算的距离矩阵,但我已经尝试过了,它给我一个作为参数传递的矩阵尺寸的错误。经过多次测试,我没有发现任何错误。这是我的代码:

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import pairwise_distances

X_train = [[0, 0], [1, 1], [2, 2], [3, 3]]
y_train = [0, 0, 1, 1]
X_test = [[1, 2], [1,3]]

# Precomputed matrix of distances between training instances
distances_traint = pairwise_distances(X_train)
print(distances)

# Precomputed matrix of distances between test instances and training instances
distances_test = pairwise_distances(X_test, X_train)
print(distances1)

# Create a KNN classifier using the precomputed metric
knn = KNeighborsClassifier(n_neighbors=3, metric='precomputed')

# Train the classifier using the training dataset and labels
knn.fit(distances_train, y_train)

# Predict the class for the test instance using the precomputed matrix of distances
prediction = knn.predict(distances_test)

# print prediction
print(prediction)

输出是这样的:

[[0.         1.41421356 2.82842712 4.24264069]
 [1.41421356 0.         1.41421356 2.82842712]
 [2.82842712 1.41421356 0.         1.41421356]
 [4.24264069 2.82842712 1.41421356 0.        ]]
[[2.23606798 1.         1.         2.23606798]
 [3.16227766 2.         1.41421356 2.        ]]
[0 1]

我相信输出是正确的,但我对我使用的实现有疑问。我想知道为什么有必要将

fit
元素之间距离的
distances_train
矩阵传递给
X_train
方法,如果它在
predict
方法中实际使用来进行预测的是
distances_test
矩阵
X_test
X_train
的元素之间的距离。

另一方面,这只是一个例子。在实践中,我将拥有一个随机划分为训练和测试的数据集以及数据集所有元素之间的距离矩阵。因此,我必须在距离矩阵中查找与火车集合相对应的子矩阵,作为参数传递给

fit
方法,以及与测试和火车之间的距离相对应的子矩阵,作为参数传递给
 predict
方法。

如果有人能给我意见,我将不胜感激。

python scikit-learn classification knn
2个回答
1
投票

我想知道为什么需要将 X_train 元素之间的距离的 distances_train 矩阵传递给 fit 方法。

  • 对于未预先计算的:
    你想做一个分类。模型需要知道存在哪些类以及它们在“哪里”。 这种情况发生在试衣期间,在这里您需要有关职位和班级的信息y_train

    
    

  • 对于预先计算:
  • 例如,人们可以查看您的第一个

    x_test[0] -> [2.236 1. 1. 2.236]
    。 该模型将选择

    k=3
    最近的邻居,即
    x_train[[0,1,2]]
    以及来自
    y_train[[0,1,2]] -> 0,0,1
    的类,因此为 0 类。
    
    

  • 此时
您的问题是正确的,为什么在您的情况下需要 x_train ?你是对的,它没有,但是

至少还有一项其他功能。 例如,您可以决定允许连接哪些点(即您的数据是一个图表)。

如果度量是“预先计算的”,则 X 被假定为距离矩阵,并且在拟合过程中必须是方阵。
X 可能是稀疏图,在这种情况下,只有“非零”元素可以被视为邻居。

只要您不将数据解释为图表和/或不带参数调用
knn.kneighbors|_graph

,我不认为使用正确的

x_train_distance
对于推理是必要的。
除此之外,我认为这主要是一个接口问题以及一般如何对分类器执行检查,即

len(X) == len(Y)

    


0
投票
我想知道为什么需要将
fit

元素之间的距离矩阵传递给

distances_train
方法 [...]

X_train

距离矩阵只是指定每个点邻域的另一种方式;实际上,只要您不需要模型根据坐标进行预测,模型就需要了解它们。在幕后,在任何情况下都会创建一个距离矩阵,因为这可以让模型确定哪些其他点最接近任何给定点(在相应的度量下),也可以让模型在
precomputed

时权衡它们的接近程度。


[...] 如果它在 weights="distance"
 方法中实际使用来进行预测的是 
predict

distances_test

元素之间距离的

X_test
矩阵。

这相当于将坐标传递给经过坐标训练的模型。在本例中,拟合模型会根据与之前见过的训练点的距离来“思考”。
因此,我必须在距离矩阵中查找与火车集合相对应的子矩阵,作为参数传递给 

X_train
方法,以及与测试和火车之间的距离相对应的子矩阵,作为参数传递给

fit

方法。

这是完全正确且简单的做法:
predict
将任意数量的数组作为第一个参数,因此如果您只有距离矩阵,则可以分割其索引并从那里构造两个子矩阵。下面的示例显示了使用相同的 
train_test_split

进行坐标训练和距离矩阵训练之间的精确等价性。

metric

    

© www.soinside.com 2019 - 2024. All rights reserved.