Найти похожие строки на основе смешанных типов данных в панде - PullRequest
0 голосов
/ 01 июля 2019

Текущий набор данных пользователей выглядит следующим образом. Для любого нового пользователя, который присоединяется, мне нужно найти наиболее похожего пользователя в наборе данных. enter image description here

Ранее я пыталсясоздание разреженной матрицы с помощью команды pivot для одной конкретной функции, а затем с использованием метода corrwith.Как я могу сделать это, принимая во внимание все функции одновременно?Все, что мне нужно, это id существующего пользователя.

1 Ответ

0 голосов
/ 01 июля 2019

Вы можете найти euclidean distance между вашим новым пользователем и всеми существующими пользователями во фрейме данных и использовать его как меру различия между ними. И, наконец, вернуть пользователя с минимальным отличием. Однако мы должны убедиться, что все ваши функции нормализованы, поскольку мы не хотим, чтобы функции, измеренные в более широких диапазонах, превосходили возможности, измеренные в более мелких диапазонах.

import pandas as pd
import numpy as np
from sklearn import preprocessing

scaler = preprocessing.Normalizer()

df = df_original.drop(["id"], axis=1)          # we don't want `id` to participate in dissimilarity measure
scaled_data = scaler.fit_transform(df)
df_scaled = pd.DataFrame(scaled_data, columns= df.columns)

new_user_original = np.array([999999, 50, 1, 72, 160, 4, 2, 5])   
new_user = new_user_original[1:len(new_user_original)]
new_user_scaled = scaler.transform(np.expand_dims(new_user, axis=0))

dist_df = pd.DataFrame(columns=["index", "similarity"])

for _, i in df_scaled.iterrows():
    dist = np.linalg.norm(i-np.squeeze(new_user_scaled,0))
    dist_df.loc[_,:] = [_, dist]


df_original.loc[_,:] = new_user_original          # we are appending the new user to the original df
index_most_similar = df_original.loc[dist_df.similaity.idxmin(),"id"]  

Надеюсь, это поможет!

...