21xrx.com
2024-11-21 22:46:25 Thursday
登录
文章检索 我的文章 写文章
K-means聚类算法的C++实现代码
2023-10-20 09:44:02 深夜i     --     --
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++实现代码。它能够根据输入的数据集将数据点进行聚类,并输出每个数据点所属的聚类结果。在代码中,输入数据集用二维向量表示,其中每个子向量代表一个数据点的特征。算法会将数据点分为指定数量的聚类,并根据迭代次数和收敛条件更新聚类中心。最后,通过打印聚类结果,我们可以看到每个数据点所属的聚类编号。

  
  

评论区

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