基于L1曼哈顿距离实现KNN分类预测的可行方法咨询
核心结论
完全可以基于曼哈顿(L1)距离完成KNN分类全流程预测,你之前的实现无效是两类典型的API使用误区,不需要推翻原本能正常运行的L2版KNN框架,仅调整分类器初始化的距离参数即可落地。
此前代码的问题定位
- 混淆了两类最近邻相关类别的适用场景:
NearestNeighbors是无监督的邻域检索工具,仅能完成样本近邻索引、距离计算的查询能力,不内置分类投票、标签预测逻辑,本身就没有对外提供predict()接口,天然不适合直接用于分类建模。 - 距离参数的传值方式适配错了场景:手动实例化
DistanceMetric对象传入metric参数的写法,仅适配NearestNeighbors的邻域查询场景;用于分类的KNeighborsClassifier内置了全量常用距离度量的支持,根本不需要手动实例化距离对象。
正确实现代码
直接沿用原本跑通的KNeighborsClassifier框架,初始化时通过metric参数指定使用曼哈顿距离即可,全流程和原L2版本完全对齐,不需要额外引入NearestNeighbors、DistanceMetric模块:
def L1(trainx, trainy, testx): from sklearn.neighbors import KNeighborsClassifier # 初始化1近邻分类器,指定使用曼哈顿距离 knn = KNeighborsClassifier(n_neighbors=1, metric='manhattan') # 拟合训练集 knn.fit(trainx, trainy) # 输出测试集预测结果 y_pred = knn.predict(testx) return y_pred
补充说明:
KNeighborsClassifier默认使用闵可夫斯基距离,p值取2时就是原代码用到的L2欧氏距离,p值取1时等价于曼哈顿距离;直接传metric='manhattan'的写法,和手动设置p=1的计算效果完全一致。
内容的提问来源于stack exchange,提问作者MarkS
相关产品推荐
相关产品推荐

