kmeans聚類的實現

2021-07-05 12:44:09 字數 2351 閱讀 6062

kmeans演算法流程

從資料中隨機抽取k個點作為初始聚類的中心,由這個中心代表各個聚類

計算資料中所有的點到這k個點的距離,將點歸到離其最近的聚類裡

調整聚類中心,即將聚類的中心移動到聚類的幾何中心(即平均值)處,也就是k-means中的mean的含義

重複第2步直到聚類的中心不再移動,此時演算法收斂

最後kmeans演算法時間、空間複雜度是:

時間複雜度:上限為o(tkmn),下限為ω(kmn)其中,t為迭代次數,k為簇的數目,m為記錄數,n為維數 

空間複雜度:o((m+k)n),其中,k為簇的數目,m為記錄數,n為維數

影響演算法準確度的因素

資料的採集和抽象

初始的中心選擇

k值的選定

最大迭代次數

收斂值度量距離的手段

在進一步闡述初始中心點選擇之前,我們應該先確定度量kmeans的演算法精確度的方法。一種度量聚類效果的標準是:sse(sum of square error,誤差平方和)

sse越小表示資料點越接近於它們的質心,聚類效果也就越好。因為對誤差取了平方所以更重視那些遠離中心的點。

一種可以肯定降低sse的方法是增加簇的個數。但這違背了聚類的目標。因為聚類是在保持目標簇不變的情況下提高聚類的質量。

現在思路明了了我們首先以縮小sse為目標改進演算法。

二分k均值

為了克服k均值演算法收斂於區域性的問題,提出了二分k均值演算法。該演算法首先將所有的點作為乙個簇,然後將該簇一分為二。之後選擇其中乙個簇繼續劃分,選擇哪個簇進行劃分取決於對其劃分是否可以最大程度降低sse值。

偽**如下:

將所有的點看成乙個簇

當簇數目小於k時

對於每乙個簇

計算總誤差

在給定的簇上面進行k均值聚類(k=2)

計算將該簇一分為二後的總誤差

選擇使得誤差最小的那個簇進行劃分操作

// spectral-cluster.cpp : 定義控制台應用程式的入口點。

//#include "stdafx.h"

#include #include#include#include#includeusing namespace std;

//template class kmeans

}public:

kmeans() };

//template void kmeans::init()

bb.insert(id);

center[i].resize(dim);

for (int j = 0; j < dim; j++)

center[i][j] = dataset[id][j]; }}

bool kmeans::isfinish()

return error < threshold ? true : false;

}void kmeans::assign()

} new_cluster_id[belongto].insert(j);

} for (int i = 0; i < k; i++) }

}double kmeans::distance(centroid cen, int k2)

void kmeans::split(vector>&clusters, int kk)

}#define delta 1

vectortpc1, tpc2;

tpc1.resize(dim);

tpc2.resize(dim);

for (int i = 0; i < dim; i++)

for (set::iterator it = clusters[th].begin(); it != clusters[th].end(); it++) }

_asserte(!clusters[kk].empty());

for (set::iterator it = clusters[kk].begin(); it != clusters[kk].end(); it++)

clusters[th].erase(*it);

}void kmeans::update_centers()

for (int m = 0; m < dim; m++)

temp[m] /= new_cluster_id[i].size();

new_center[i] = temp; }}

show_result();

}void kmeans::show_result()

cout << endl << endl;

} _asserte(num == dataset.size());

}int _tmain(int argc, _tchar* argv)

kmeans聚類 c 實現

num class 聚類數 num data 資料個數 dimension 資料維度 每個資料是多少維的 data 待聚類資料指標 cluster center 聚類中心指標 max error 前後兩次誤差降低到此值迭代終止 max iters 最大迭代次數 1 隨機初始化聚類中心 2 根據聚類中...

python 實現kmeans聚類

程式設計中在做數值相等判斷的時候,直接使用 判斷並不可靠。實際上經過運算後的兩個值 浮點型 並不可能完全一致,可能會因為小數點後的些許差異導致判斷為false。比如 1 print1e 5 1e 6 這肯定是false,但是實際這兩個值可以看作近似相等。在kmeans中判斷是否結束迴圈,就是判斷重新...

K means聚類 的 Python 實現

k means聚類 的 python 實現 k means聚類是乙個聚類演算法用來將 n 個點分成 k 個集群。演算法有3步 1.初始化 k 個初始質心會被隨機生成 2.分配 k 集群通過關聯到最近的初始質心生成 3.更新 重新計算k個集群對應的質心 分配和更新會一直重複執行直到質心不再發生變化。最...