Реализация алгоритма КНН - PullRequest
1 голос
/ 02 февраля 2020

Я создаю свою собственную реализацию KNN. Хотя кажется, что все работает, точность, которую я получаю, довольно низкая по сравнению с KNN от sklearn (например, 0,68 против 0,96, протестированных на нескольких подходах). Я также использую 5-кратную перекрестную проверку. Самая важная часть моего кода выглядит следующим образом:

def knn(X, y, Z, k):
    mod_lst = []
    for i in range(Z.shape[0]):
        distance = []
        for j in range(X.shape[0]):
            distance.append(np.linalg.norm(X.iloc[j] - Z.iloc[i]))
        mod_lst.append(modde(distance,y,k))
    return mod_lst

def modde(ret,y,k):
    '''sorting distances in ascending order'''
    dic = {i: ret[i] for i in range(0, len(ret))}
    dic1 = {r: v for r, v in sorted(dic.items(), key=lambda item: item[1])}
    ind = [dic1.keys()]

    a = list(dic1.keys())
    '''sorting y (labels) in ascending order'''
    d = [x for _, x in sorted(zip(a,y))]

    d = d[:k]
    d = list(map(int, d))
    modw = statistics.mode(d)

    return modw

Где:

k = 5
X - training set (data, a nxm matrix of points in R^m)
y - training set (labels, 1xn array of zeros, ones, etc)
Z - testing set

Почему мои результаты отличаются от результатов реализации scikit-learn?

1 Ответ

0 голосов
/ 03 февраля 2020

Довольно сложно ответить на ваш вопрос. Прежде всего, реализация Scikit-learn имеет оптимизацию времени выполнения и содержит сложную реализацию.

Реализация KNN (классификатор) здесь здесь . Я рекомендую вам прочитать реализацию, поскольку включена новая функция чтения кода github, и за реализацией библиотеки легко следить.

Например, отметьте здесь как они определяют расстояние граф. Вы заметите, что их код немного отличается от вашего.

Кроме того, scikit-learn использует библиотеку scipy для вычисления некоторых метрик, например, расстояние между точками построено над scipy pdist () функция .

...