基于Numpy手写KNN分类器结果与sklearn实现不一致,代码存在什么问题?
KNN自定义实现与sklearn结果差异的bug定位
下面是按概率从高到低排列的问题原因:
- 类初始化参数赋值错误
检查你的KNN_Classifier的__init__方法是否正确将传入的k值赋值给self.k,如果出现参数名不匹配、赋值遗漏的问题,会导致实际运行的k值和你设置的5不一致,直接产生结果差异。 euclidean_length函数实现错误
虽然欧氏距离是否开根号不影响排序结果,但如果实现存在维度匹配错误、距离公式写错的问题,会直接导致距离排序结果和sklearn不同。典型错误包括:误用L1曼哈顿距离、计算差值平方后忘记求和直接返回、特征维度广播错误。
- 距离相等时的样本选择逻辑差异
当存在多个训练样本与测试样本的距离完全相等,且这些样本横跨第k个截断位置时,你用np.argsort(lengths)[: self.k]的逻辑会按numpy默认快排的结果取前k个,而sklearn的brute暴力搜索实现中,距离相等时会按训练集样本的原始顺序做稳定排序,二者选出来的k个样本可能不一致,进而导致投票结果不同。 - 数据输入与预处理差异
确认输入给两个分类器的X_training、y_training、X_test是完全相同的,排除以下情况:一方输入特征做了标准化/归一化另一方未处理、训练集特征和标签的对应顺序错位、测试集维度处理错误。 - 平局投票的处理逻辑差异
当k个最近邻的投票结果出现多个类别票数相同的情况时,你用np.argmax(np.bincount(k_nearest_labels))的逻辑默认返回标签值最小的类别,和sklearn的默认逻辑一致,但如果你的实现中存在自定义的投票权重逻辑,也会导致结果不同。
内容的提问来源于stack exchange,提问作者Yordan Иванов
相关产品推荐
相关产品推荐

