K means聚類 matlab簡單實現及解析

2021-09-28 12:28:35 字數 1852 閱讀 4124

k-means基本思想:

優先設定分為k類,初始隨機分配k個中心。

計算每個點到每個中心的距離,分配到離自己最近的那個中心(貼上標籤)。

分配完後計算每一類的均值,並重新分配中心。

重複上兩步,直到中心點不再更改。

以下**參考

稍作修改並加以注釋:

function kmeanstest()

clear all;

clc;

%聚類個數為3

k = 3;

%初始化資料

x = 0.8 + sqrt(0.01) * randn(200,2);% randn(m.n)返回乙個m*n的隨即向矩陣

y = 0.2 + sqrt(0.02) * randn(200,2);

z = 0.5 + sqrt(0.02) * randn(200,2);

%plot(x(:,1),x(:,2),'+r',y(:,1),y(:,2),'+b',z(:,1),z(:,2),'+g');%取矩陣一二列並畫出

%axis([0,1,0,1]);xlabel('red');ylabel('acc');title('');%座標軸的設定

d = [x;y;z];%資料集

%plot (d(:,1),d(:,2),'+r');%檢視初始資料集分布情況(畫圖)

u = randperm(size(d,1),k);%隨機選取k個初始中心點

u = d(u,:);%完整資料

c = zeros(size(d,1),1);%存放聚類標籤

distance = zeros(k,1);%存放資料與中心點的距離

while 1

mark = 0;%標記

for i=1:size(d,1)%d所有資料

for j=1:k%k類

distance(j) = sqrt((d(i,1)-u(j,1))^2 + (d(i,2)-u(j,2))^2);%到中心點的距離

end[~,m] = min(distance);%最小賦給m

c(i) = m; %資料貼上標籤

endu1 = zeros(k,2);%新的中心點

for i=1:k

u1(i,1) = sum(d(find(c(:) == i),1))/size(find(c(:)==i),1);%計算新的中心點(i標籤的第一列資料之和除以個數)

u1(i,2) = sum(d(find(c(:) == i),2))/size(find(c(:)==i),1);%計算新的中心點

if u(i,1) ~= u1(i,1) || u(i,2) ~= u1(i,2)%若有更新,即與上一次值不一樣

mark = 1;%標記更新

u(i,1) = u1(i,1);%更新

u(i,2) = u1(i,2);

endend

if mark == 0%若沒有更新,跳出迴圈

break;

endendx = d(find(c(:) == 1),:);

y = d(find(c(:) == 2),:);

z = d(find(c(:) == 3),:);

plot(x(:,1),x(:,2),'+y',y(:,1),y(:,2),'+b',z(:,1),z(:,2),'+g',u(1,1),u(1,2),'*r',u(2,1),u(2,2),'*r',u(3,1),u(3,2),'*r');

axis([0,1,0,1]);xlabel('red');ylabel('acc');title('');

end

結果:

Matlab實現k means聚類演算法

k means是聚類中的乙個十分經典的演算法,具體的思想可以參考andrew ng的講義 the k means clustering algorithm 這裡不再贅述。需要用到matlab中的核心函式kmeans,具體用法可以參考matlab命令 doc kmeans idx kmeans x,k...

kmeans聚類及Matlab實現

kmeans k均值聚類 是一種常用的聚類演算法,因其簡單且效能還算良好而受廣泛應用。kmeans聚類的中心思想是 確定k個類,計算模式特徵向量到每個聚類中心的 距離 將特徵向量歸併到距離最小的聚類中心所在的類中。把每一類的平均向量特徵的均值作為新的類心。最後,使得樣本與類均值的誤差平方和最小。步驟...

MATLAB實現Kmeans聚類演算法

這是我練習的第乙個機器學習的演算法,寫的比較簡單,肯定也有一些小錯誤。也參看了很多其他人的 現在貼出來算是我學習的乙個歷程啦。clear all close all clc data1 normrnd 0,0.25,100,2 生成符合 data2 normrnd 1.25,0.5,100,2 da...