You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

KNN算法Python脚本报错:TypeError: manhattan_dist()缺少必填参数data2

解决KNN自定义曼哈顿距离的TypeError问题

嘿,我来帮你搞定这个报错的问题~

错误原因分析

你定义的manhattan_dist是带self的类方法,但sklearn的KNeighborsClassifier在调用自定义距离度量函数时,只会传入两个样本参数(data1和data2),不会自动传递self参数。这就导致函数调用时,第一个传入的样本被当成了self,第二个参数data2自然就缺失了,所以触发了TypeError。

三种解决方案


方案1:把自定义函数改成普通函数(最直接)

如果你不需要这个函数作为类的方法,直接去掉self参数,改成普通函数即可:

def manhattan_dist(data1, data2):
    return sum(abs(data1 - data2))

# 后续代码不变
X = df.iloc[:, :-1].values
y = df.iloc[:, 36].values
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2)
knn = KNeighborsClassifier(n_neighbors=5, metric=manhattan_dist)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(classification_report(y_test, y_pred))

方案2:使用sklearn内置的曼哈顿距离(最推荐)

其实sklearn已经内置了曼哈顿距离的实现,完全不需要自己写函数,直接指定metric='manhattan'就行,内置实现更高效还能处理各种细节:

# 替换掉自定义函数的代码,直接用内置参数
knn = KNeighborsClassifier(n_neighbors=5, metric='manhattan')

方案3:如果必须保留类方法(比如在类中编写)

如果这个函数必须是类的一部分,你可以用lambda或者functools.partial来绑定self:

# 方法一:用lambda包装
knn = KNeighborsClassifier(n_neighbors=5, metric=lambda x, y: self.manhattan_dist(x, y))

# 方法二:用functools.partial绑定
from functools import partial
knn = KNeighborsClassifier(n_neighbors=5, metric=partial(self.manhattan_dist))

验证建议

优先试试方案2,因为这是官方提供的标准用法,不容易出错;如果一定要自己实现距离函数,方案1最直接。

内容的提问来源于stack exchange,提问作者Liliac

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 17:08:17