聚类进行数据处理C语言
时间: 2023-08-27 11:05:20 浏览: 49
聚类是一种常用的数据处理方法,可以对数据进行分类和归纳,从而更好地理解和分析数据。在 C 语言中,可以使用各种聚类算法,如 K-means、层次聚类等。
以下是一个简单的 K-means 算法实现的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
// 定义数据点结构体
typedef struct {
double x, y;
int cluster;
} point_t;
// 计算两点之间的距离
double distance(point_t p1, point_t p2) {
double dx = p1.x - p2.x;
double dy = p1.y - p2.y;
return sqrt(dx * dx + dy * dy);
}
// K-means 聚类算法
void kmeans(point_t *points, int n, int k) {
// 随机初始化聚类中心
point_t *centers = malloc(k * sizeof(point_t));
for (int i = 0; i < k; i++) {
centers[i].x = points[i].x;
centers[i].y = points[i].y;
centers[i].cluster = i;
}
// 迭代更新聚类中心和聚类结果
while (1) {
// 初始化聚类结果
int changed = 0;
for (int i = 0; i < n; i++) {
double min_dist = INFINITY;
for (int j = 0; j < k; j++) {
double dist = distance(points[i], centers[j]);
if (dist < min_dist) {
min_dist = dist;
points[i].cluster = j;
}
}
if (points[i].cluster != i) changed = 1;
}
if (!changed) break;
// 更新聚类中心
for (int i = 0; i < k; i++) {
double sum_x = 0, sum_y = 0, count = 0;
for (int j = 0; j < n; j++) {
if (points[j].cluster == i) {
sum_x += points[j].x;
sum_y += points[j].y;
count++;
}
}
centers[i].x = sum_x / count;
centers[i].y = sum_y / count;
}
}
// 打印聚类结果
for (int i = 0; i < n; i++) {
printf("Point (%.2f, %.2f) belongs to cluster %d\n", points[i].x, points[i].y, points[i].cluster);
}
free(centers);
}
int main() {
// 生成随机数据点
int n = 10;
point_t points[] = {
{1, 2},
{2, 3},
{3, 4},
{4, 5},
{5, 6},
{6, 7},
{7, 8},
{8, 9},
{9, 10},
{10, 11},
};
// 进行 K-means 聚类
int k = 2;
kmeans(points, n, k);
return 0;
}
```
在上面的代码中,我们先定义了一个数据点结构体 `point_t`,包含了 x、y 坐标和所属聚类的编号。然后实现了一个计算两个数据点之间距离的函数 `distance`。接着是 K-means 算法的实现,包括随机初始化聚类中心、迭代更新聚类中心和聚类结果等步骤。最后在 `main` 函数中生成了一些随机数据点,并进行 K-means 聚类。