【发布时间】:2016-11-24 08:27:00
【问题描述】:
我有兴趣对大型数据矩阵的不同随机采样子集执行统计,现在我的代码中的一个瓶颈是实际的子采样。这对我来说似乎很奇怪,因为对子采样数据有相当多的 O(N^2) 距离计算。我根本没有修改子样本,只是看着它们。
using Distributions, Distances
function test_subsetting(X; batch_size=500, nloops=100)
nfeatures, nsamples = size(X)
ref_samples = X[:,1:10]
batch_inds = zeros(batch_size)
batch = zeros(nfeatures,batch_size)
d_matrix = zeros(batch_size,batch_size)
for i = 1:nloops
batch_inds = sort(sample(1:nsamples, batch_size, replace = false))
batch = X[:,batch_inds]
d_matrix = pairwise(SqEuclidean(), batch, ref_samples)
end
end
当我在 5000 个特征乘 50000 个样本矩阵上对其进行测试时:
X_test = randn(5000,50000);
我发现我在_unsafe_getindex 中花费了大约一半的时间在multidimensional.jl 中,另一半在计算距离。
有没有更有效的方法来解决这个问题?
【问题讨论】:
-
如果您首先完全打乱矩阵 X,然后从中绘制后续批次的
n列(如果需要,一旦到达末尾就重新打乱它),那么这可以加快速度。你也可以考虑并行化事情。这种采样非常适合一次在多个工作人员上运行此功能。 -
并行化是一个有趣的想法,但是我在每个批次上运行的统计信息会影响下一轮下一批的统计信息(抱歉,这在我的示例中不清楚),所以我不要认为它是微不足道的并行化。理想情况下,我想将其扩展到内存无法容纳的东西,所以我不重新洗牌是要走的路。
-
我想我确实需要创建
batch,或者可能是一个替代品,它实际上并不为新数组分配新内存,而是将数据保存在X中并伪造它-- 我收集了sub和view做这样的事情,但我无法让他们使用distances.jl的pairwise函数。 -
重新并行化 - 至少您可以让一个进程生成样本,另一个进程分析它们。
-
不错,这是个好主意。