21xrx.com
2025-04-08 17:28:14 Tuesday
文章检索 我的文章 写文章
K-means聚类算法的C++实现代码
2023-10-20 09:44:02 深夜i     38     0
means 聚类算法 C++ 实现代码 means算法

K-means是一种常用的聚类算法,能够将数据集分为不同的类别。下面是一个基于C++的K-means聚类算法的实现代码。

#include <iostream>
#include <vector>
#include <cmath>
// 欧几里得距离函数
double euclideanDistance(const std::vector<double>& vec1, const std::vector<double>& vec2) {
  double sum = 0.0;
  for (size_t i = 0; i < vec1.size(); ++i) {
    sum += std::pow(vec1[i] - vec2[i], 2);
  }
  return std::sqrt(sum);
}
// K-means聚类算法
std::vector<int> kMeans(const std::vector<std::vector<double>>& data, int k, int maxIterations) {
  std::vector<std::vector<double>> centroids(k);
  std::vector<int> clusters(data.size());
  
  // 随机初始化聚类中心
  for (int i = 0; i < k; ++i) {
    int index = rand() % data.size();
    centroids[i] = data[index];
  }
  
  int iteration = 0;
  bool converged = false;
  while (iteration < maxIterations && !converged) {
    // 分配数据点到最近的聚类中心
    for (size_t i = 0; i < data.size(); ++i) {
      double minDistance = std::numeric_limits<double>::max();
      int clusterIndex = 0;
      for (int j = 0; j < k; ++j) {
        double distance = euclideanDistance(data[i], centroids[j]);
        if (distance < minDistance)
          minDistance = distance;
          clusterIndex = j;
        
      }
      clusters[i] = clusterIndex;
    }
    
    // 更新聚类中心
    std::vector<std::vector<double>> newCentroids(k, std::vector<double>(data[0].size(), 0.0));
    std::vector<int> clusterSize(k, 0);
    for (size_t i = 0; i < data.size(); ++i) {
      int clusterIndex = clusters[i];
      for (size_t j = 0; j < data[i].size(); ++j) {
        newCentroids[clusterIndex][j] += data[i][j];
      }
      clusterSize[clusterIndex]++;
    }
    for (int i = 0; i < k; ++i) {
      for (size_t j = 0; j < data[0].size(); ++j) {
        newCentroids[i][j] /= clusterSize[i];
      }
    }
    
    // 判断算法是否收敛
    converged = true;
    for (int i = 0; i < k; ++i) {
      if (euclideanDistance(centroids[i], newCentroids[i]) > 0.001)
        converged = false;
        break;
      
    }
    
    centroids = newCentroids;
    iteration++;
  }
  
  return clusters;
}
int main() {
  // 输入数据集
  std::vector<std::vector<double>> data = {
    2,
    2,
    8,
     8,
    7,
     4,
    1,
     9,
  };
  
  // 聚类数量
  int k = 2;
  
  // 最大迭代次数
  int maxIterations = 100;
  
  // 运行K-means算法
  std::vector<int> clusters = kMeans(data, k, maxIterations);
  
  // 打印聚类结果
  for (size_t i = 0; i < data.size(); ++i) {
    std::cout << "Data point (" << data[i][0] << ", " << data[i][1] << ") belongs to cluster " << clusters[i] << std::endl;
  }
  
  return 0;
}

以上是一个简单的K-means聚类算法的C++实现代码。它能够根据输入的数据集将数据点进行聚类,并输出每个数据点所属的聚类结果。在代码中,输入数据集用二维向量表示,其中每个子向量代表一个数据点的特征。算法会将数据点分为指定数量的聚类,并根据迭代次数和收敛条件更新聚类中心。最后,通过打印聚类结果,我们可以看到每个数据点所属的聚类编号。

  
  

评论区

请求出错了