pandas- 协同过滤-cosine

432 阅读1分钟
import pandas as pd
import numpy as np
data = pd.DataFrame({'one': [4, np.nan, 2, np.nan],
                     'two': [np.nan, 4, np.nan, 5],
                     'three':[5, np.nan, 2, np.nan],
                     'four':[3, 4, np.nan, 3],
                     'five':[5, np.nan, 1, np.nan],
                     'six':[np.nan, 5, np.nan, 5],
                     'seven':[np.nan, np.nan, np.nan,4]},
                      index = list('ABCD'))
data
five four one seven six three two
A 5.0 3.0 4.0 NaN NaN 5.0 NaN
B NaN 4.0 NaN NaN 5.0 NaN 4.0
C 1.0 NaN 2.0 NaN NaN 2.0 NaN
D NaN 3.0 NaN 4.0 5.0 NaN 5.0
data_center = data.apply(lambda x: x - x.mean(), axis = 1)
data_center
five four one seven six three two
A 0.750000 -1.250000 -0.250000 NaN NaN 0.750000 NaN
B NaN -0.333333 NaN NaN 0.666667 NaN -0.333333
C -0.666667 NaN 0.333333 NaN NaN 0.333333 NaN
D NaN -1.250000 NaN -0.25 0.750000 NaN 0.750000
from sklearn.metrics.pairwise import cosine_similarity
sim_AB = cosine_similarity(data_center.loc['A', :].fillna(0).values.reshape(1, -1),
                           data_center.loc['B', :].fillna(0).values.reshape(1, -1))
sim_AB
array([[0.30772873]])
sim_AC = cosine_similarity(data_center.loc['A', :].fillna(0).values.reshape(1, -1),
                           data_center.loc['C', :].fillna(0).values.reshape(1, -1))
sim_AC
array([[-0.24618298]])
sim_AD = cosine_similarity(data_center.loc['A', :].fillna(0).values.reshape(1, -1),
                           data_center.loc['D', :].fillna(0).values.reshape(1, -1))
sim_AD
array([[0.56818182]])
(sim_AD*data.loc['D', 'two'] + sim_AB*data.loc['B', 'two'])/(sim_AD + sim_AB)
array([[4.64867562]])