问题如下:
存在一个稀疏的dataframe,因此第一列是一个唯一字符串的列表。所有其他列都表示范围为0、1的数字列表,每个列表之和为1。
什么是获得列表中匹配分数的最佳方法。
最初,我打算使用corr()函数,但是正交(如果是正确的话)列出返回负数。
或者,可能是列表的乘积被其中一个列表的平方除以的过程(这总是返回一个正数)。
下面是一个示例:
unique names weight_1 weight_2
0 XY1052671234 0.000000 0.000000
1 XY1686846061 0.250000 0.000000
2 LM1962513674 0.250000 0.000000
3 LM1135334800 0.250000 0.000000
4 LM1292384960 0.250000 0.000000
... ... ...
6958 AB0558521263 0.000000 0.000000
6959 CDH42097CS44 0.000000 0.500000
6960 CDH42097CB19 0.000000 0.500000
6961 EF1046224884 0.000000 0.000000
6962 GH96122UAA25 0.000000 0.000000那么,获得0到1之间的比较分数的最佳方法是什么呢?
其中,0表示唯一名称之间没有关系,而1表示它们是相同的。
发布于 2022-05-11 08:24:41
“没有关系”意味着什么?
我的猜测是,您需要类似于行之间的余弦相似性,如果行相同,返回1;如果行没有共享的非零位置,则返回0。也就是说,你把这些行当作向量来处理,并计算它们之间的点积。
import pandas as pd
import numpy as np
#get matrix of weight columns
weight_cols = df.loc[:, df.columns != 'unique name'].to_numpy()
#normalize cols to sum-square to 1 so we get dot products between 0 and 1
normalized_cols = (weight_cols.T/np.linalg.norm(weight_cols, axis=1)).T
#take dot product of each row with itself
cosine_similarity_matrix = np.matmul(normalized_cols, normalized_cols.T)这将给出一个矩阵,其中每个索引i,j都是行i和行j之间的余弦相似性,例如,在i==j的对角线上得到1。
注意,由于矩阵是对称的,所以这是稍微低效率的,您只需要计算矩阵的右上(或左下)部分,但这不应该是一个问题,除非这将进入生产代码,该代码将持续运行,因为这只是~2减速的一个因素。
https://stackoverflow.com/questions/72197321
复制相似问题