【发布时间】:2014-10-26 22:26:44
【问题描述】:
我有一个数据集如下:
数据 = [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(来自已发表的文章),ctrs 和 sumD 对于 k=3 如下:
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)
这给出了一个错误:'Start' 数组的第三个维度必须与 'replicates' 参数值匹配。
第二:
我创建了一个包含 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 Solver 相同或非常相似的结果?
【问题讨论】:
标签: matlab statistics k-means solver centroid