我是Matlab的新手,这是我在给定数据集中的内部群集差异性的代码。
此代码效率非常低,我的计算机几乎崩溃,无法在30x4 dataset
上运行。
任何人都可以帮我提供更好的版本吗?
这是我用过的代码。
function [W] = WIC( X , IDX , N , C )
W = zeros( N , 1 );
kclas = unique(IDX);
count = histc( IDX(:) , kclas );
for i =1:N
for j=1:length(X)
while IDX(j)==i
W = sum( ( X(j,:) - C(i,:) ).^2 );
end
end
end
W = W .* count;
end
的
答案 0 :(得分:0)
如果我正确理解了你的问题,你希望,对于每个聚类,计算与聚类中心的欧几里德距离的平方和(平均值?)。
除了将输出分配给W
(W(i)=...
)的元素之外,没有无限循环(while
循环将永不运行或永不完成),您可能希望看看矢量化。幸运的是,有一些很好的功能,例如accumarray
%// IDX: cluster index
%// X: array of data points
%// C: cluster centers
%// N: number of clusters
totalSumOfSquares = accumarray(IDX,(1:N)',[],...
@(id) sum(sum( bsxfun( @minus, X, C(id,:) ).^2,2),1));
如果您想要平均距离,请将第一个sum
替换为mean
。
答案 1 :(得分:0)
为什么?
这项措施在很大程度上是无用的统计数据;它只在k-means中有意义。然后最好通过对正方形偏差进行求和来计算,而不是在再次重新计算。。