這是我練習的第乙個機器學習的演算法,寫的比較簡單,肯定也有一些小錯誤。也參看了很多其他人的**。現在貼出來算是我學習的乙個歷程啦。
clear all;close all;clc;
data1=normrnd(0,0.25,100,2); %生成符合
data2=normrnd(1.25,0.5,100,2);
data3=normrnd(-1.25,0.5,100,2);
% 顯示資料
plot(data1(:,1),data1(:,2),'b.');
hold on;
plot(data2(:,1),data2(:,2),'r.');
plot(data3(:,1),data3(:,2),'g.');
grid on;
% 三類資料合成乙個資料類
data = [data1; data2; data3];
n=4;%設定聚類數目
[m,n]=size(data);%取矩陣的大小,m=300,n=2
cen=zeros(n,n);%設定初始聚類中心
dis=zeros(m,n,2);%設定初始存放最小歐式距離的矩陣,第一列存放距離每二列存放分類資訊
new_cen=ones(n,n);%更新後的聚類中心
% 選定初始質心
t = 1;
for i=1:n
cen(i,:)=data( randi(m,1),:);%第一次隨機產生聚類中心
endfor num=1:1000%迭代次數
for i=1:m %計算每一點的對聚類中心的距離,並選取最小的將其劃分為一類
for j=1:n
dis(i,j,1)=(data(i,1)-cen(j,1)).^2+(data(i,2)-cen(j,2)).^2;
%計算資料對某乙個聚類中心的距離
enddis(i,:,2)=min(dis(i,:,1)');%將距離矩陣的第二項取成第一項中的最小值
for j=1:n
if dis(i,j,1)==dis(i,j,2)
dis(i,:,2)=j;%將第二項的值設定成分類標號
endend
ends=0;
for i=1:n %重新分配新的中心點
for j=1:m
if dis(j,1,2)==i %如果標號一致,就將其分別一類,並加入中心值並計數
cen(i,:)=cen(i,:)+data(j,:);
s=s+1;
endend
new_cen(i,:)=cen(i,:)/(s+1); %更新中心值
s=0;
end
if norm(new_cen-cen)<0.01 %如果新質心的老質心符合很好,也結束迭代
break;
else cen= new_cen;
end
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實現K means聚類函式
function label my kmeans x,k m,n size x label zeros m,1 初始化label向量 u index randperm m,k 生成k個 1,m 範圍的隨機的不重複的正整數 u x u index,初始化均值向量 while true 迭代操作 dis...