KNN分类器使用numpy从头开始构建,代码有什么问题



为什么我用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文档,有多种原因:

  1. 距离度量:您使用的是欧几里得距离度量,而sklearn默认使用minkowskiX,Y会产生差异
  2. 要查找k最近的邻居sklearn,默认情况下,请选择kd_treeBallTreeBruteForce方法之一,但是,在k_neighbours()函数中,使用BruteForce
  3. 最后但同样重要的是,测试中的k值是5,而您使用4作为skleran的等效值

最新更新