我正在尝试从Sugar的论文中重现结果:
Catherine A. Sugar; Gareth M. James(2003)。 “查找数据集中的簇数:信息理论方法”。美国统计学会杂志98(1月):750-763
使用跳转方法进行聚类分析。 这是一个带有伪代码的WiKi-Pedia链接:https://en.wikipedia.org/wiki/Determining_the_number_of_clusters_in_a_data_set。
Matlab中的代码在这里:
load('iris.mat'); % data into X
p = size(X,2);
K = 1:10;
for k=K
disp(['Clustering with K = ' num2str(k) ' ...']);
[U, Z] = kmeans(X, k, 'emptyaction', 'singleton');
% compute distortion
for i=1:k
S = cov(X(U==i,:));
a = bsxfun(@minus, X(U==i,:), Z(i,:));
b = [b; sum(diag(a*inv(S)*a'))/sum(U==i)];
end
% average distortion per attribute
b = b / p;
d = [d; mean(b)];
end
figure, plot(K, d, '.:'); title('Distortion');
figure, plot(K(1:end-1), diff(d.^(-p/2)), '.:'); title('Jump Result');
现在,失真显示不均匀的递减函数,跳跃结果显示尖峰,有时在k = 8时出现最大值,甚至是负数。
我认为我在做错了。任何人都可以帮我解决代码中的错误吗?