精品文档,仅供学习与交流,如有侵权请联系网站删除
【精品文档】第 1 页
K-Means算法
k-means 算法接受参数 k ;然后将事先输入的n个数据对象划分为 k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高;而不同聚类中的对象相似度较小。聚类相似度是利用各聚类中对象的均值所获得一个“中心对象”(引力中心)来进行计算的。
假设要把样本集分为c个类别,算法描述如下:
(1)适当选择c个类的初始中心;
(2)在第k次迭代中,对任意一个样本,求其到c个中心的距离,将该样本归到距离最短的中心所在的类;
(3)利用均值等方法更新该类的中心值;
(4)对于所有的c个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。
#include <iostream>
#include <>
#include <vector>
#define _NUM 3 //预定义划分簇的数目
using namespace std;
特征对象,表示一个元组,一个元组有两个数值属性
struct Tuple
int attr1;
int attr2;
获取两个特征对象之间的距离,在此以欧基米德距离作为距离度量标准
double getDistXY(Tuple t1, Tuple t2)
return sqrt(( - ) * ( - ) + ( - ) * ( - ));
计算簇的中心点,在此以簇中所有对象的平均距离来计算中心点
Tuple getMeansC(vector<Tuple> c)
int num = ();
double meansX = 0, meansY = 0;
Tuple t;
for (int i = 0; i < num; i++)
meansX += c[i].attr1;
meansY += c[i].attr2;
= meansX / num;
= meansY / num;
return t;
获取算法的准则函数值,当准则函数收敛时算法停止
double getE(vector<Tuple> classes[], Tuple means[])
double sum = 0;
for (int i = 0; i < _NUM; i++)
精品文档,仅供学习与交流,如有侵权请联系网站删除
【精品文档】第 2 页
vector<Tuple> v = classes[i];
for (int j = 0; j< (); j++)
sum += (v[j].attr1 - means[i].attr1)
K-Means聚类算法及实现代码 来自淘豆网m.daumloan.com转载请标明出处.