层次聚类 C++代码
时间: 2023-11-14 11:14:14 浏览: 63
层次聚类算法C++
4星 · 用户满意度95%
以下是一个简单的层次聚类的C++代码示例:
```c++
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 定义距离计算函数
double distance(vector<double> a, vector<double> b) {
double sum = 0;
for (int i = 0; i < a.size(); i++) {
sum += pow(a[i] - b[i], 2);
}
return sqrt(sum);
}
int main() {
// 定义数据集
vector<vector<double>> data = {{1, 2, 3}, {2, 3, 4}, {3, 4, 5}, {4, 5, 6}};
// 定义距离矩阵
vector<vector<double>> distanceMatrix(data.size(), vector<double>(data.size()));
for (int i = 0; i < data.size(); i++) {
for (int j = 0; j < data.size(); j++) {
if (i == j) {
distanceMatrix[i][j] = 0;
} else {
distanceMatrix[i][j] = distance(data[i], data[j]);
}
}
}
// 层次聚类
vector<int> labels(data.size()); // 聚类结果
int currentLabel = 0; // 当前聚类编号
while (true) {
// 找出距离最近的两个点
int minI = 0, minJ = 1;
double minDist = distanceMatrix[minI][minJ];
for (int i = 0; i < data.size(); i++) {
for (int j = i + 1; j < data.size(); j++) {
if (distanceMatrix[i][j] < minDist) {
minI = i;
minJ = j;
minDist = distanceMatrix[i][j];
}
}
}
// 将两个点合并
for (int i = 0; i < data.size(); i++) {
if (i == minI || i == minJ) {
labels[i] = currentLabel;
}
}
currentLabel++;
// 更新距离矩阵
for (int i = 0; i < data.size(); i++) {
if (i != minI && i != minJ) {
double distI = distanceMatrix[minI][i];
double distJ = distanceMatrix[minJ][i];
distanceMatrix[minI][i] = distanceMatrix[i][minI] = min(distI, distJ);
}
}
distanceMatrix[minJ] = vector<double>(data.size()); // 删除 minJ 行
for (int i = 0; i < data.size(); i++) {
distanceMatrix[i][minJ] = 0; // 删除 minJ 列
}
// 如果只剩一个聚类,停止迭代
if (currentLabel == data.size()) {
break;
}
}
// 输出聚类结果
for (int i = 0; i < data.size(); i++) {
cout << "data[" << i << "] belongs to cluster " << labels[i] << endl;
}
return 0;
}
```
注:此示例代码实现了最简单的单链接层次聚类算法,只适用于凸数据集。实际应用中请根据数据集特点选择不同的层次聚类算法,并进行必要的优化。
阅读全文