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個集群對應的質心 分配和更新會一直重複執行直到質心不再發生變化。最...