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...