k-means 演算法是一種簡單有效的無監督學習方法,它可以有效地將多維空間(用n表示)中的點聚成乙個個緊密的簇。
k-means演算法的優化目標是使求出k個中心點,使每乙個點到該點的歐氏距離平方之和盡量小。
簡單來說就是把乙個分到乙個類中的所有資料點的每一維相加,得乙個向量。然後,該向量的每一維除以該類的點的個數。這樣得的向量就是該類的中心(centroid).
演算法的思路如下:
1. 初始化k個中心點。
這k個點可以是在所有輸入資料點中隨機抽取的,也可以是取前k個點,也可以是從n維空間中任意乙個點。初始聚類中心點的選擇,對最終聚類結果有一定影響;
2. 對任意乙個資料點,求與它最近的中心點,並認為該資料點屬於該中心點所代表的類。對於m(假設共有m個資料點)個資料點,分別計算每個點與k個當前的中心點的歐氏距離平方值,點x_i與哪個中心點(如c_j)的歐氏距離平方最小那麼它就分成該類。(該過程可以求出一些指標,用於終止程式。如,求出整體歐氏距離之和);
3. 更新每個類的中心點。
4. 由 2 得出的指標判斷是否可以終止:否,進行 2 ;是,終止,並給出中心點資訊。
#include #include #include #include #include using namespace cv;
using namespace std;
#define k 3
cv::scalar colorbar=, ,
, , ,
};//存放元組的屬性資訊
struct tuple ;
//計算兩個元組間的歐幾裡距離
float getdistxy(tuple t1, tuple t2)
//根據質心,決定當前元組屬於哪個簇
int clusteroftuple(tuple means, tuple tuple)
} //cout<
t.attr1 = meansx / num;
t.attr2 = meansy / num;
return t;
//cout<
cout << endl;
} float oldvar = -1;
float newvar = getvar(clusters, means);
while (abs(newvar - oldvar) >= 0) //當新舊準則函式值不發生明顯變化時,演算法終止
cout << endl;
} }}int main()
int count = 0;
vectortuples;
tuple tuple;
//從檔案流中讀入資料
while (!infile.eof())
} //輸出檔案中的元組資訊
for (vector::size_type ix = 0; ix != tuples.size(); ++ix)
cout << "(" << tuples[ix].attr1 << "," << tuples[ix].attr2 << ")" << " ";
cout << endl;
kmeans(tuples);
return 0;
}
結果如圖:
kmeans聚類 c 實現
num class 聚類數 num data 資料個數 dimension 資料維度 每個資料是多少維的 data 待聚類資料指標 cluster center 聚類中心指標 max error 前後兩次誤差降低到此值迭代終止 max iters 最大迭代次數 1 隨機初始化聚類中心 2 根據聚類中...
C 實現Kmeans扁平聚類
隨機生成50個2維向量,將他們聚成3個簇,然後在平面上表示出來 kmeans,h pragma once include include using namespace std struct point struct vect struct cluster class kmeans void qce...
k means聚類演算法C 實現
clustering 中文翻譯作 聚類 簡單地說就是把相似的東西分到一組,同 classification 分類 不同,對於乙個 classifier 通常需要你告訴它 這個東西被分為某某類 這樣一些例子,理想情況下,乙個 classifier 會從它得到的訓練集中進行 學習 從而具備對未知資料進行...