kmeans matlab算法實現


function kmeans()
clear all;
clc;
k=3;%k為聚類個數
x = 0.8 + sqrt(0.01) * randn(100,2); %隨機生成數據集
y = 0.2 + sqrt(0.02) * randn(100,2);
z= 0.5 + sqrt(0.01) * randn(100,2);

% size(x)= 100,2
% plot(x(:,1),x(:,2),'+r',y(:,1),y(:,2),'+b',z(:,1),z(:,2),'+g');
%x1=x(:,1);x2=x(:,2); 從x這個矩陣中取出第一列賦給x1,再從x矩陣中取出第二列賦給x2。執行后x1和x2是兩個列向量,分別是x這個矩陣第一列和第二列。
% axis([0,1,0,1]);xlabel('red');ylabel('acc');title('');
D=[x;y;z]; %得到數據集
% size(D)=(300.2)
%plot(D(:,1),D(:,2),'+r'); %可查看初始數據集的分布
u=randperm(size(D,1),k);%隨機選k個向量作為初始向量
%p = randperm(n,k) 返回行向量,其中包含在 1 到 n(包括二者)之間隨機選擇的 k 個唯一整數。
u=D(u,:);

c=zeros(size(D,1),1);%存放聚類標簽
distance=zeros(k,1);%存放樣本與均值向量的距離。

 

while 1 %循環開始
mark=0;%標記是否有均值向量更新
for i=1:size(D,1) %size(D,1)=300
for j=1:k
distance(j)=sqrt((D(i,1)-u(j,1))^2+(D(i,2)-u(j,2))^2);%計算樣本與均值向量的距離 此時u是確定的
distance(j)%產生三個距離,要取最小

end
% distance %是三元素組,(1,3)
% str = 'Hello World!'
[~,m]=min(distance); %如何因為距離而找到標簽123??? 此時m的值也已經確定 m只能等於1 ,2 ,3 ,
%只保留distance 1元數組 的第二個分量的坐標,也就是distance列元素的位置給m,
%因為是按照1 2 3 的順序求的地址,所以也就是把相應的標簽給了m
%min(distance)
% m
% str = 'shange!'

c(i)=m; %把樣本的划分到距離最近的簇 此處在分類

%c(i)
% str = 'tx'
% size(distance) =(3,1) 因為k=3
% size(c(i))=(1,1)
%size(c)=(300,1)
%c(i) %永遠等於1或者2或者3
end






u1=zeros(k,2); %新的均值向量
for i=1:k %三個均值向量都要更新
u1(i,1)=sum(D(find(c(:)==i),1))/size(find(c(:)==i),1);%計算新的均值向量
% size(find(c(:)==i),1)是每類樣本的個數
% sum(D(find(c(:)==i),1))是同一類樣本的橫坐標的和
u1(i,2)=sum(D(find(c(:)==i),2))/size(find(c(:)==i),1);%計算新的均值向量
size(c)
if u(i,1)~=u1(i,1)||u(i,2)~=u1(i,2)
mark=1;
u(i,1)=u1(i,1);%更新均值向量u 跳到while1
u(i,2)=u1(i,2);
end
end
if mark==0
break;
end
end
a=D(find(c(:)==1),:); %根據簇標簽來分類,不同的類別用不同的顏色
b=D(find(c(:)==2),:);
e=D(find(c(:)==3),:);
plot(a(:,1),a(:,2),'+k',b(:,1),b(:,2),'+b',e(:,1),e(:,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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM