c语言非监督学习代码
时间: 2023-11-05 14:57:43 浏览: 71
C语言是一种编程语言,本身并没有提供非监督学习的功能。非监督学习是机器学习的一种方法,用于从无标签的数据中发现模式和结构。要使用非监督学习算法,你可以使用C语言编写代码来实现这些算法。
以下是一个使用C语言实现K-means聚类算法的示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 10 // 数据点数量
#define K 2 // 聚类数量
typedef struct {
double x;
double y;
int cluster;
} Point;
double distance(Point p1, Point p2) {
double dx = p1.x - p2.x;
double dy = p1.y - p2.y;
return sqrt(dx * dx + dy * dy);
}
void kmeans(Point points[]) {
Point centroids[K];
// 随机选择初始聚类中心
for (int i = 0; i < K; i++) {
centroids[i] = points[rand() % N];
}
int iterations = 0;
while (1) {
// 分配数据点到最近的聚类中心
for (int i = 0; i < N; i++) {
double minDist = INFINITY;
for (int j = 0; j < K; j++) {
double dist = distance(points[i], centroids[j]);
if (dist < minDist) {
minDist = dist;
points[i].cluster = j;
}
}
}
// 计算新的聚类中心
Point newCentroids[K] = {0};
int clusterCount[K] = {0};
for (int i = 0; i < N; i++) {
int cluster = points[i].cluster;
newCentroids[cluster].x += points[i].x;
newCentroids[cluster].y += points[i].y;
clusterCount[cluster]++; }
for (int i = 0; i < K; i++) {
if (clusterCount[i] > 0) {
centroids[i].x = newCentroids[i].x / clusterCount[i];
centroids[i].y = newCentroids[i].y / clusterCount[i];
}
}
iterations++;
// 判断是否收敛
int converge = 1;
for (int i = 0; i < K; i++) {
double dist = distance(centroids[i], newCentroids[i]);
if (dist > 0.001) {
converge = 0;
break;
}
}
if (converge) {
break;
}
}
// 打印聚类结果
printf("Iterations: %d\n", iterations);
for (int i = 0; i < K; i++) {
printf("Cluster %d:\n", i);
for (int j = 0; j < N; j++) {
if (points[j].cluster == i) {
printf("(%lf, %lf)\n", points[j].x, points[j].y);
}
}
}
}
int main() {
Point points[N] = {{1, 2}, {2, 1}, {2, 3}, {4, 5}, {5, 4},
{6, 5}, {7, 6}, {8, 7}, {9, 8}, {10, 9}};
kmeans(points);
return 0;
}
```
该示例代码实现了K-means聚类算法,使用一个包含10个数据点的简单示例数据集。你可以根据自己的需求修改数据点的数量和坐标。算法将数据点分为两个聚类,并输出聚类结果。
阅读全文