Как я могу улучшить этот алгоритм Knn? - PullRequest
0 голосов
/ 21 июня 2020

Я пытался разработать KNN с нуля до данных Iris, но занялся спетом - очень запутанный для новичка. Не могли бы вы уделить минуту, чтобы помочь мне исправить эту ошибку IndexError: индекс 4 выходит за границы оси 0 с размером 4 ? Большое спасибо

Я хотел применить 13 тыс. Соседей, но не очень хорошо

from sklearn import datasets # import datasets
import numpy as np # import numpy
iris = datasets.load_iris() # load data 
X = iris.data # get features
y = iris.target # get targets

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

def euclidean_distance(row1, row2):
    distance = 0.0
    for i in range(len(row1)-1):
        distance += (row1[i] - row2[i])**2
    return sqrt(distance)

# Locate the most similar neighbors
def call_neighbors(X_train, X_test, num_neighbors):
    distances = list()
    for train_row in X_train:
        dist = euclidean_distance(X_test, train_row)
        distances.append((X_train, dist))
    distances.sort(key=lambda tup: tup[1])
    neighbors = list()
    for i in range(14):
        neighbors.append(distances[i][0])
    return neighbors
neighbors = call_neighbors(X_train, X_test, 13)
for neighbor in neighbors:
    print(neighbor)
# Make a classification prediction with neighbors
def predict_classification(train, test_row, num_neighbors):
    neighbors = get_neighbors(X_train, X_test, 13)
    output_values = [row[-1] for row in neighbors]
    prediction = max(set(output_values), key=output_values.count)
    return prediction

1 Ответ

0 голосов
/ 21 июня 2020

dist = euclidean_distance(X_test, train_row)

Кажется, что X_test и train_row имеют разный размер.

Попробуйте распечатать форму массивов, используя

print(X_test.shape, train_row.shape)

, и исправьте их соответственно

...