大家都知道,在k-均值聚类中,我们可以使用贝叶斯信息准则(bic)来找出最佳的聚类数目。根据bic评分方案,最小化bic评分的k是最优的聚类数。
BIC的公式如下:BIC(C) = n*ln(RSS/n) + k*ln(n)
其中n是数据集中的数据点数量,k是集群数量。
RSS是残差平方和,其中我们求出每个数据点到其自身簇的质心的距离之和。
我们的数据包含3100个点,每个点有两个元素y=(x1,x2)(每个条目有两个特性)。
我在Matlab中的代码如下:
BIC=[];% Bayesian Information Criterion
n=3100; % number of datapoints
temp=1;
for k=1:50 % number of clusters
RSS=0; % residual sum of squares
[idx,C]=kmeans(y,k); % Matlab command for k-mean clustering
for i=1:3100
RSS=RSS+sqrt((y(i,1)-C(idx(i),1))^2+(y(i,2)-C(idx(i),2))^2);
end
BIC(temp)=n*log(RSS/n)+k*log(n);
temp=temp+1;
end
[p,l]=min(BIC);
plot(BIC)
但在我的代码中肯定有问题,我不能说什么我的意思是如果我们让k从1到100,那么最小化bic的k就是100。如果我们让k从1到1000,那么最小化bic的k将是1000,以此类推。
但据我所知,应该有一个特定的k来最小化bic。
谢谢你的帮助
最佳答案
我可以看到一些潜在的问题可以解释你所报告的行为:
1)我相信你用的是一种不适合你的配方
我不确定具体细节,但从使用
只适合
假设模型误差或扰动是独立的,且均服从正态分布,且对数似然对真方差的导数为零的边界条件下
我对这一领域的知识还不清楚第二个条件是否成立。看看下面(wikipedia)的原始X-means paper by Peleg and Moore中的公式,我可以看到它们没有将公式缩减为您正在使用的公式(有关完整公式,请参见链接文章的第4页)请注意,他们提出了一个更复杂的算法,在每次迭代时考虑每个质心及其区域相对于同一区域的几个质心,并使用BIC模型选择对这两个模型进行比较如果你想保持你的方法的话,你必须改变论文中的公式来考虑给定k的整个模型。
2)您混淆了两种不同上下文的k
将k-means算法中的k
插入公式的自由参数惩罚元素。
从this answer
在哪里?
[…]
*k
=要估计的自由参数数。
在第4页第二列顶部的wikipedia中,他们计算k-means模型的自由变量数量,其中k
的质心在d
维度空间中为k(d+1)
,在您的例子中,它给出3k
而不是k
。
更改行中的代码
BIC(temp)=n*log(RSS/n)+k*log(n);
进入之内
BIC(temp)=n*log(RSS/n)+(k*3)*log(n);
并且在2D i上的1000个随机生成点上运行它,使得k小于最小k(50):
above linked x-mean paper