让我们有一个大小为N
的向量。例如:
x = rand(N,1)
我想计算向量中长度为K
的子集的最小标准偏差。
当N
和K
很小时,很容易找到最佳的子集,因为我可以使用nchoosek(N,K)
来枚举所有可能的子集。但是,当N
和K
的值大于让我们说N=50
和K=25
时,nchoosek
无法计算组合,因为可能的子集的大小是巨大的。
我想知道是否有更好的算法来计算有效地给出阵列中最小标准偏差的子集。例如通过动态编程。有什么想法吗?
更新:
我已经在答案中循环实现了它,并与组合解决方案进行了比较。结果总是一样的,但速度增益是前所未有的。
n = 20;
k = 10;
x = rand(n,1);
C = nchoosek(x, k);
tic
mins = realmax;
for i = 1:size(C,1)
s = std(C(i,:));
if s < mins
mins = s;
bestC = C(i,:);
end
end
toc
tic
[x2, j] = sort(x);
mins2 = realmax;
for i = 1:(n-k+1)
s = std(x2(i:(i+k-1)));
if s < mins2
mins2 = s;
idx = j((i:(i+k-1)));
end
end
toc
if mins == mins2
'Equal'
end
给出
Elapsed time is 7.786579 seconds.
Elapsed time is 0.002068 seconds.
ans =
Equal
答案 0 :(得分:3)
对数组进行排序,然后使用长度为K
的滚动窗口进行一次计算。
我确信这会给你正确的答案,如果我能证明的话就会想到。
手动的争论,“扩展这个”部分可能存在逻辑上的差距:
从列表中考虑一个元素x
。让我们试着找出包含这个元素的一组2的最小标准差。我们会选择x
和最接近x
的元素来实现此目的。将其扩展为k
个元素,我们将获得一个集合,该集合是包含x
的排序列表的连续部分。要选择k
元素的最小子集(即任何x
),我们只需按照前面的描述迭代排序列表。