Python 使用余弦相似度计算未分级项目

Python 使用余弦相似度计算未分级项目,python,pandas,recommender-systems,Python,Pandas,Recommender Systems,我想用这个方法计算具有余弦相似性的未分级项目 import numpy as np; import pandas as pd from sklearn.metrics.pairwise import cosine_similarity dff = pd.DataFrame(np.random.randint(0, 10, (5, 3))) temp = dff.copy() dff 0 1 2 0 8 0 4 1 6 9 4 2 5 0 5

我想用这个方法计算具有余弦相似性的未分级项目

import numpy as np; import pandas as pd
from sklearn.metrics.pairwise import cosine_similarity

dff = pd.DataFrame(np.random.randint(0, 10, (5, 3)))
temp = dff.copy()
dff
    0   1   2
0   8   0   4
1   6   9   4
2   5   0   5
3   5   9   4
4   9   4   8

cossim = cosine_similarity(dff) # calculate scores.
cossim

array([[1.  , 0.62, 0.95, 0.57, 0.92],
       [0.62, 1.  , 0.61, 1.  , 0.83],
       [0.95, 0.61, 1.  , 0.58, 0.95],
       [0.57, 1.  , 0.58, 1.  , 0.81],
       [0.92, 0.83, 0.95, 0.81, 1.  ]])
我想用余弦相似性分数计算0个值

for x in range(0,dff.shape[1]):
    indexes = dff.index[dff.loc[:,x]==0].tolist()
    for y in indexes:
        dff.loc[y,x] = (cossim[y]*temp.loc[:,x].to_numpy()).sum()
dff

    0   1   2
0   8   21.307945   4
1   6   9.000000    4
2   5   34.528532   5
3   5   9.000000    4
4   9   4.000000    8
我用两个for循环来计算它? 有什么类似于蟒蛇的计算方法吗

有测试数据(真实值)


所有零都转换为NaN

您的操作就是矩阵乘法。因此,您可以:

 # pass the numpy array instead of dataframe
 # also, you don't need to copy to temp 
 dff = dff.mask(dff==0, cossim @ dff.values)
输出:

   0         1  2
0  8  14.35119  4
1  6   9.00000  4
2  5  14.49324  5
3  5   9.00000  4
4  9   4.00000  8

为什么将
[3,1]
替换为
cossim[1]*dff.loc[:,1]…
?不应该是
cossim[3]*dff.loc[:,1]…
1。列值在cossim(1)中,因此
[4,1]
处的零将获得相同的值?不,它使用单元格的每个相似性分数计算分数。我使用2 for循环解决它,但我正在寻找一种pythonic方法。它在示例数据帧上工作,但在实际数据上,所有0值都转换为NaN。您的数据帧有列名吗?另外,您是否有一个行/列,其中全部为0/nan?是的,它有一个列名。我将测试数据添加到问题中,这就是问题所在。您可以传递numpy数组而不是数据帧。请参阅更新。我能问最后一件事吗:)我想从每个列中获取topK值(在我们更改的列中)。我复制数据帧来获取这些值(零值)。然后我计划从复制的数据帧获取它们的索引。例如,
1=>14.49和14.35
   0         1  2
0  8  14.35119  4
1  6   9.00000  4
2  5  14.49324  5
3  5   9.00000  4
4  9   4.00000  8