用 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】:

基于sklearndocumentation,有多种原因:

    距离度量:您使用的是欧几里得距离度量,而sklearn 默认使用minkowski,这在X,Y 中会有所不同 要查找最近的邻居ksklearn,默认情况下,选择kd_treeBallTreeBruteForce 方法之一,但是,在您的k_neighbours() 函数中,您使用BruteForce。 最后但同样重要的是,您的测试中的 k 值是 5,而您使用 4 等效于 skleran

【讨论】:

谢谢,这很有帮助!亲切的问候。 我更改了 sklearn.KNeighborsClassifier 参数以与您所说的匹配,但结果仍然不一样。你可以在上面的代码中看到。还有其他建议吗?

以上是关于用 numpy 从头开始​​构建 KNN 分类器,代码有啥问题?的主要内容,如果未能解决你的问题,请参考以下文章

机器学习算法篇之KNN图像识别分类器构建

5月深度学习班第2课高效计算基础与图像线性分类器

Knn 分类器图

kNN 是统计分类器吗?

提高knn分类器的准确性

KNN分类器最近邻分类KD树KNN分类的最佳K值基于半径的最近邻分类器KNN多分类KNN多标签分类KNN多输出分类KNN分类的优缺点