【问题标题】:MATLAB: More efficient code for withincluster dissimilarity functionMATLAB:集群内相异函数的更高效代码
【发布时间】:2014-04-13 09:16:12
【问题描述】:

我对 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

【问题讨论】:

  • 也与我们分享调用脚本吗?至少是函数输入的大小?
  • 首先我在 20x3 数值矩阵上使用 K-means 保持编号。簇数为 2。
  • 然后我使用了kmeans返回的IDX(索引数组)和C(簇质心)作为WIC的输入参数
  • 您的代码错误,因为 W 在每个循环步骤中都会被覆盖。

标签: matlab cluster-analysis


【解决方案1】:

为什么?

这个度量在很大程度上是无用的统计;它只在 k-means 中有意义。然后最好在分配对象时对平方偏差求和,而不是在最后再次重新计算。

【讨论】:

    【解决方案2】:

    如果我正确理解您的问题,您希望为每个聚类计算距离聚类中心的欧几里得距离平方和(平均?)。

    除了将输出分配给 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-03
      • 2020-07-01
      • 2012-04-18
      • 1970-01-01
      相关资源
      最近更新 更多