为什么Matlab K-means不能找到最佳质心,而Excel解算器却能找到?

为什么Matlab K-means不能找到最佳质心,而Excel解算器却能找到?,matlab,statistics,k-means,solver,centroid,Matlab,Statistics,K Means,Solver,Centroid,我的数据集如下: 数据=[412;510;87;53;54;211;54;38;62;74;108;89;109;1012] 然后我继续: [idx,ctrs, sumD] = kmeans(Data,3) 它给出了质心和sumD(簇内点到质心距离之和),如: 而根据Excel Solver(来自一篇发表的文章),CTR和sumD对于k=3如下所示: ctrs = [5.21815716 3.66736761; 3.615385665 10.461533; 9.47841197 8.75055

我的数据集如下:

数据=[412;510;87;53;54;211;54;38;62;74;108;89;109;1012]

然后我继续:

[idx,ctrs, sumD] = kmeans(Data,3)
它给出了质心和sumD(簇内点到质心距离之和),如:

而根据Excel Solver(来自一篇发表的文章),
CTR
sumD
对于k=3如下所示:

ctrs = [5.21815716 3.66736761; 3.615385665 10.461533; 9.47841197 8.75055345]

sumD = [5.151897802; 7.285383286; 8.573829765]
(注意:在那篇文章中,作者通过绘图的视觉判断为每个簇(如[4;5 12;10 6])给出了初始(种子)质心。)

显然,Excel可以找到更准确的
CTR
值,从而减小
sumD
值。我无法用Matlab实现这一点。这就是为什么我使用了
kmeans
函数的其他参数。我使用了'replicates'和'options'(MaxIter)以及'start'参数,即使使用3D数组种子,也没有用。我甚至采用了文章中相同的初始种子。以下是我尝试和失败的地方:

第一名:

opts = statset('MaxIter',100);
Seed = [4 4; 5 12; 10 6];
[idx,ctrs] = kmeans(Data,3,'Replicates',50,'options',opts,'start',Seed)
这会产生一个错误:“开始”数组的第三维必须与“复制”参数值匹配

秒:

opts = statset('MaxIter',100);
Seed = [4 4; 5 12; 10 6];
[idx,ctrs] = kmeans(Data,3,'Replicates',50,'options',opts,'start',Seed)
我创建了一个包含50页的3D数组,其中第一页是上面相同的初始种子,其余49页是随机的。我创建的随机页面如下所示:

T = rand(3,2,49); 
之后,我创建了50页的3D阵列,如下所示:

Seed2 = cat(3,Seed,T);
然后使用
kmeans

[idx,ctrs] = kmeans(Data,3,'Replicates',50,'options',opts,'start',Seed2)
但是,Matlab发出警告,指出由于在迭代1中创建了空集群,第一次复制之后的所有复制都被终止。此外,获得的idx、CTR和sumD值仍然与以前相同——就好像我运行了上面的第一个函数一样(即
[idx、CTR、sumD]=kmeans(数据,3)

我被卡住了。我试图使用Matlab验证文章中发布的Excel解算器的结果,因为接下来我会将应用于文章中14个观测值的相同算法应用于900多个观测值的更大数据集


我做错了什么?为了获得与Excel解算器相同或非常相似的结果,我应该在编码中更正哪些内容?

如何确定Excel值是正确的,而MATLAB kmeans给出的结果不太准确

使用下面的快速MATLAB脚本,我绘制了质心,至少在视觉上它看起来是正确的

Data = [4 12; 5 10; 8 7; 5 3; 5 4; 2 11; 5 4; 3 8; 6 2; 7 4; 10 8; 8 9; 10 9; 10 12];

plot(Data(:,1), Data(:,2),'ob','markersize', 10);
axis([min(Data(:,1))-2, max(Data(:,1))+2, min(Data(:,2))-2, max(Data(:,2))+2]);
hold on;

[idx,ctrs, sumD] = kmeans(Data,3);
plot(ctrs(:,1), ctrs(:,2), '*r', 'markersize', 10);


如果这不够精确,我们可以定义我们的kmean函数,而不是试图自定义MATLAB的kmeans。我在一段时间前已经实现了kmeans,要求matlab微调参数似乎更容易。

区别似乎在于所用距离度量的选择,而不是编码。在这种情况下,定义“距离”的方法不止一种

默认情况下,MATLAB使用。通过使用MATLAB结果手工计算,我可以复制您得到的
sumD
结果。然而,使用平方欧几里德距离度量和您在论文中给出的结果会得到更高的
sumD

如果我使用纯(非平方)欧几里德距离,我得到的
sumD
结果与本文相同。使用此测量值,MATLAB结果会为
sumD
返回更高的值


因此,这两个结果本身都不是错误的,它们只是用不同的方式测量“正确性”。

我猜OP得到了一个sumD明显更小的解决方案,现在想知道为什么Matlab没有找到它。例如,较低的红星可能更靠近右边和下面。(只是我的眼睛判断)你好,安诺普和特里里奥。谢谢你的回答。是的,从视觉上看,CTR的位置很相似。Matlab做的聚类与Excel解算器相同。然而,正如Triarion提到的,ctrs Matlab发现的结果不如Solver准确,因为Solver的sumD值比Matlab小(这意味着更好)。但是,我需要准确的CTR,因为当我将此算法反映到我的900+数据集时,会有许多我无法直观检测到的偏差,因为我的数据集很大,而且彼此非常接近。因此,集群将是错误的。文章的链接是: