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个二维向量的数据集进行聚类,将其分为两个簇。最后输出每个簇的中心点。

C++ 多维向量聚类算法代码示例 - K均值算法

原文地址: https://www.cveoy.top/t/topic/mRCV 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录