您好,登錄后才能下訂單哦!
在C++中實(shí)現(xiàn)動態(tài)聚類中心調(diào)整,我們可以使用K-means算法。K-means是一種非常流行的聚類算法,它通過迭代地更新聚類中心來最小化每個數(shù)據(jù)點(diǎn)到其所屬聚類中心的距離之和。下面是一個簡單的C++實(shí)現(xiàn),展示了如何在每次迭代中更新聚類中心:
#include <iostream>
#include <vector>
#include <cmath>
#include <random>
// 計(jì)算兩點(diǎn)之間的距離
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) {
// 隨機(jī)初始化聚類中心
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));
// 將數(shù)據(jù)點(diǎn)分配到最近的聚類中心
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]; // 假設(shè)數(shù)據(jù)只有一個特征
}
}
newCentroids[j][0] /= clusters[j].size(); // 假設(shè)數(shù)據(jù)只有一個特征
}
// 檢查聚類中心是否收斂
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; // 聚類數(shù)
int maxIterations = 100; // 最大迭代次數(shù)
kMeans(data, k, maxIterations);
// 輸出聚類結(jié)果
for (int i = 0; i < data.size(); ++i) {
std::cout << "Data point "<< i << " belongs to cluster " << clusters[i] << std::endl;
}
return 0;
}
在這個示例中,我們首先隨機(jī)初始化聚類中心,然后在每次迭代中將數(shù)據(jù)點(diǎn)分配到最近的聚類中心,并更新聚類中心。我們使用了一個簡單的收斂條件,即聚類中心之間的距離變化小于一個很小的閾值(例如1e-6)。當(dāng)聚類中心不再發(fā)生變化時,算法收斂。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。