使用BIC进行K均值聚类的最佳聚类数,(MATLAB)

时间:2017-09-28 16:07:33

标签: algorithm matlab cluster-analysis k-means bayesian

众所周知,在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 个答案:

答案 0 :(得分:1)

我可以看到一些可以解释您所报告行为的潜在问题:

1)我相信你使用的是一种不适合你的情况的健全公式

我不确定具体细节,但是来自wikipedia使用的特殊情况  \mathrm{BIC} = n \cdot \ln(\widehat{\sigma_e^2}) + k \cdot \ln(n) \ 只是合适的

  

假设模型误差或干扰是独立的,并且根据正态分布相同地分布,并且对数似然的导数相对于真实方差的边界条件为零

我还不熟悉该领域尚未知道第二个条件是否成立。查看以下原始X-means paper by Peleg and Moore中的公式(this answer),我可以看到他们没有将公式简化为您正在使用的公式(有关完整公式,请参阅其链接文章中的第4页。他们提出了一种更复杂的算法,在每次迭代时考虑每个质心及其区域对同一区域的几个质心,并使用BIC模型选择比较这两个模型。你必须改变论文中的公式来考虑如果你想保持你的方法,给定k的整个模型。

2)您混淆了两个不同背景的k

您将k-means算法中的k插入到公式的自由参数惩罚元素中。

来自wikipedia

  

{\displaystyle \mathrm {BIC} ={\ln(n)k-2\ln({\hat {L}})}}

     

,其中

     

[...]

     

* k =要估算的免费参数数量。

在第4页第二列顶部的above linked x-mean paper中,他们计算了k中带有d质心的k-means模型的自由变量数量 - 维度空间到是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中的1000个随机生成的点上运行它我得到了一个小于最大k(50)的最小化k: Plotted BIC for k=1:50 after changing the line of code to use k*3 as number of free variables