k-means算法c++
时间: 2023-12-02 09:42:32 浏览: 34
以下是k-means算法的C++实现:
```c++
#include <iostream>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MAXN = 1000;
const int MAXK = 10;
const int MAXD = 10;
const int INF = 0x3f3f3f3f;
struct Point {
double element[MAXD];
};
struct Cluster {
Point center;
Point sum;
int size;
};
double dist(Point a, Point b, int n) {
double res = 0;
for (int i = 0; i < n; i++) {
res += (a.element[i] - b.element[i]) * (a.element[i] - b.element[i]);
}
return sqrt(res);
}
void Kmeans(int k, Point X[], Point Z[], int m, int n) {
Cluster C[MAXK];
for (int i = 0; i < k; i++) {
C[i].center = Z[i];
C[i].size = 0;
for (int j = 0; j < n; j++) {
C[i].sum.element[j] = 0;
}
}
bool flag = true;
while (flag) {
flag = false;
for (int i = 0; i < k; i++) {
C[i].size = 0;
for (int j = 0; j < n; j++) {
C[i].sum.element[j] = 0;
}
}
for (int i = 0; i < m; i++) {
int index = 0;
double minDist = INF;
for (int j = 0; j < k; j++) {
double d = dist(X[i], C[j].center, n);
if (d < minDist) {
minDist = d;
index = j;
}
}
C[index].size++;
for (int j = 0; j < n; j++) {
C[index].sum.element[j] += X[i].element[j];
}
}
for (int i = 0; i < k; i++) {
if (C[i].size == 0) {
continue;
}
Point newCenter;
for (int j = 0; j < n; j++) {
newCenter.element[j] = C[i].sum.element[j] / C[i].size;
}
if (dist(newCenter, C[i].center, n) > 0.0001) {
flag = true;
}
C[i].center = newCenter;
}
}
cout << "经过计算\n";
for (int i = 0; i < k; i++) {
cout << "聚类中心Z" << i + 1 << "=( ";
for (int j = 0; j < n; j++) {
cout << C[i].center.element[j] << " ";
}
cout << ")\n";
}
}
int main() {
srand(time(NULL));
int m, n, k;
Point X[MAXN], Z[MAXK];
cout << "请输入数据点个数m:";
cin >> m;
cout << "请输入数据点维数n:";
cin >> n;
cout << "请输入聚类中心个数k:";
cin >> k;
cout << "请输入数据点:\n";
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
cin >> X[i].element[j];
}
}
cout << "请输入聚类中心:\n";
for (int i = 0; i < k; i++) {
for (int j = 0; j < n; j++) {
cin >> Z[i].element[j];
}
}
Kmeans(k, X, Z, m, n);
return 0;
}
```