【发布时间】:2014-12-23 20:58:16
【问题描述】:
我使用的算法要求每个示例都有一个矩阵,比如Xi,即ai x b,对于每个O(n^2) 示例对,我发现每一行之间的差异Xiu - Xjv ,然后对外积sum_u sum_v np.outer(Xiu - Xjv, Xiu - Xjv)求和。
不幸的是,这个内部双和相当慢,并导致运行时间在大型数据集上失控。现在我只是使用 for 循环来做到这一点。有没有一些pythonic方法来加速这个内部操作?我一直在想一个,但没有运气。
为了澄清,对于每个n 示例,都有一个矩阵Xi,其维度为ai x b,其中ai 对于每个示例都不同。对于每一对(Xi, Xj),我想遍历两个矩阵之间的所有O(ai * bi)对行并找到Xiu - Xjv,将其外积与自身np.outer(Xiu - Xjv, Xiu - Xjv)相乘,最后将所有这些外积相加。
例如:假设 D 是 [[1,2],[3,4]],我们只是对两个矩阵都使用它。
然后,即一步可能是np.outer(D[0] - D[1], D[0] - D[1]),这将是矩阵[4,4],[4,4]。
很简单,(0,0) 和 (1,1) 只是 0 个矩阵,而 (0,1) 和 (1,0) 都是 4 个矩阵,所以对所有四个外积的最终总和应该是[[8,8],[8,8]]。
【问题讨论】:
-
我建议添加一个具体的例子——它将帮助更多的人理解这个问题。
-
你真的想要所有向量对之间的平方欧几里得距离吗?因为有捷径。
-
不,与平方欧几里得距离相反——外积。例子来了。
-
我明白了。我不禁想到必须在代数而不是实现层面对此进行简化。
-
请注意
a^T (b c^T) d = (a^T b) (c^T d)和sum_i v_i = 1^T v。你应该可以从那里拿走它。
标签: python optimization numpy