knn算法-TypeError:manhattan_dist缺少1个必需的位置参数

问题描述

我的knn算法python脚本有问题。 我使用曼哈顿一号算法更改了算法中使用的指标。 这就是我写的:

def manhattan_dist(self,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))

问题是,当我运行此脚本时,出现此错误

TypeError: manhattan_dist() missing 1 required positional argument: 'data2'

错误与该行有关

knn.fit(X_train,y_train)

一切都符合欧氏距离。 如果您需要有关我的数据集的任何信息,请询问我。代码很长。

我对python的了解还不是很熟练,这是我使用knn算法的时候了。 您有什么建议吗?

解决方法

您不需要在函数定义中使用self。有关使用自定义距离指标的示例,请参见以下代码。

from sklearn.neighbors import KNeighborsClassifier

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

X = [[0,1,2],[3,4,5],[8,9,1],[11,7,9]]
y = [0,0]


knn = KNeighborsClassifier(n_neighbors=3,metric=manhattan_dist)
knn.fit(X,y)

knn.predict(X) # array([1,1])