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
相关产品推荐
相关产品推荐

