我有一个包含1000个用户的用户组列表UserGroupA=[CustomerA_id1,CustomerA_id2 ....]
和包含10000个用户的用户组列表UserGroupB=[CustomerB_id1,CustomerB_id2 ...]
,我有一个为来自UserGroupA
和UserGroupB
的任意两个用户定义的相似性函数
Similarity(CustomerA_id(k),CustomerB_id(l))
其中k
和l
是组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()
由于您所做的基本上是两个列表(UserGroupA和UserGroupB)之间的矩阵乘法,因此在内存中执行此操作的更高效、最快的方法是使用提供以下功能的scikit sklearn模块:
其中,显然X=UserGroupA和Y=UserGroupB,在metric字段中,您可以使用sklearn的默认相似性度量,也可以传递自己的相似性度量。你知道吗
它将返回一个距离矩阵D,这样D{i,k}就是从X到第i个数组和从Y到第k个数组之间的距离
然后找到前1000个相似的用户,你可以简单地变换列表中的矩阵并对其排序。你知道吗
可能比您的解决方案更清晰,但应该更快:)
这实际上取决于
Similarity
函数以及它所花费的时间。我预计它将在很大程度上主导您的运行时,但如果没有运行时概要文件,就很难说了。我只有一些一般性的建议:Similarity
的,以及你是否可以通过让a组或B组的每个人一次性完成而不是从头开始来改进这个过程。你知道吗+=
会稍微快一点。在外循环中也缓存CustomerB_id
。你可以用同样的方法从相似性函数中挤出一些时间。但我不认为这一次有什么意义。你知道吗相关问题 更多 >
编程相关推荐