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