python中用户间的交叉相似性

2024-04-19 04:08:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含1000个用户的用户组列表UserGroupA=[CustomerA_id1,CustomerA_id2 ....]和包含10000个用户的用户组列表UserGroupB=[CustomerB_id1,CustomerB_id2 ...],我有一个为来自UserGroupAUserGroupB的任意两个用户定义的相似性函数 Similarity(CustomerA_id(k),CustomerB_id(l))其中kl是组A和B中用户的索引

我的目标是找到B组和A组中最相似的1000个用户,以及我想用CrossSimilarity来确定这一点的方法。有没有更有效的方法,尤其是当GroupB的规模增加时?你知道吗

  CrossSimilarity = None * [10000]
  for i in range(10000):
    for j in range(1000):
      CrossSimilarity[i] = CrossSimilarity[i] + Similarity(CustomerA_id[k],CustomerB_id[i])
  CrossSimilarity.sort() 

Tags: 方法用户inid列表forid2similarity
2条回答

由于您所做的基本上是两个列表(UserGroupA和UserGroupB)之间的矩阵乘法,因此在内存中执行此操作的更高效、最快的方法是使用提供以下功能的scikit sklearn模块:

sklearn.metrics.pairwise.pairwise_distances(X, Y, metric='euclidean')

其中,显然X=UserGroupA和Y=UserGroupB,在metric字段中,您可以使用sklearn的默认相似性度量,也可以传递自己的相似性度量。你知道吗

它将返回一个距离矩阵D,这样D{i,k}就是从X到第i个数组和从Y到第k个数组之间的距离

然后找到前1000个相似的用户,你可以简单地变换列表中的矩阵并对其排序。你知道吗

可能比您的解决方案更清晰,但应该更快:)

这实际上取决于Similarity函数以及它所花费的时间。我预计它将在很大程度上主导您的运行时,但如果没有运行时概要文件,就很难说了。我只有一些一般性的建议:

  • 看看你是如何计算Similarity的,以及你是否可以通过让a组或B组的每个人一次性完成而不是从头开始来改进这个过程。你知道吗
  • 你可以做一些微优化:例如+=会稍微快一点。在外循环中也缓存CustomerB_id。你可以用同样的方法从相似性函数中挤出一些时间。但我不认为这一次有什么意义。你知道吗
  • 如果您的代码使用的是纯python,并且占用大量CPU,那么可以尝试通过CPython编译,或者使用pypypy而不是标准python运行。你知道吗

相关问题 更多 >