用 numpy 从头开始构建 KNN 分类器,代码有啥问题?
Posted
技术标签:
【中文标题】用 numpy 从头开始构建 KNN 分类器,代码有啥问题?【英文标题】:KNN Classifier build from scratch with numpy, what is wrong with the code?用 numpy 从头开始构建 KNN 分类器,代码有什么问题? 【发布时间】:2021-12-23 08:12:36 【问题描述】:为什么我使用 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)
【问题讨论】:
【参考方案1】:基于sklearn
documentation,有多种原因:
-
距离度量:您使用的是欧几里得距离度量,而
sklearn
默认使用minkowski
,这在X,Y
中会有所不同
要查找最近的邻居k
sklearn
,默认情况下,选择kd_tree
、BallTree
和BruteForce
方法之一,但是,在您的k_neighbours()
函数中,您使用BruteForce
。
最后但同样重要的是,您的测试中的 k
值是 5
,而您使用 4
等效于 skleran
【讨论】:
谢谢,这很有帮助!亲切的问候。 我更改了 sklearn.KNeighborsClassifier 参数以与您所说的匹配,但结果仍然不一样。你可以在上面的代码中看到。还有其他建议吗?以上是关于用 numpy 从头开始构建 KNN 分类器,代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章
KNN分类器最近邻分类KD树KNN分类的最佳K值基于半径的最近邻分类器KNN多分类KNN多标签分类KNN多输出分类KNN分类的优缺点