我有一个数据集如下:
数据 = [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]
然后我继续:
[idx,ctrs, sumD] = kmeans(Data,3)
它给了我质心和 sumD(簇内点到质心距离的总和),例如:
ctrs = [5.6000 3.4000; 3.5000 10.2500; 9.2000 9.0000]
sumD = [6.4000; 13.7500; 18.8000]
而根据 Excel Solver(来自已发表的文章),对于 k=3 ctrs
,sumD
如下所示:
ctrs = [5.21815716 3.66736761; 3.615385665 10.461533; 9.47841197 8.75055345]
sumD = [5.151897802; 7.285383286; 8.573829765]
(注意:在那篇文章中,作者通过图中的视觉决策为每个集群提供了一个初始(种子)质心,例如 [4 4; 5 12; 10 6]。)
显然,Excel 会找到更准确ctrs
的值,从而找到更小的sumD
值。我无法用 Matlab 实现这一点。这就是我使用其他kmeans
函数参数的原因。我使用了“replicates”和“options”(MaxIter)以及“start”参数——即使是 3D 数组种子——也无济于事。我什至采用了文章中相同的初始种子到 Matlab。以下是我尝试但失败的方法:
第一的:
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、ctrs 和 sumD 值仍然与以前相同 - 就好像我运行了我的第一个函数一样以上(即[idx,ctrs, sumD] = kmeans(Data,3)
)。
我被困住了。我正在尝试使用 Matlab 验证文章中发布的 Excel 求解器的结果,因为那时我会将应用于文章中 14 个观察值的相同算法应用于包含 900 多个观察值的更大数据集。
我究竟做错了什么?我应该在我的编码中更正什么以获得与 Excel 求解器相同或非常相似的结果?