C++ 语言 实现 K means 聚类算法

C++阿木 发布于 2025-06-14 4 次阅读


K-means 聚类算法的 C++ 实现与优化

K-means 聚类算法是一种经典的聚类算法,它通过迭代的方式将数据点分配到 K 个簇中,使得每个簇内的数据点尽可能接近,而不同簇之间的数据点尽可能远离。K-means 算法因其简单、高效而被广泛应用于数据挖掘、图像处理等领域。本文将围绕 C++ 语言实现 K-means 聚类算法,并对其性能进行优化。

K-means 算法原理

K-means 算法的基本思想如下:

1. 随机选择 K 个数据点作为初始聚类中心。
2. 将每个数据点分配到最近的聚类中心,形成 K 个簇。
3. 计算每个簇的中心,即该簇中所有数据点的均值。
4. 重复步骤 2 和 3,直到聚类中心不再变化或达到最大迭代次数。

C++ 实现步骤

以下是 K-means 聚类算法的 C++ 实现步骤:

1. 数据结构定义

定义一个数据结构来存储数据点和聚类中心。

cpp
include
include

struct Point {
double x;
double y;
};

struct Cluster {
std::vector points;
Point center;
};

2. 初始化聚类中心

随机选择 K 个数据点作为初始聚类中心。

cpp
void initializeCenters(std::vector& points, std::vector& centers, int k) {
std::vector indices(k);
for (int i = 0; i < k; ++i) {
indices[i] = rand() % points.size();
}
for (int i = 0; i < k; ++i) {
centers[i] = points[indices[i]];
}
}

3. 计算距离

计算两个数据点之间的欧氏距离。

cpp
double distance(const Point& p1, const Point& p2) {
return sqrt(pow(p1.x - p2.x, 2) + pow(p1.y - p2.y, 2));
}

4. 分配数据点

将每个数据点分配到最近的聚类中心。

cpp
void assignPointsToClusters(std::vector& points, std::vector& centers, std::vector& labels) {
for (int i = 0; i < points.size(); ++i) {
double minDist = std::numeric_limits::max();
int clusterIndex = 0;
for (int j = 0; j < centers.size(); ++j) {
double dist = distance(points[i], centers[j]);
if (dist < minDist) {
minDist = dist;
clusterIndex = j;
}
}
labels[i] = clusterIndex;
}
}

5. 更新聚类中心

计算每个簇的中心。

cpp
void updateCenters(std::vector& points, std::vector& centers, std::vector& labels) {
for (int i = 0; i < centers.size(); ++i) {
centers[i].x = 0;
centers[i].y = 0;
}
for (int i = 0; i < points.size(); ++i) {
centers[labels[i]].x += points[i].x;
centers[labels[i]].y += points[i].y;
}
for (int i = 0; i < centers.size(); ++i) {
centers[i].x /= points.size();
centers[i].y /= points.size();
}
}

6. K-means 算法主函数

实现 K-means 算法的主函数。

cpp
void kMeans(std::vector& points, std::vector& centers, int k, int maxIterations) {
std::vector labels(points.size(), -1);
initializeCenters(points, centers, k);
for (int i = 0; i < maxIterations; ++i) {
assignPointsToClusters(points, centers, labels);
updateCenters(points, centers, labels);
}
}

性能优化

为了提高 K-means 算法的性能,以下是一些优化策略:

1. 并行计算:在分配数据点和更新聚类中心时,可以使用多线程并行计算,以减少计算时间。
2. 局部搜索:在初始化聚类中心时,可以使用局部搜索算法(如 K-means++)来选择更好的初始聚类中心。
3. 距离度量:对于高维数据,可以考虑使用更有效的距离度量方法,如余弦相似度或汉明距离。

总结

本文介绍了 K-means 聚类算法的原理和 C++ 实现步骤,并对其性能进行了优化。通过合理的数据结构和算法设计,K-means 算法可以有效地处理大规模数据集。在实际应用中,可以根据具体需求对算法进行进一步优化和改进。