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

news/2024/5/20 9:41:59 标签: 算法, Kmeans, 机器学习, 聚类

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 3

using 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);
}

http://www.niftyadmin.cn/n/781189.html

相关文章

python自定义html_python 学习笔记十二 html基础(进阶篇)

HTML超级文本标记语言是标准通用标记语言下的一个应用&#xff0c;也是一种规范&#xff0c;一种标准&#xff0c;它通过标记符号来标记要显示的网页中的各个部分。网页文件本身 是一种文本文件&#xff0c;通过在文本文件中添加标记符&#xff0c;可以告诉浏览器如何显示其中的…

前端解析后台返回得文件流导出得 pdf为空

封装的方法 download(res, type, filename) {// 创建blob对象&#xff0c;解析流数据const blob new Blob([res.data], {// 如果后端没返回下载文件类型&#xff0c;则需要手动设置&#xff1a;type: application/pdf;chartsetUTF-8 表示下载文档为pdf&#xff0c;如果是word则…

【Mac】在Mac OS X下安装ffmpeg并调试

安装ffmpeg并编译的相关博客 主要参考文献&#xff1a; 1、https://trac.ffmpeg.org/wiki/CompilationGuide/MacOSX 2、 http://blog.sina.com.cn/s/blog_61e70c010102w7hk.html 3、http://blog.sina.com.cn/s/blog_61e70c010102w5z5.html 4、http://www.liaoxuefeng.com/a…

python pandas series items方法_Python pandas数据分析中常用方法

读取写入文件官方IO 读取 写入 read_csv       to_csv read_excel      to_excel read_hdf       to_hdf read_sql       to_sql read_json      to_json read_msgpack (experimental)   to_msgpack(experimental) read_html       to_ht…

【Mac】在Mac OS X下解决opencv与Python的No module named cv2问题

最近遇到一个图像项目&#xff0c;打算搞一搞&#xff0c;看了一些代码&#xff0c;发现用Python处理比较方便&#xff0c;鉴于之前做图像都是使用C、OpenCV&#xff0c;这次打算看看Python与CV的性能与效果。 我之前的mac上面是安装了Python与opencv的&#xff0c;但都是分别…

python字符串迭代_Python学习日记(十)—— 杂货铺(全局变量补充、Python参数传递、字符串格式化、迭代器、生成器)...

全局变量补充python自己添加了些全局变量print(vars())"""结果&#xff1a;{__name__: __main__,__doc__: None,__package__: None,__loader__: <_frozen_importlib_external.sourcefileloader object at>,__spec__: None,__annotations__: {},__builtins…

慕课python单元测试答案_大学慕课Python编程基础课后答案

大学慕课Python编程基础课后答案更多相关问题[单选] 直径为20-30mm的滚柱轴承允许的间隙范围()mm。[单选] 试运中温升&#xff0c;电机温度不超过()℃。[单选] 电动机的定子绕组在运行温度下绝缘阻值1千伏以上不得小于()MΩ。[单选] 只有用兆欧表测量()对地绝缘时&#xff0c;才…

【Mac】在Mac下完全卸载IntelliJIdea(IDEA)

这几天在学习Python&#xff0c;在终端使用Vi写一些小程序还可以&#xff0c;遇到稍微大一点的程序就比较麻烦。于是&#xff0c;安装了一个IDEA&#xff0c;并进行了一些配置。 我也是第一次使用这个强大的IDE&#xff0c;配置的时候也没怎么注意看&#xff0c;胡乱弄的乱七八…