91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

C++聚類算法中的動態聚類中心調整

發布時間:2024-11-11 10:31:46 來源:億速云 閱讀:80 作者:小樊 欄目:編程語言

在C++中實現動態聚類中心調整,我們可以使用K-means算法。K-means是一種非常流行的聚類算法,它通過迭代地更新聚類中心來最小化每個數據點到其所屬聚類中心的距離之和。下面是一個簡單的C++實現,展示了如何在每次迭代中更新聚類中心:

#include <iostream>
#include <vector>
#include <cmath>
#include <random>

// 計算兩點之間的距離
double distance(const std::vector<double>& a, const std::vector<double>& b) {
    double sum = 0;
    for (size_t i = 0; i < a.size(); ++i) {
        sum += pow(a[i] - b[i], 2);
    }
    return sqrt(sum);
}

// K-means算法
void kMeans(std::vector<std::vector<double>>& data, int k, int maxIterations) {
    // 隨機初始化聚類中心
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> dis(0, 1);
    std::vector<std::vector<double>> centroids(k);
    for (int i = 0; i < k; ++i) {
        centroids[i] = data[dis(gen)];
    }

    // 迭代更新聚類中心
    for (int iter = 0; iter < maxIterations; ++iter) {
        std::vector<int> clusters(data.size(), -1);
        std::vector<std::vector<double>> newCentroids(k, std::vector<double>(data[0].size(), 0));

        // 將數據點分配到最近的聚類中心
        for (size_t i = 0; i < data.size(); ++i) {
            double minDist = DBL_MAX;
            int closestCluster = -1;
            for (int j = 0; j < k; ++j) {
                double dist = distance(data[i], centroids[j]);
                if (dist < minDist) {
                    minDist = dist;
                    closestCluster = j;
                }
            }
            clusters[i] = closestCluster;
            newCentroids[closestCluster] += data[i];
        }

        // 更新聚類中心
        for (int j = 0; j < k; ++j) {
            double sum = 0;
            for (size_t i = 0; i < data.size(); ++i) {
                if (clusters[i] == j) {
                    sum += data[i][0]; // 假設數據只有一個特征
                }
            }
            newCentroids[j][0] /= clusters[j].size(); // 假設數據只有一個特征
        }

        // 檢查聚類中心是否收斂
        bool converged = true;
        for (int j = 0; j < k; ++j) {
            if (distance(centroids[j], newCentroids[j]) > 1e-6) {
                converged = false;
                break;
            }
        }

        if (converged) {
            centroids = newCentroids;
            break;
        }
    }
}

int main() {
    std::vector<std::vector<double>> data = {{1, 2}, {1, 4}, {1, 0},
                                            {10, 2}, {10, 4}, {10, 0}};
    int k = 2; // 聚類數
    int maxIterations = 100; // 最大迭代次數

    kMeans(data, k, maxIterations);

    // 輸出聚類結果
    for (int i = 0; i < data.size(); ++i) {
        std::cout << "Data point "<< i << " belongs to cluster " << clusters[i] << std::endl;
    }

    return 0;
}

在這個示例中,我們首先隨機初始化聚類中心,然后在每次迭代中將數據點分配到最近的聚類中心,并更新聚類中心。我們使用了一個簡單的收斂條件,即聚類中心之間的距離變化小于一個很小的閾值(例如1e-6)。當聚類中心不再發生變化時,算法收斂。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

c++
AI

高陵县| 吉木乃县| 庄浪县| 楚雄市| 江川县| 孝义市| 兴安县| 金寨县| 都匀市| 高陵县| 汤阴县| 吕梁市| 独山县| 北辰区| 左云县| 广南县| 北票市| 太和县| 子长县| 突泉县| 凯里市| 平陆县| 湘潭市| 互助| 新巴尔虎右旗| 南皮县| 前郭尔| 鄂尔多斯市| 林芝县| 隆安县| 兰州市| 六枝特区| 汝州市| 调兵山市| 白水县| 德州市| 磴口县| 堆龙德庆县| 新干县| 普定县| 江西省|