k均值聚类c语言代码
时间: 2024-05-22 08:07:45 浏览: 11
k均值聚类是一种常用的无监督学习算,用于将数据集划分为k个不同的簇。下面是一个简单的k均值聚类的C语言代码示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITERATIONS 100
// 计算两个点之间的欧氏距离
double distance(double x1, double y1, double x2, double y2) {
return sqrt(pow((x1 - x2), 2) + pow((y1 - y2), 2));
}
// 执行k均值聚类算法
void kmeans(double data[], int n, int k, double centroids[]) {
int i, j, iteration, cluster;
double minDistance, currentDistance;
double sumX, sumY, count;
int clusterCounts[k];
// 初始化聚类中心
for (i = 0; i < k; i++) {
centroids[i] = data[i];
centroids[i] = data[i];
}
// 迭代更新聚类中心
for (iteration = 0; iteration < MAX_ITERATIONS; iteration++) {
// 初始化聚类计数器和聚类总和
for (i = 0; i < k; i++) {
clusterCounts[i] = 0;
sumX = 0;
sumY = 0;
}
// 分配数据点到最近的聚类中心
for (i = 0; i < n; i++) {
minDistance = distance(data[i], data[i], centroids[0], centroids);
cluster = 0;
for (j = 1; j < k; j++) {
currentDistance = distance(data[i], data[i], centroids[j], centroids[j]);
if (currentDistance < minDistance) {
minDistance = currentDistance;
cluster = j;
}
}
// 更新聚类计数器和聚类总和
clusterCounts[cluster]++;
sumX += data[i];
sumY += data[i];
// 将数据点分配到聚类中心
centroids[cluster] = sumX / clusterCounts[cluster];
centroids[cluster] = sumY / clusterCounts[cluster];
}
}
}
int main() {
int n, k, i;
double data[] = {{1, 1}, {1, 2}, {2, 2}, {5, 5}, {6, 6}, {7, 7}};
double centroids;
n = sizeof(data) / sizeof(data);
k = 2;
kmeans(data, n, k, centroids);
// 打印聚类中心
printf("聚类中心:\n");
for (i = 0; i < k; i++) {
printf("(%lf, %lf)\n", centroids[i], centroids[i]);
}
return 0;
}
```
这段代码实现了一个简单的k均值聚类算法,其中`data`数组存储了待聚类的数据点,`n`表示数据点的数量,`k`表示要划分的簇的数量,`centroids`数组存储了最终的聚类中心。代码中使用欧氏距离来计算数据点之间的距离,并通过迭代更新聚类中心来完成聚类过程。最后,打印出聚类中心的坐标。