Оптимизировать алгоритм K-Nearest Neighbours для 50 переменных x 100k набор данных строки - PullRequest
2 голосов
/ 24 сентября 2019

Я хочу оптимизировать фрагмент кода, который поможет мне вычислить ближайшего соседа для каждого элемента в данном наборе данных с 100 тыс. Строк.Набор данных содержит 50 переменных-столбцов, которые помогают описать каждый элемент строки, и большинство ячеек содержит значение вероятности в диапазоне от 0 до 1.

Вопрос: Я довольно плохо знаком с Python,но хотел бы знать, есть ли более продвинутые пользователи, которые могли бы порекомендовать какую-либо более лучшую структуру в приведенном ниже коде, которая поможет мне ускорить этот расчет.В настоящее время программа занимает очень много времени для завершения.Заранее спасибо!

import math
import numpy as np
import pandas as pd
from scipy.spatial import distance
from sklearn.neighbors import KNeighborsRegressor

df_set = pd.read_excel('input.xlsx', skiprows=0)

distance_columns = ["var_1",
                    ......,
                    ......,
                    ......,
                    "var_50"]

def euclidean_distance(row):
    inner_value = 0
    for k in distance_columns:
        inner_value += (row[k] - selected_row[k]) ** 2
    return math.sqrt(inner_value)

knn_name_list = []

for i in range(len(df_set.index)):

    numeric = df_set[distance_columns]
    normalized = (numeric - numeric.mean()) / numeric.std()
    normalized.fillna(0, inplace=True)
    selected_normalized = normalized[df_set["Filename"] == df_set["Filename"][i]]

    euclidean_distances = normalized.apply(lambda row: distance.euclidean(row, selected_normalized), axis=1)

    distance_frame = pd.DataFrame(data={"dist": euclidean_distances, "idx": euclidean_distances.index})
    distance_frame.sort_values("dist", inplace=True)

    second_smallest = distance_frame.iloc[1]["idx"]
    most_similar_to_selected = df_set.loc[int(second_smallest)]["Filename"]

    knn_name_list.append(most_similar_to_selected)

    print(knn_name_list)


df_set['top_neighbor'] = np.array(knn_name_list)

df_set.to_csv('output.csv', encoding='utf-8', sep=',', index=False)

Ответы [ 2 ]

1 голос
/ 24 сентября 2019

Я бы рекомендовал использовать NearestNeighbors .(установите n_jobs в -1, чтобы использовать все процессоры)

import numpy as np
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import normalize

#Loading data
df_set = ...

#Selecting numerical data
numeric = df_set[distance_columns]

#normelizing
normalized = normalize(numeric, norm='l1', axis=1, copy=True, return_norm=False)

#Initializing NearestNeighbors
neigh = NearestNeighbors(n_neighbors=5, metric='euclidean', n_jobs=-1)

#Fitting with normilized data
neigh.fit(normalized)
...
second_smallest = ...

#Getting Most similar to your selected data
most_similar_to_selected = neigh.kneighbors(second_smallest)
0 голосов
/ 25 сентября 2019

Чтобы дать вам другое представление о подходе @Amine, вы также можете включить в него PCA Transformation (https://scikit -learn.org / stable / modules / generate / sklearn.decomposition.PCA.html ).

Это будет работать так:

import numpy as np
from sklearn.neighbors import NearestNeighbors
from sklearn.preprocessing import normalize
from sklearn.decomposition import PCA 
#Loading data
df_set = ...

#Selecting numerical data
numeric = df_set[distance_columns]

#normelizing
normalized = normalize(numeric, norm='l1', axis=1, copy=True, return_norm=False)
#reduce number of compononents (here to 25)
pca = PCA(n_components=25)
pca.fit(normalized)  
pcanormalized = pca.fit_transform(normalized)               
#Initializing NearestNeighbors
neigh = NearestNeighbors(n_neighbors=5, metric='euclidean', n_jobs=-1)

#Fitting with normilized data
neigh.fit(pcanormalized)
...
second_smallest = ...

#Getting Most similar to your selected data
most_similar_to_selected = neigh.kneighbors(second_smallest)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...