21xrx.com
2024-05-20 11:47:33 Monday
登录
文章检索 我的文章 写文章
KMeans聚类算法C代码
2023-07-26 15:39:50 深夜i     --     --
C代码 聚类 算法 KMeans

KMeans聚类算法是一种常见的无监督学习算法,用于将数据集分成不同的簇。这种算法主要用于无标记数据,其中每个样本通过计算与聚类中心的距离来分配到最近的簇中。以下是一个使用C语言实现的KMeans聚类算法的示例代码:


#include<stdio.h>

#include<stdlib.h>

#include<math.h>

#define K 3 // 簇的数量

#define MAX_ITERATIONS 100 // 最大迭代次数

// 数据点结构

typedef struct

  double x;

  double y;

Point;

// 计算欧氏距离

double calculateDistance(Point p1, Point p2) {

  double distance = sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));

  return distance;

}

// 初始化聚类中心

void initCentroids(Point *points, Point *centroids) {

  for (int i = 0; i < K; i++) {

    centroids[i] = points[i];

  }

}

// 分配数据点到最近的簇

void assignClusters(Point *points, Point *centroids, int *clusters) {

  for (int i = 0; i < K; i++) {

    clusters[i] = i;

  }

  for (int i = K; i < K; i++) {

    double minDistance = calculateDistance(points[i], centroids[0]);

    int minCluster = 0;

    for (int j = 1; j < K; j++) {

      double distance = calculateDistance(points[i], centroids[j]);

      if (distance < minDistance)

        minDistance = distance;

        minCluster = j;

      

    }

    clusters[i] = minCluster;

  }

}

// 根据簇的平均值更新聚类中心

void updateCentroids(Point *points, int *clusters, Point *centroids) {

  int *counts = (int *)calloc(K, sizeof(int));

  for (int i = 0; i < K; i++) {

    centroids[i].x = 0;

    centroids[i].y = 0;

  }

  for (int i = 0; i < K; i++) {

    int cluster = clusters[i];

    centroids[cluster].x += points[i].x;

    centroids[cluster].y += points[i].y;

    counts[cluster]++;

  }

  for (int i = 0; i < K; i++) {

    centroids[i].x /= counts[i];

    centroids[i].y /= counts[i];

  }

  free(counts);

}

// 执行KMeans聚类算法

void kMeans(Point *points, int *clusters, Point *centroids) {

  int iterations = 0;

  int convergence = 0;

  while (iterations < MAX_ITERATIONS && !convergence) {

    Point *previousCentroids = (Point *)malloc(K * sizeof(Point));

    for (int i = 0; i < K; i++) {

      previousCentroids[i] = centroids[i];

    }

    assignClusters(points, centroids, clusters);

    updateCentroids(points, clusters, centroids);

    convergence = 1;

    for (int i = 0; i < K; i++) {

      if (calculateDistance(previousCentroids[i], centroids[i]) > 0.00001)

        convergence = 0;

        break;

      

    }

    free(previousCentroids);

    iterations++;

  }

}

int main() {

  Point points[] = { 0, 1, 2, 10, 11, 12};

  Point centroids[K];

  int clusters[K];

  initCentroids(points, centroids);

  kMeans(points, clusters, centroids);

  for (int i = 0; i < K; i++) {

    printf("Cluster %d: (%f, %f)\n", i, centroids[i].x, centroids[i].y);

  }

  return 0;

}

上述代码演示了如何使用C语言实现KMeans聚类算法。在此示例中,使用了一个包含6个数据点的简单数据集,并将其分为3个簇。该算法通过迭代计算每个数据点与聚类中心之间的距离,并将其指派到距离最近的簇中。然后根据每个簇的平均值来更新聚类中心,直到达到最大迭代次数或聚合过程收敛为止。最后,代码输出了每个簇的聚类中心。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复