C++实现KMeans算法

本文介绍了在机器人大赛中应用KMeans算法进行地图分区的过程,详细阐述了算法的四个关键步骤,并提到了开发环境为VS2012,利用easyX库。通过随机选择种子点、计算点群距离、更新聚类中心,不断迭代直至满足停止条件。
摘要由CSDN通过智能技术生成

去年暑假在准备机器人大赛的时候用到了KMeans算法,我们使用该算法来对地图进行分区,该算法的具体步骤如下:

1.随机的选取K个种子点作为初始聚类中心

2.然后求出所有的点到K个聚类中心的距离,找出离每个点最近的聚类中心作为该点的种群中心。

3.经过前两步就形成了K个点群,然后更新K个点群的中心。

4,重复步骤2和3直到满足一定的阈值。


开发环境 VS2012 + easyX


源代码如下:

#include<iostream>
#include<graphics.h>
#include<cmath>
#include<cstdlib>
#include<easyx.h>
#include<vector>
using namespace std;

//随机生成的点的数目
#define POINT_NUM 8000
//窗口的大小
#define WIDTH 600
#define HEIGHT 600

struct point
{
	double x;          //该点的X坐标
	double y;        //该点的Y坐标
	int cluster;     //该店所属聚类的索引
};
/**
	绘制每个聚类所用的颜色
**/
COLORREF color[15]=
{
	WHITE,YELLOW,RED,BLUE,GREEN,
	BROWN,LIGHTCYAN,MAGENTA,LIGHTRED,
	CYAN,LIGHTBLUE,LIGHTGREEN, DARKGRAY,  
	LIGHTMAGENTA,LIGHTGRAY,  
};

//初始化聚类点
void initCluster(vector<struct point*>& pointList,int num);

//随机生成聚类中心
void generateCenter(vector<struct point*>& center,int Num);

//画出所有的点
void drawCluster(vector<struct point*>& pointList);

//获得一个聚类的中心
struct point* getCenter(vector<struct point*>& cluster);

//获得两点之间的欧式距离
double getDist
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值