Я хочу понять наиболее эффективный в вычислительном отношении способ реализации этого алгоритма 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)