编写 k-均值聚类算法程序c语言二维
时间: 2023-10-29 11:03:34 浏览: 148
k均值聚类.zip_K均值程序_MATLAB 自编kmeans_kmeansMATLAB自编_spss k聚类_数据k-mean
k-均值聚类算法是一种常用的无监督学习方法,用于将数据集划分为k个互不重叠的簇。下面是使用C语言编写的二维k-均值聚类算法的程序示例:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_ITER 100 // 最大迭代次数
// 计算两个二维点之间的欧式距离
float distance(float x1, float y1, float x2, float y2) {
return sqrt(pow(x1-x2, 2) + pow(y1-y2, 2));
}
// 执行k-均值聚类算法
void kmeans(float* x, float* y, int n, int k) {
float cx[k], cy[k]; // 聚类中心的x和y坐标
int c[n]; // 每个数据点的簇标签
// 随机初始化聚类中心
for (int i = 0; i < k; i++) {
cx[i] = x[i];
cy[i] = y[i];
}
int iter = 0;
int changed = 1;
while (changed && iter < MAX_ITER) {
changed = 0;
// 分配每个数据点到最近的聚类中心
for (int i = 0; i < n; i++) {
float minDist = distance(x[i], y[i], cx[0], cy[0]);
int minIdx = 0;
for (int j = 1; j < k; j++) {
float dist = distance(x[i], y[i], cx[j], cy[j]);
if (dist < minDist) {
minDist = dist;
minIdx = j;
}
}
if (c[i] != minIdx) {
c[i] = minIdx;
changed = 1;
}
}
// 更新聚类中心为每个簇的质心
for (int i = 0; i < k; i++) {
float sumX = 0, sumY = 0;
int count = 0;
for (int j = 0; j < n; j++) {
if (c[j] == i) {
sumX += x[j];
sumY += y[j];
count++;
}
}
cx[i] = sumX / count;
cy[i] = sumY / count;
}
iter++;
}
// 输出结果
for (int i = 0; i < k; i++) {
printf("簇 #%d:\n", i+1);
for (int j = 0; j < n; j++) {
if (c[j] == i) {
printf("(%f, %f)\n", x[j], y[j]);
}
}
printf("\n");
}
}
int main() {
// 输入数据集及聚类数
float x[] = {1, 1.5, 3, 5, 3.5, 4.5};
float y[] = {1, 2, 4, 7, 5, 5};
int n = sizeof(x) / sizeof(float);
int k = 2;
// 执行k-均值聚类
kmeans(x, y, n, k);
return 0;
}
```
这个程序使用欧式距离作为相似性度量,根据输入的数据集和聚类数,采用迭代的方式来更新聚类中心,并根据最终得到的聚类中心将数据集划分为对应的簇。最后,输出划分结果以及每个簇中的数据点。该示例程序中将数据集的x和y坐标硬编码了,可以根据实际需要修改为从文件或用户输入读取数据集的方式。
阅读全文