我有一个包含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
答案 0 :(得分:0)
这实际上取决于Similarity
函数以及需要多长时间。我希望它会在很大程度上支配你的运行时,但是没有运行时配置文件,很难说。我只有一些一般的建议:
Similarity
,以及你是否可以通过一次性完成A组或B组中的每个人而不是从头开始来改进过程。+=
会更快一些。在外部循环中缓存CustomerB_id
。您可能会以相同的方式从相似性函数中挤出一些时间。但我不认为这个时间很重要。答案 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的类似用户,您可以简单地转换列表中的矩阵并对其进行排序。
可能比你的解决方案更清晰,但应该更快:)