Наиболее эффективная векторизованная реализация алгоритма K-ближайших соседей - PullRequest
0 голосов
/ 20 февраля 2020

Я хочу понять наиболее эффективный в вычислительном отношении способ реализации этого алгоритма K-Nearest-Neighbours.

У меня есть одна функция calc_distance, которая вычисляет евклидово расстояние между наблюдением в наборе испытаний и каждым наблюдением в обучении. Функция принимает Pandas данных в качестве входных данных. Затем я нахожу k ближайших таких расстояний, беру значения y их соответствующих наблюдений и усредняю ​​их. Это значение становится моим yhat, моим прогнозом y для этого наблюдения с учетом алгоритма. В функции nneighbor я использую понимание списка, чтобы запустить эту функцию для всего набора тестов и вернуть список yhats.

Является ли это наиболее эффективным способом реализации алгоритма? В частности, есть ли векторизованная реализация, которую я мог бы использовать вместо понимания списка в nneighbor (), который я использую ниже?

Любая критика / рекомендации по форме кода в дополнение к этому также были бы полезны.


def calc_distance(instance, x_train, y_train, y_test, k, L):

    x_train_internal = x_train.copy()

    x_train_internal['combined'] = x_train_internal.values.tolist()

    x_train_internal['distance'] = x_train_internal['combined'].apply(lambda x: distance(x, instance, L))

    k_closest = y_train[x_train_internal.sort_values('distance')[:k].index]

    yhat = k_closest.mean()
    return(yhat)


def nneighbor(x_train, x_test, y_train, y_test, k, L):

    yhats = [calc_distance(instance, x_train, y_train, y_test, k, L) for instance in x_test.values]

    return(yhats)
...