机器学习三-xmeans
能力有限,只是表面上理解了公式和图所表达的内容
论文参见:点击打开链接
已有文章分析参见:点击打开链接
具体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; }