随机生成50个2维向量,将他们聚成3个簇,然后在平面上表示出来
//kmeans,h
#pragma once
#include<iostream>
#include <vector>
using namespace std;
struct Point
{
//int pointID; //点序号索引
int x;
int y;
//vector<double> distance; //到各个质心的距离
};
struct Vect
{
Point position; //向量坐标
int pointID; //向量序号
vector<double> distance; //到各个质心距离
};
struct Cluster
{
int clusterID; //簇序号索引
vector<int> pointindex; //簇内向量索引
Point mycenter; //该簇质心
};
class Kmeans
{
private:
int n; //数据数
int k; //簇数
vector<Vect> point; //data
//vector<Point> center; //质心
vector<Cluster> cluster; //簇
int m; //迭代次数
//vector<double> distance;
public:
Kmeans();
Kmeans(int p, int q); //含参构造,n个数据k个簇
~Kmeans() {
}
void qcenter(); //求质心
void caldistance(); //求距离
void mindistance(); //某点距k个质心的最短距离
void newcluster(); //新簇
void print(); //显示各个簇内包含的向量
void printscreen(); //将点显示到屏幕上
};
kmeans.cpp
//
#pragma once
#include "Kmeans.h"
#include<time.h>
#include<math.h>
#include<algorithm>
Kmeans::Kmeans(int p, int q)
{
n = p; k = q; //初始化n和k的值
//生成n个向量
Vect randomNumber;
srand((unsigned)time(NULL));//time()用系统时间初始化种。为rand()生成不同的随机种子。
cout << "随机生成的" << n << "个数据:" << endl;
for (int i = 0; i < n; i++)
{
randomNumber.position.x = rand() % 100 + 1;//生成1~100随机数
randomNumber