用c++写一个kmeans
时间: 2023-02-07 21:33:03 浏览: 53
好的,这是一个使用 C 语言编写 k-means 算法的例子。这里我们假设有一个包含二维坐标的点的数组 `points`,类型为 `struct point`,并且已经定义了计算两点之间距离的函数 `distance`:
```c
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#define K 3
#define N 10
#define ITERS 100
typedef struct point {
double x;
double y;
} point;
double distance(point a, point b) {
double dx = a.x - b.x;
double dy = a.y - b.y;
return sqrt(dx * dx + dy * dy);
}
int main() {
point points[N] = {{0, 0}, {1, 1}, {1, 0}, {0, 1}, {2, 2}, {2, 1}, {2, 0}, {1, 2}, {0, 2}, {3, 3}};
point means[K];
int cluster_sizes[K];
int clusters[N];
for (int iter = 0; iter < ITERS; iter++) {
// 初始化聚类中心
for (int i = 0; i < K; i++) {
means[i] = points[i];
}
// 分配每个点到最近的聚类中心
for (int i = 0; i < N; i++) {
double min_distance = DBL_MAX;
int closest_mean = 0;
for (int j = 0; j < K; j++) {
double dist = distance(points[i], means[j]);
if (dist < min_distance) {
min_distance = dist;
closest_mean = j;
}
}
clusters[i] = closest_mean;
}
// 计算新的聚类中心
for (int i = 0; i < K; i++) {
cluster_sizes[i] = 0;
means[i].x = 0;
means[i].y = 0;
}
for (int i = 0; i < N; i++) {
int c = clusters[i];
cluster_sizes[c]++;
means[c].x += points[i].x;
means[c].y += points[i].y;
}
for (int i = 0; i < K; i++) {
means[i].x /= cluster_sizes[i];
means[i].y /= cluster_sizes[i];