C 實現二維資料的k means聚類

2021-09-24 07:27:10 字數 1674 閱讀 2220

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 會從它得到的訓練集中進行 學習 從而具備對未知資料進行...