为什么我用numpy从头开始构建的KNN分类器会给出与sklearn.KNeighborsClassifier
不同的结果?我的代码出了什么问题?
# create a function that computes euclidean distance and return the most common class label
# for given k.
def k_neighbors(self, x):
lengths = [self.euclidean_length(x, x_train) for x_train in self.X_training]
k_index = np.argsort(lengths)[: self.k]
k_nearest_labels = [self.y_training[i] for i in k_index]
counts = np.bincount(k_nearest_labels)
most_common_label = np.argmax(counts)
return most_common_label
# running KNN classifier with K=5 to fit the data and make predictions.
classifier1 = KNN_Classifier(k=5)
classifier1.fit(X_training, y_training)
predicted1 = classifier1.predicting(X_test)
他们显然都做了同样的事情,但我有不同的结果。我的代码中的错误在哪里?
from sklearn.neighbors import KNeighborsClassifier
classifier2 = KNeighborsClassifier(n_neighbors=5, algorithm='brute', p=2)
classifier2.fit(X_training, y_training)
predicted2 = classifier2.predict(X_test)
基于sklearn
文档,有多种原因:
- 距离度量:您使用的是欧几里得距离度量,而
sklearn
默认使用minkowski
,X,Y
会产生差异 - 要查找
k
最近的邻居sklearn
,默认情况下,请选择kd_tree
、BallTree
和BruteForce
方法之一,但是,在k_neighbours()
函数中,使用BruteForce
- 最后但同样重要的是,测试中的
k
值是5
,而您使用4
作为skleran
的等效值