C++ 多维向量聚类算法代码示例 - K均值算法
C++ 多维向量聚类算法代码示例 - K均值算法
抱歉,由于多维向量聚类算法涉及到具体的算法模型和数据集,需要更加详细的信息才能提供完整的代码。以下是一个简单的K均值聚类算法的C++示例代码,仅供参考:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;
// 定义向量结构体
struct Vector {
vector<double> data; // 向量数据
int cluster; // 所属簇的编号
double distance; // 到簇中心的距离
};
// 计算两个向量之间的欧几里得距离
double euclidean_distance(const Vector &v1, const Vector &v2) {
double sum = 0;
for (int i = 0; i < v1.data.size(); i++) {
sum += pow(v1.data[i] - v2.data[i], 2);
}
return sqrt(sum);
}
// 初始化簇中心
void init_clusters(const vector<Vector> &data, vector<Vector> &clusters, int k) {
clusters.clear();
for (int i = 0; i < k; i++) {
Vector c;
c.data = data[i].data;
clusters.push_back(c);
}
}
// 对每个数据点进行聚类
void assign_clusters(const vector<Vector> &data, const vector<Vector> &clusters) {
for (int i = 0; i < data.size(); i++) {
double min_distance = INFINITY;
int min_cluster = -1;
for (int j = 0; j < clusters.size(); j++) {
double dist = euclidean_distance(data[i], clusters[j]);
if (dist < min_distance) {
min_distance = dist;
min_cluster = j;
}
}
data[i].cluster = min_cluster;
data[i].distance = min_distance;
}
}
// 更新簇中心
void update_clusters(const vector<Vector> &data, vector<Vector> &clusters) {
vector<int> count(clusters.size(), 0);
vector<Vector> sum(clusters.size());
for (int i = 0; i < data.size(); i++) {
int c = data[i].cluster;
count[c]++;
for (int j = 0; j < data[i].data.size(); j++) {
sum[c].data.push_back(data[i].data[j]);
}
}
for (int i = 0; i < clusters.size(); i++) {
for (int j = 0; j < clusters[i].data.size(); j++) {
clusters[i].data[j] = sum[i].data[j] / count[i];
}
}
}
// 判断簇中心是否发生变化
bool has_converged(const vector<Vector> &clusters, const vector<Vector> &prev_clusters) {
for (int i = 0; i < clusters.size(); i++) {
if (euclidean_distance(clusters[i], prev_clusters[i]) > 0) {
return false;
}
}
return true;
}
// K均值聚类算法
void kmeans(const vector<Vector> &data, vector<Vector> &clusters, int k) {
init_clusters(data, clusters, k);
vector<Vector> prev_clusters;
assign_clusters(data, clusters);
do {
prev_clusters = clusters;
update_clusters(data, clusters);
assign_clusters(data, clusters);
} while (!has_converged(clusters, prev_clusters));
}
int main() {
vector<Vector> data = {{1, 2}, {2, 1}, {3, 4}, {4, 3}, {5, 6}, {6, 5}};
vector<Vector> clusters;
int k = 2;
kmeans(data, clusters, k);
for (int i = 0; i < clusters.size(); i++) {
cout << "Cluster " << i << ": ";
for (int j = 0; j < clusters[i].data.size(); j++) {
cout << clusters[i].data[j] << " ";
}
cout << endl;
}
return 0;
}
在这个示例代码中,我们定义了一个 Vector 结构体表示多维向量,其中包含了向量数据、所属簇的编号和到簇中心的距离。我们实现了以下几个函数:
euclidean_distance:计算两个向量之间的欧几里得距离;init_clusters:初始化簇中心;assign_clusters:对每个数据点进行聚类;update_clusters:更新簇中心;has_converged:判断簇中心是否发生变化;kmeans:K均值聚类算法。
我们在 main 函数中使用这些函数来对一个包含6个二维向量的数据集进行聚类,将其分为两个簇。最后输出每个簇的中心点。
原文地址: https://www.cveoy.top/t/topic/mRCV 著作权归作者所有。请勿转载和采集!