Алгоритм KNN: объект int не является подписным - PullRequest
0 голосов
/ 06 марта 2019

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

Вот мой код:

from math import sqrt
import csv
from random import shuffle
import numpy as np
import numpy
import matplotlib.pyplot as plt
import operator
import math


iris = datasets.load_iris() 

X = iris.data
y = iris.target



def euclideanDistance(id1, id2):
    for x in range(len(id1)-1):
        dist = np.sqrt(np.sum((int(id2[x]) - int(id1[x]))**2))
    return dist

data1 = [2, 2, 2, 'a']
data2 = [4, 4, 4, 'b']
distance = euclideanDistance(data1, data2)
print(distance)

def mykNN(X, y, x_):
    distance = []
    neighbour = []

    for i in range(len(X)):
        d = euclideanDistance(X[i], x_ )
        distance.append((X[i], d))
    distance.sort(key=operator.itemgetter(1))

    for r in range(k):
        options.append(distance[r][0])
    options = neighbour
    return neighbour

k=3

y_ = mykNN(X, y,k)
print(y_)

независимо от того, как я изменяю свою функцию, возникает эта ошибка.

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-85-2a5bfc4a796d> in <module>
     42 k=3
     43 
---> 44 y_ = mykNN(X, y,k)
     45 print(y_)
     46 

<ipython-input-85-2a5bfc4a796d> in mykNN(X, y, x_)
     31 
     32     for i in range(len(X)):
---> 33         d = euclideanDistance(X[i], x_ )
     34         distance.append((X[i], d))
     35     distance.sort(key=operator.itemgetter(1))

<ipython-input-85-2a5bfc4a796d> in euclideanDistance(id1, id2)
     18 def euclideanDistance(id1, id2):
     19     for x in range(len(id1)-1):
---> 20         dist = np.sqrt(np.sum((int(id2[x]) - int(id1[x]))**2))
     21     return dist
     22 

TypeError: 'int' object is not subscriptable

Буду признателен за ваш ответ, так как это беспокоит меня.

Спасибо.

1 Ответ

1 голос
/ 06 марта 2019

Что ж, ошибка говорит вам, что в euclideanDistance() либо id1, либо id2 (или оба) является целым числом, поскольку это два идентификатора, которые вы индексируете в этой строке.Чтобы выполнить это:

  • Вы устанавливаете k = 3
  • Вы звоните mykNN(X, y, k), что означает, что в mykNN(), x_ == 3.
  • Вывызов euclideanDistance(X[i], x_), что означает, что в euclideanDistance(), id2 == 3.
  • Вы пытаетесь индексировать id2 в указанной строке.Целые числа не могут быть проиндексированы, таким образом, исключение.

Так вот что стало причиной вашей ошибки.Поскольку я точно не знаю, что делает ваш код, я не могу напрямую рекомендовать исправление.

...