Сравнить несколько массивов в кНН - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь получить точность моего kNN для разных значений k. Массив A является результатом трех различных значений k. Я хочу сравнить для каждого необработанного в A с B и вернуть значение точности для каждого. Это мой код,

import numpy as np

A = [[1, 0, 0, 1, 1, 1, 1, 1, 1, 0], [1, 0, 0, 1, 1, 1, 0, 1, 0, 0], [1, 0, 0, 0, 1, 1, 0, 1, 1, 1]]
B = [1, 0, 0, 1, 0, 1, 0, 1, 1, 1] 

predictions = np.array(A)
y_test = np.array(B)


def getAccuracy(y_test, predictions):
    correct = 0
    w = []
    for i in range(predictions.shape[0]): # I want to compare for each raw in A with B
        for x in range(len(y_test)):
            if y_test[x] == predictions[i,x]:
                correct += 1
                acc = (correct/len(y_test)) * 100.0
        return acc


    return w.append(acc)

test = getAccuracy(y_test, predictions)
print(test)

Но я получаю вывод как 0.0. Спасибо за помощь в этом.

1 Ответ

0 голосов
/ 29 октября 2018

для двоичной классификации вам не нужно сравнивать значения, это можно легко сделать с помощью простого добавления:

A = [[1, 0, 0, 1, 1, 1, 1, 1, 1, 0], [1, 0, 0, 1, 1, 1, 0, 1, 0, 0], [1, 0, 0, 0, 1, 1, 
0, 1, 1, 1]]
B = [1, 0, 0, 1, 0, 1, 0, 1, 1, 1] 

predictions = np.array(A)
y_test = np.array(B)

for c in A:
    acc = sum([((x*y)+(x-1)*(y-1)) for x,y in zip(c,B)])/len(B)
    print(acc)
>>>0.7
>>>0.7
>>>0.8

так почему ((x*y)+(x-1)*(y-1)) работает. хорошо, если вы попробуете четыре случая: (0,0),(0,1),(1,0),(1,1) вы увидите, что для тех, где классы разные, каждая часть суммы равна 0, а для тех, где классы равны, только одна часть суммы равна не равно 0 и равно 1. Таким образом, для каждого шага он ставит 1, если классы равны, и 0 в противном случае.

Это маленький трюк, который значительно ускоряет вычисление точности.

...