http://stackoverflow.com/questions/1793532/how-do-i-determine-k-when-using-k-means-clustering
主要包括这么几种方法:计算模型的BIC;从一个较大值的k开始,不断去除质心即减少k的数目;从一个质心开始,不断分解各个簇,直到分配到各个簇的样本点符合高斯分布。
1 利用BIC
1.1 BIC
BIC的计算公式如下:
其中,N是数据集中的样本数目,k特征数目。BIC是对模型拟合程度和复杂度的一种度量方式,计算公式中的-2*ln(likehood)部分是对模型拟合度的度量,这个值越大,说明拟合程度越差。模型复杂度由ln(N)*k度量。
似然函数一般是通过概率计算的,即L(θ)=∏p(y|x;θ),是一个介于0到1的小数值,结合ln函数的图像可知ln(likehood)是一个负数,且似然函数越小,对应的就是一个绝对值越大的负数,所以-2*ln(likehood)越大,说明模型拟合度越差。
1.2 X-means方法确定k值
总体来说,X-means的过程如下:
Improve-Params环节就是运行kmeans算法直到收敛。
Improve-Structure环节是查看是否存在一个存在一个新的质心,并找打其位置。这一步通常是将已存在的质心,采用某种策略进行分裂。
1.2.1 之前已有的分裂策略
主要包括两种。
第一种,选取一个质心,在其附近生成一个新的质心,然后重新运行kmeans,查看新的模型是否性能更好(以某个评价标准进行评价,如BIC),如果新的模型性能更好,就接受新的质心,否则返回原有的模型。这种策略的问题在于,如何选择哪个质心进行分裂,如果选择的质心不能提升模型性能,接下来应当选取哪个质心。
第二种,依据某些启发式方法,选择一半的质心进行分裂,分裂后重新运行kmeans,查看模型质量,如果模型质量提高,就接受分裂。这种策略的问题在于启发式策略的选择,并且当只有一两个簇需要分裂时这种策略效果也不好。
1.2.2 X-means的策略
以上图中的数据为例进行说明。上图中是一个已经稳定的kmeans结果,并给出了各个簇之间的边界。X-means的过程大致如下:
1)对每个簇进行分裂,得到两个子簇。随机选定一个向量,将两个子簇沿着向量向两个方向一定距离,距离和子簇的大小成比例。然后在每个簇内进行一个k=2的聚类,注意是只在每个簇内部进行。
这里我有一些疑问:依据什么标准对每个簇内部的数据进行划分,为什么要沿着随机选定的向量进行移动?我觉得是不是可以直接在每个簇内部进行k=2的聚类?
2)对原簇和分裂成连个子簇后的簇进行评价,选定依据评价标准效果更好的方案。
****************
这个思路和Gmeans的大同小异,都是对一个簇进行判断,是否需要分裂,需要则分裂,不需要则保持原有簇。