首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >比较稀疏数据sparse的列

比较稀疏数据sparse的列
EN

Stack Overflow用户
提问于 2022-05-11 07:51:24
回答 1查看 51关注 0票数 0

问题如下:

存在一个稀疏的dataframe,因此第一列是一个唯一字符串的列表。所有其他列都表示范围为0、1的数字列表,每个列表之和为1。

什么是获得列表中匹配分数的最佳方法。

最初,我打算使用corr()函数,但是正交(如果是正确的话)列出返回负数。

或者,可能是列表的乘积被其中一个列表的平方除以的过程(这总是返回一个正数)。

下面是一个示例:

代码语言:javascript
复制
      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

那么,获得01之间的比较分数的最佳方法是什么呢?

其中,0表示唯一名称之间没有关系,而1表示它们是相同的。

EN

回答 1

Stack Overflow用户

发布于 2022-05-11 08:24:41

“没有关系”意味着什么?

我的猜测是,您需要类似于行之间的余弦相似性,如果行相同,返回1;如果行没有共享的非零位置,则返回0。也就是说,你把这些行当作向量来处理,并计算它们之间的点积。

代码语言:javascript
复制
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减速的一个因素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72197321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档