алгоритм knn — ошибка типа: manhattan_dist() отсутствует 1 требуемый позиционный аргумент

#python #knn

#python #knn

Вопрос:

У меня проблема с моим скриптом python с алгоритмом knn. Я изменил метрику, используемую в алгоритме, на манхэттенскую. Итак, это то, что я написал:

 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. У вас есть какие-либо предложения?

Комментарии:

1. почему вы получили self в функции?

2. Я должен признать, что я просто скопировал этот фрагмент кода с другого сайта. Однако… Мне было интересно то же самое, но я пока недостаточно уверен, чтобы сказать, что программисты ошибаются. Но теперь это работает! Спасибо!

Ответ №1:

Вам не нужен 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, 1, 1, 0]


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

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