【发布时间】:2016-05-21 18:31:30
【问题描述】:
我有两个巨大的向量 item_clusters 和 beta。元素 item_clusters [ i ] 是项目 i 所属的集群 ID。元素 beta [ i ] 是给予项目 i 的分数。分数是 {-1, 0, 1, 2, 3}。
每当特定项目的分数为 0 时,我必须将其与属于同一集群的其他项目的平均非零分数进行估算。最快的方法是什么?
这是我迄今为止尝试过的。我将 item_clusters 转换为矩阵 clusters_to_items 使得元素 clusters_to_items [ i ][ j ] = 1 如果集群 i 包含项目 j,否则为 0。之后我运行以下代码。
# beta (1x1.3M) csr matrix
# num_clusters = 1000
# item_clusters (1x1.3M) numpy.array
# clust_to_items (1000x1.3M) csr_matrix
alpha_z = []
for clust in range(0, num_clusters):
alpha = clust_to_items[clust, :]
alpha_beta = beta.multiply(alpha)
sum_row = alpha_beta.sum(1)[0, 0]
num_nonzero = alpha_beta.nonzero()[1].__len__() + 0.001
to_impute = sum_row / num_nonzero
Z = np.repeat(to_impute, beta.shape[1])
alpha_z = alpha.multiply(Z)
idx = beta.nonzero()
alpha_z[idx] = beta.data
interact_score = alpha_z.tolist()[0]
# The interact_score is the required modified beta
# This is used to do some work that is very fast
问题是这段代码必须运行 150K 次,而且速度很慢。根据我的估计,运行需要 12 天。
编辑:我相信,我需要一些非常不同的想法,我可以直接使用 item_clusters,而不需要单独遍历每个集群。
【问题讨论】:
-
好吧,我将成为这里不受欢迎的孩子:Python 是一门很棒的语言,但是如果性能和它在这里一样重要,特别是如果你正在处理大量的原始数据,这是您花费大部分时间的热点,用 C 实现它。
-
你能找出哪一行代码花费的时间最多吗?
-
提示:查看numpy的
ufunc。
标签: python-3.x numpy scipy missing-data