计算智能——K-means聚类算法的原理和实现(C语言)
算法定义
k-means聚类算法是一种迭代求解的聚类分析算法。,
k均值聚类是最著名的划分聚类算法,由于简洁和效率使得他成为所有聚类算法中最广泛使用的。给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。
算法原理
k-means算法首先选取k个点作为初始的聚类中心,然后计算各个样本到各聚类中心的距离,把每个样本归入离它最近的那个聚类中心所在的类; 调整后的新类计算新的聚类中心,如果相邻两次的聚类中心没有任何变化,这说明数据对象调整结束,聚类准则函数f已经收敛。在每次迭代过程中都要考察每个样本的分类是否正确,若不正确,就要调整。在全部数据调整完后,再修改聚类中心,进入下一次迭代。如果在某一次迭代算法中,所有的数据 对象被正确分类,则不会有调整,聚类中心也不会有任何变化,这标志着f已经收敛,算法结束。该算法可分为四个步骤
- 选定k个中心点,选定n个样本,输入这些样本。
- 为每个样本找到距离其最近的中心点(寻找组织),距离同一中心点最近的点为一个类,这样完成了一次聚类。
- 判断聚类前后的样本点的类别情况是否相同(及两次聚类的平方误差是否相同),如果相同,则算法结束,否则进入第四步。
- 针对每个类别中的样本点,计算这些样本的中心点,以此作为该类新的中心点,继续第二步。
算法流程图
算法实现
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include <time.h>
#define max 100
typedef struct
{
float x;
float y;
}Point;
Point point[max];
Point mean[max]; /// 保存每个簇的中心点
int center[max]; /// 判断每个点属于哪个簇
int Num;
int K;
//获得两点间直线距离
float getDistance(Point point1, Point point2)
{
float d;
d = sqrt((point1.x - point2.x) * (point1.x - point2.x) + (point1.y - point2.y) * (point1.y - point2.y));
return d;
}
// 计算每个簇的中心点 把归属于该中心点的点相加除以点数
void getMean(int center[max])
{
Point tep;
int i, j, count = 0;
for(i = 0; i < K;