K-means算法算是个著名的聚类算法了,不仅容易实现,并且效果也不错,训练过程不需人工干预,实乃模式识别等领域的居家必备良品啊,今天就拿这个算法练练手。
总结来说,这个算法的步骤如下:
1.随机选取样本中的K个点作为聚类中心
2.计算所有样本到各个聚类中心的距离,将每个样本规划在最近的聚类中
3.计算每个聚类中所有样本的中心,并将新的中心代替原来的中心
4.检查新老聚类中心的距离,如果距离超过规定的阈值,则重复2-4,直到小于阈值
那么,现在,我实现的程序的步骤也是按照上面一步一步来的,
为了方便,我直接在平面上随机产生n个点,选取前K个点作为聚类中心,
距离就定义为平面上的欧式距离,
然后为了形象化地观察过程和结果,我将过程以图像的方式显示。
代码如下:
首先是主体:
int iter_times = 0;//迭代次数
while(!good_result())//检查是否是需要的聚类中心
{
for(int i = 0;i < POINT_NUM;i++)
{
double min = 10000;
int min_k = 0;
for(int j = 0;j < K;j++)
{
double tmp = DIS(c[j].center,s[i].p);

本文介绍了K-means算法的步骤,并提供了C++和OpenCV实现的概述。通过随机选取样本点作为聚类中心,计算样本与中心的距离进行聚类,不断更新并检查聚类中心的变化,直至满足停止条件。程序可视化了聚类过程,展示出算法的运行效果。然而,K-means算法存在K值选择依赖经验和初始中心选择影响结果的问题。

1931

被折叠的 条评论
为什么被折叠?



