1.kmeans简介
虽然 k-means 并不能保证总是能得到全局最优解,但是对于这样的问题,像 k-means 这种复杂度的算法,这样的结果已经是很不错的了。
下面我们来总结一下 k-means 算法的具体步骤:
[1] 选定 K 个中心 \mu_k 的初值。这个过程通常是针对具体的问题有一些启发式的选取方法,或者大多数情况下采用随机选取的办法。因为前面说过 k-means 并不能保证全局最优,而是否能收敛到全局最优解其实和初值的选取有很大的关系,所以有时候我们会多次选取初值跑 k-means ,并取其中最好的一次结果。
[2] 将每个数据点归类到离它最近的那个中心点所代表的 cluster 中。
[3] 用公式 \mu_k = \frac{1}{N_k}\sum_{j\in\text{cluster}_k}x_j 计算出每个 cluster 的新的中心点。
[4] 重复第二步,一直到迭代了最大的步数或者前后的 J 的值相差小于一个阈值为止。
OPENCV中提供了kmeans具体的实现,这里就不介绍了。直接上代码。
Mat labels;
Mat center;
Mat p = Mat::zeros(pDoc->m_MatImage.cols*pDoc->m_MatImage.rows, 3, CV_32F); //初始化全0矩阵
for (int i = 0; i<pDoc->m_MatImage.cols