k均值聚類

2022-07-22 14:33:16 字數 1629 閱讀 7673

k均值聚類就是利用歐氏距離的度量將距離相近的樣本分為k類

a. 假設有m個樣本,,首先隨機選擇k個樣本作為聚類的質心(要分成k類)

b. 然後對於每個樣本,計算它到每個質心的距離,將它歸類於距離最小的那個質心

c. 接著對初步分類的k個類別重新計算該類的質心,也就是對每個類別的樣本座標求平均

d. 重複 b 步和 c 步直到質心的座標不再改變或者變化小於設定值

%生成原始資料

clear;

x=zeros(100,2);

x(1:30,1:2)=randn(30,2);

x(31:70,1:2)=5+randn(40,2);

x(71:100,1:2)=10+randn(30,2);

plot(x(:,1),x(:,2),'g*') % 顯示原始樣本資料圖

hold on;

k = 3; %聚類數

[m,n] = size(x); %獲得樣本數和維度

pre_centroids = x(randi(100,k,1),:); %初始的隨機質心

plot(pre_centroids(:,1),pre_centroids(:,2),'bo'); %畫出初始質心

figure

hold on;

plot(x(:,1),x(:,2),'g*')

sum_ = zeros(k,n); % 用來儲存每個類別樣本的座標累加和

num_ = zeros(k,1); % 用來記錄每個類別中的樣本個數

while 1

for i=1:m

dis = ;

%對於每個樣本,計算它到每個質心的距離

for j = 1:k

dis(j) = sum((x(i,:)-pre_centroids(j,:)).^2);

end[min_dis,min_idx] = min(dis); % 找到距離最小的那個質心的索引

sum_(min_idx,:) = sum_(min_idx,:)+ x(i,:);%累加每個類的樣本的座標

num_(min_idx,:) = num_(min_idx,:)+1;%類別中的樣本數累加

endfor i=1:k

centroids(i,:) = sum_(i,:)./num_(i,:); %重新計算質心

endif norm(centroids-pre_centroids)<0.001 %退出迭代的條件

break;

endpre_centroids = centroids; %更新質心

endplot(pre_centroids(:,1),pre_centroids(:,2),'b+'); %輸出聚類後的圖

初始的隨機質心:

聚類後的質心:

K 均值聚類

剛剛寫了篇分級聚類的,趁著餘熱,再寫一下關於k 均值聚類的。為了突出k 均值聚類的特點,先黑一下分級聚類。跟k 均值聚模擬起來,分級聚類演算法有一下缺點 第一,的那個沒有額外投入的時候,樹形試圖是不會真正將資料拆分成不同組的。第二,分級聚類的計算演算法計算量相當大。當兩個節點合併之後,節點之間的距離...

k均值聚類演算法

輸入 簇的數目k和包含n個物件的資料庫。輸出 k個簇,使平方誤差準則最小。演算法步驟 1.為每個聚類確定乙個初始聚類中心,這樣就有k 個初始聚類中心。2.將樣本集中的樣本按照最小距離原則分配到最鄰近聚類 3.使用每個聚類中的樣本均值作為新的聚類中心。4.重複步驟2.3直到聚類中心不再變化。5.結束,...

k均值聚類 K means

分類作為一種監督學習方法,要求必須事先明確知道各個類別的資訊,並且斷言所有待分類項都有乙個類別與之對應。但是很多時候上述條件得不到滿足,尤其是在處理海量資料的時候,如果通過預處理使得資料滿足分類演算法的要求,則代價非常大,這時候可以考慮使用聚類演算法。聚類屬於無監督學習,相比於分類,聚類不依賴預定義...