【C++】Keans聚类算法的C++实现

来源:互联网 发布:怎么打理淘宝店铺 编辑:程序博客网 时间:2024/05/21 22:05

Kmeans算法的实现步骤:
1、从D中随机取k个元素,作为k个簇的各自的中心。
2、分别计算剩下的元素到k个簇中心的相异度(元素到簇中心的欧氏距离),将这些元素分别划归到相异度最低的簇。
3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。
4、将D中全部元素按照新的中心重新聚类。
5、重复第4步,直到聚类结果不再变化。
6、将结果输出。

include "stdafx.h"#include <iostream>#include <vector>#include <string>#include <fstream>#include <sstream>#include <cmath>#define k 3using namespace std;const int data[11][2]={{2,10},{2,5},{8,4},{5,8},{7,5},{6,4},{1,2},{4,9},{7,3},{1,3},{3,9}};//坐标点结构体struct Sample{    int x;    int y;};int getDistance(Sample pt1, Sample pt2){    return (pt1.x-pt2.x)*(pt1.x-pt2.x)+(pt1.y-pt2.y)*(pt1.y-pt2.y);}int getCluster(Sample means[], Sample point){    int temp=0;    int label=0;    int distance=getDistance(means[0], point);    vector<Sample> cluster[k];     for(int i=1; i<k; i++)    {        temp=getDistance(means[i], point);        if(temp<distance)        {            distance=temp;            label=i;        }    }    return label;}Sample getMeans(vector<Sample> cluster) //cluster contains all points in the cluster{    float meansX=0;    float meansY=0;    Sample newMean;    int num=cluster.size();    for(int i=0; i<num; i++)    {        meansX+=cluster[i].x;        meansY+=cluster[i].y;    }    newMean.x=meansX/num;    newMean.y=meansY/num;    return newMean;}float getVar(vector<Sample> clusters[],Sample means[]){    float var = 0;    for (int i = 0; i < k; i++)    {        vector<Sample> pt = clusters[i];        for (int j = 0; j< pt.size(); j++)        {            var += getDistance(pt[j],means[i]);        }    }    return var;}void Kmeans(const int data[11][2]){    Sample means[k];     vector<Sample> cluster[k];     for(int i=0; i<k; i++)     {        means[i].x=data[i][0];        means[i].y=data[i][1];    }    Sample pt;    int label=0;    for(int i=0; i<11; i++)    {        pt.x=data[i][0];        pt.y=data[i][1];        label=getCluster(means, pt);         cluster[label].push_back(pt);     }    float oldVar=-1;    float newVar=getVar(cluster,means);    while(newVar!=oldVar)     {        for(int i=0; i<k; i++)        {            means[i]=getMeans(cluster[i]);         }        oldVar = newVar;        newVar = getVar(cluster,means);         for(int i=0; i<k; i++)        {            cluster[i].clear();         }        for(int i=0; i<11; i++)        {            Sample pt;            pt.x=data[i][0];            pt.y=data[i][1];            label=getCluster(means, pt);             cluster[label].push_back(pt);         }        for(label=0; label<3; label++)        {            cout<<"第"<<label+1<<"个簇中的元素是:"<<endl;            vector<Sample> pt;            pt=cluster[label];            for(int i=0; i<pt.size(); i++)            {                cout<<"("<<pt[i].x<<","<<pt[i].y<<")"<<"    "<<endl;            }        }    }}int main(){    Kmeans(data);}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 尿不尽刺痛带血怎么办 狗狗拉肚子拉血怎么办 肾血肿怎么办才吸收快 体检尿蛋白高3怎么办 肾炎会引起脸肿怎么办 12小孩尿蛋白3是怎么办 肝癌介入手术后肝功能不好怎么办 屁多且臭便秘怎么办 肝癌术1年后复发怎么办 怀孕便秘怎么办或大便太干拉不出 肠鸣便秘怎么办多尿 奥司他韦过量怎么办 憋的时间长尿痛怎么办 手过敏了怎么办最简单 肾结石不痛但是有血尿怎么办 儿童医院血液科挂不到号怎么办 搬完重物手抖怎么办 弯腰搬重物腰疼怎么办 搬了重物后腰疼怎么办 例假不走公务员体检血尿怎么办 憋尿久了尿不出来怎么办 憋尿引起的总有尿意怎么办 如果孕妇憋尿了怎么办 孕妇憋尿半个月怎么办 尿憋久了排空后膀胱疼怎么办 胸疼肚子疼不规则流血怎么办 上小便下面会痛怎么办 两岁宝贝憋尿怎么办 打激素脸胖了怎么办 医生写的病历看不懂怎么办 怀孕尿蛋白3个加怎么办 两周岁宝宝牙齿坏掉怎么办 前列缐炎引起尿血怎么办 牙齿牙根长在神经里怎么办 牙齿杀完神经牙根发炎怎么办 牙齿有大洞好疼怎么办 大门牙有蛀牙了怎么办 大门牙蛀牙黑了怎么办 大门牙蛀牙有洞怎么办 大门牙的缝蛀了怎么办 最里面的牙烂了怎么办