python中用户之间的交叉相似性

时间:2017-05-24 07:53:14

标签: python

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

我的目标是在GroupA中找到组B中最相似的1000个用户以及我想用l确定的方式。有没有更有效的方法来实现它,特别是当GroupB的大小增加时?

CrossSimilarity

2 个答案:

答案 0 :(得分:0)

这实际上取决于Similarity函数以及需要多长时间。我希望它会在很大程度上支配你的运行时,但是没有运行时配置文件,很难说。我只有一些一般的建议:

  • 看看你如何计算Similarity,以及你是否可以通过一次性完成A组或B组中的每个人而不是从头开始来改进过程。
  • 您可以执行一些微观优化:例如,+=会更快一些。在外部循环中缓存CustomerB_id。您可能会以相同的方式从相似性函数中挤出一些时间。但我不认为这个时间很重要。
  • 如果您的代码使用的是纯Python并且CPU很重,您可以尝试通过CPython进行编译,或者在Pypy中运行而不是使用标准Python。

答案 1 :(得分:0)

由于你所做的基本上是两个列表(UserGroupA和UserGroupB)之间的矩阵乘法,在内存中执行它的更有效和最快的方法,可能是使用提供该函数的scikit-sklearn模块: p>

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

显然X = UserGroupA和Y = UserGroupB,在公制字段中,您可以使用sklearn的默认相似性度量或传递自己的。

它将返回距离矩阵D,然后D_ {i,k}是X的第i个数组与Y的第k个数组之间的距离。

然后,为了找到排名前1000的类似用户,您可以简单地转换列表中的矩阵并对其进行排序。

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