能力有限,只是表面上理解了公式和图所表达的内容
论文参见:点击打开链接
已有文章分析参见:点击打开链接
具体java代码实现:点击打开链接
核心应该是
分割前BIC分数 >分割后BIC分数 结论是 原簇可分割为两个新簇
图示如下
公式如下
公式含义参见代码具体内容
代码分析如下:
* 计算给定中心的BIC。
* * @参数k是簇的数量。
* * @参数n样本总数。
* * @参数d数据的维度。
* * @distortion集群的失真。
* * @clusterSize每个集群中采样的数量。
* * @返回BIC得分。
*/
private double bic(int k, int n, int d, double distortion, int[] clusterSize) {
double variance = distortion / (n - k);//平均损失度,可以理解为点与中心点距离的平均方差
double L = 0.0;
for (int i = 0; i < k; i++) {
L += logLikelihood(k, n, clusterSize[i], d, variance);
}
int numParameters = k + k * d;
return L - 0.5 * numParameters * Math.log(n);
}
对数似然函数
* *
* * @参数k是簇的数量。
* * @参数n样本总数。
* * @参数ni属于此群集的样本数。
* * @参数d数据的维度。
* * @variance 群集的估计方差。
* * @返回可能性估计
*/
private static double logLikelihood(int k, int n, int ni, int d, double variance) {
double p1 = -ni * LOG2PI;
double p2 = -ni * d * Math.log(variance);
double p3 = -(ni - k);
double p4 = ni * Math.log(ni);
double p5 = -ni * Math.log(n);
double loglike = (p1 + p2 + p3) / 2 + p4 + p5;
return loglike;
}