C++ 语言 实现层次聚类算法

C++阿木 发布于 4 天前 4 次阅读


C++ 实现层次聚类算法

层次聚类(Hierarchical Clustering)是一种无监督学习算法,它通过将数据点逐步合并成簇,或者将簇逐步分解成数据点,从而形成一棵树状结构,称为聚类树或谱系树。层次聚类算法可以分为两大类:自底向上的凝聚层次聚类和自顶向下的分裂层次聚类。本文将围绕C++语言实现自底向上的凝聚层次聚类算法。

算法原理

自底向上的凝聚层次聚类算法的基本思想是将每个数据点视为一个簇,然后逐步合并距离最近的簇,直到满足停止条件。以下是算法的基本步骤:

1. 将每个数据点视为一个簇,形成N个簇。
2. 计算所有簇之间的距离,选择距离最近的两个簇合并成一个簇。
3. 重复步骤2,直到满足停止条件(如达到预设的簇数或簇间距离大于某个阈值)。

C++ 实现步骤

1. 数据结构设计

我们需要定义一个数据结构来存储数据点和簇的信息。以下是一个简单的数据结构定义:

cpp
include
include

struct DataPoint {
std::vector coordinates;
int clusterId = -1;
};

struct Cluster {
std::vector points;
double centroid;
double distance;
};

2. 距离计算函数

为了计算簇之间的距离,我们需要实现一个距离计算函数。以下是一个欧几里得距离的计算函数:

cpp
double calculateDistance(const DataPoint& a, const DataPoint& b) {
double sum = 0.0;
for (size_t i = 0; i < a.coordinates.size(); ++i) {
sum += (a.coordinates[i] - b.coordinates[i]) (a.coordinates[i] - b.coordinates[i]);
}
return std::sqrt(sum);
}

3. 聚类算法实现

接下来,我们实现自底向上的凝聚层次聚类算法:

cpp
void hierarchicalClustering(std::vector& dataPoints, int k) {
int n = dataPoints.size();
std::vector clusters(n);

// 初始化簇
for (int i = 0; i k) {
double minDistance = std::numeric_limits::max();
int cluster1 = -1, cluster2 = -1;

// 寻找距离最近的两个簇
for (int i = 0; i < clusters.size() - 1; ++i) {
for (int j = i + 1; j < clusters.size(); ++j) {
double distance = calculateDistance(clusters[i].centroid, clusters[j].centroid);
if (distance < minDistance) {
minDistance = distance;
cluster1 = i;
cluster2 = j;
}
}
}

// 合并簇
clusters[cluster1].points.insert(clusters[cluster1].points.end(),
clusters[cluster2].points.begin(), clusters[cluster2].points.end());
clusters.erase(clusters.begin() + cluster2);
}

// 更新数据点的簇ID
for (int i = 0; i < n; ++i) {
for (const auto& point : clusters[i].points) {
point.clusterId = i;
}
}
}

4. 测试代码

我们可以编写一些测试代码来验证我们的聚类算法:

cpp
int main() {
std::vector dataPoints = {
{1, 2}, {2, 3}, {3, 4}, {5, 6}, {6, 7},
{8, 9}, {9, 10}, {10, 11}, {11, 12}, {12, 13}
};

int k = 3;
hierarchicalClustering(dataPoints, k);

// 打印聚类结果
for (const auto& point : dataPoints) {
std::cout << "Point: (" << point.coordinates[0] << ", " << point.coordinates[1] << "), Cluster: " << point.clusterId << std::endl;
}

return 0;
}

总结

本文介绍了层次聚类算法的基本原理,并使用C++语言实现了自底向上的凝聚层次聚类算法。通过测试代码,我们可以验证算法的正确性。在实际应用中,可以根据具体需求调整算法参数,如簇数k和距离阈值等。希望本文对您有所帮助。