kmeans是簡單的聚類分析演算法。其常用在資料分析與人工智慧中。
簡單說,kmeans演算法就是把乙個集合中的東西分為若干子集,這幾個子集內的元素具有空間相近或者特點相近。
做法:1. 隨機選取k各中心點,生成對應的k個簇。
2. 遍歷所有的資料點,依據「距離』」將每乙個資料點劃分到最近的中心點所在的簇。
3. 計算每個簇所有的資料點的平均值,並作為該簇新的中心。
4. 重複2-3步,直到這k個簇的中心點不再變化,或者達到我們規定的迭代次數。
注意:1. kmean演算法思想本身比較簡單,但是設定k數量與初始中心點卻比較難以確定。
2. 需要判斷處理空聚類以防某個初始中心點設定不合理。
3. 這裡的「距離」指歐氏距離或者是余弦相似度,也可以指某種特徵,不要被「距離」二字侷限
4. 每個資料點是幾維的,那麼資料中心也應該是幾維的,這裡kmeans可以想象成將高維空間中的若干個資料點分為若干團。(其實也有特殊情況)
kmeans++演算法,主要可以解決初始中心的選擇問題,不可解決k的個數。
kmeans++主要思想是選擇的初始聚類中心要盡量的遠。
做法:1. 在輸入的資料點中隨機選乙個作為第乙個聚類中心。
2. 對於所有資料點,計算它與最近的聚類中心的距離d(x)
3. 重新選擇乙個資料點作為聚類中心,選擇原則:d(x)較大的點被選為聚類中心的概率較大。
4. 重複2-3直到選出k個聚類中心。
5. 執行kmeans演算法。
ps:其初始中心的設定我在這直接取了資料點中最大與最小點的等分值,資料預處理部分**去掉。
題目是對乙個具有四波段的海洋遙感圖做聚類分析。
將整幅圖劃分為若干塊,然後對每個塊取其波段均值,然後做聚類分析。
#include #include #include #include #include //kmeans演算法
//資料預處理**已去除
using namespace std;
class map
void calc_row_column(int x,int y)
bool is_valid()
};class vector4
vector4()
};templateclass kcenter
typename list::iterator is_member(t_ map)
} return member.end();
} void push(t_ map)
void pop(t_ map)
} float distance_from_map(t_ samp)
void adjust_center()
for(int j=0; j<4; j++)
center[j] /= num; }
float all_distance()
return dist; }
private:
listmember; };
const int n_k = 4; //k中心個數
kcenterkcenters[n_k];
//尋找初始簇的質心
void find_centers(vector4 centers,int n,map maps,int n_maps)
} if(maps[i].which_center == -1) else if (maps[i].which_center != num_select)
} for(int i=0; i
分析結果為每種聚類賦一種顏色。
K means演算法及其優化
聚類演算法是一種典型的無監督學習演算法,主要用於將相似的樣本自動歸到乙個類別中。聚類演算法與分類演算法最大的區別是 聚類演算法是無監督的學習演算法,而分類演算法屬於監督的學習演算法。在聚類演算法中根據樣本之間的相似性,將樣本劃分到不同的類別中,對於不同的相似度計算方法,會得到不同的聚類結果,常用的相...
kmeans演算法及其實現
k 均值演算法能夠使聚類域中所有樣品到聚類中心距離平方和最小。其原理為 先取 k個初始聚類中心,計算每個樣品到這 k個中心的距離,找出最小距離,把樣品歸入最近的聚類中心,修改中心點的值為本類所有樣品的均值,再計算各個樣品到新的聚類中心的距離,重新歸類,修改新的中心點,直到新的聚類中心和上一次聚類中心...
K means演算法原理以及其缺點
k means是一種經典unsupervised的聚類演算法。其演算法描述如下 輸入 聚類個數 k,n個資料物件 輸出 每個資料物件所屬的聚類label 滿足方差最小 從n個資料物件中挑選出k個質心。計算n個資料物件距離不同質心的距離,並將n個資料物件劃分到與之距離最小的質心,形成新的k個聚類。重新...