c语言k-means聚类算法
时间: 2024-12-04 11:14:01 浏览: 21
聚类算法:K-means聚类图像分割
5星 · 资源好评率100%
好的,我来为您介绍一下C语言中的k-means聚类算法:
k-means聚类是一种常用的无监督学习算法,用于将数据集分成k个簇。以下是C语言实现k-means聚类算法的主要步骤:
1. 初始化:
- 选择k个初始质心(随机选择或使用某些启发式方法)
- 设定最大迭代次数
2. 分配步骤:
- 对于每个数据点,计算其与所有质心的距离
- 将数据点分配到距离最近的簇
3. 更新步骤:
- 重新计算每个簇的质心(簇内所有点的均值)
4. 重复步骤2和3,直到满足停止条件(通常是达到最大迭代次数或质心变化很小)
5. 输出最终的簇和质心
以下是一个简单的C语言实现示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define K 3
#define MAX_ITER 100
#define DATA_SIZE 100
typedef struct {
double x;
double y;
} Point;
double distance(Point a, Point b) {
return sqrt(pow(a.x - b.x, 2) + pow(a.y - b.y, 2));
}
void kmeans(Point data[], int size, int k, int max_iter) {
Point centroids[k];
int labels[size];
// 随机初始化质心
for (int i = 0; i < k; i++) {
centroids[i] = data[rand() % size];
}
for (int iter = 0; iter < max_iter; iter++) {
// 分配步骤
for (int i = 0; i < size; i++) {
double min_dist = INFINITY;
for (int j = 0; j < k; j++) {
double dist = distance(data[i], centroids[j]);
if (dist < min_dist) {
min_dist = dist;
labels[i] = j;
}
}
}
// 更新步骤
Point new_centroids[k] = {0};
int counts[k] = {0};
for (int i = 0; i < size; i++) {
int label = labels[i];
new_centroids[label].x += data[i].x;
new_centroids[label].y += data[i].y;
counts[label]++;
}
int converged = 1;
for (int i = 0; i < k; i++) {
if (counts[i] > 0) {
new_centroids[i].x /= counts[i];
new_centroids[i].y /= counts[i];
if (distance(centroids[i], new_centroids[i]) > 1e-6) {
converged = 0;
}
centroids[i] = new_centroids[i];
}
}
if (converged) {
break;
}
}
// 输出结果
for (int i = 0; i < k; i++) {
printf("Cluster %d centroid: (%f, %f)\n", i, centroids[i].x, centroids[i].y);
}
}
int main() {
Point data[DATA_SIZE];
// 初始化数据点
for (int i = 0; i < DATA_SIZE; i++) {
data[i].x = rand() % 100;
data[i].y = rand() % 100;
}
kmeans(data, DATA_SIZE, K, MAX_ITER);
return 0;
}
```
这个实现包含了k-means算法的主要组成部分:
1. 质心初始化
2. 分配步骤(计算距离和标签)
3. 更新步骤(重新计算质心)
4. 收敛判断
请注意,这是一个基本的实现,可能需要根据具体应用场景进行调整和优化。例如,你可以添加更多的数据预处理步骤,改进距离计算方法,或者使用更复杂的初始化策略。
阅读全文