?? all.m
字號:
clear all
tic
k=3; %類別數
x=xlsread('Iris.xls');
[n,d] = size(x);
nc=[x(1,:);x(51,:);x(121,:)]; %初始聚類中心
cid = zeros(1,n); %用于存儲聚類結果
oldcid = ones(1,n);
nr = zeros(1,k);
maxgn= 100; %最大迭代次數
iter = 1;
while iter < maxgn
for i = 1:n %計算每個數據到聚類中心的距離
dist = sum((repmat(x(i,:),k,1)-nc).^2,2);
[m,ind] = min(dist); %將當前聚類結果存入cid中
cid(i) = ind;
end
for i = 1:k
ind = find(cid==i);%找到每一類的所有數據,計算他們的平均值,作為下次計算的聚類中心
nc(i,:) = mean(x(ind,:));
nr(i) = length(ind); % 統計每一類的數據個數
end
iter = iter + 1;
end
maxiter = 2;
iter = 1;
move = 1;
while iter < maxiter & move ~= 0
move = 0;
for i = 1:n % 對所有的數據進行再次判斷,尋求最佳聚類結果
dist = sum((repmat(x(i,:),k,1)-nc).^2,2);
r = cid(i); % 將當前數據屬于的類給r
dadj = nr./(nr+1).*dist'; % 計算調整后的距離
[m,ind] = min(dadj); % 找到該數據距哪個聚類中心最近
if ind ~= r % 如果不等則聚類中心移動
cid(i) = ind; % 將新的聚類結果送給cid
ic = find(cid == ind); % 重新計算調整當前類別的聚類中心
nc(ind,:) = mean(x(ic,:));
move = 1;
end
end
iter = iter+1;
end
centers = nc;
for ii=1:3
c=0;
for i=(50*(ii-1)+1):(50*ii)
if(cid(i)==ii) % 判斷分到第一類中的樣本是否正確
c=c+1; % C記錄分類正確的個數
end
end
str=num2str(ii);
s=(c/50)*100; % 求第一類分類正確的百分比
s=num2str(s);
disp(['第',str,'類的分類正確率為:',s,'%']);
end
disp('屬于第一類的數據有:{')
j=1;
for i=1:150,
if cid(i)==1,
p1(j)=i; %將屬于第一類的數據寫入數組p1,便于輸出
j=j+1;
end
end
disp(p1)
disp('}')
disp('屬于第二類的數據有:{')
j=1;
for i=1:150,
if cid(i)==2,
p2(j)=i; %將屬于第二類的數據寫入數組p2,便于輸出
j=j+1;
end
end
disp(p2)
disp('}')
disp('屬于第三類的數據有:{')
j=1;
for i=1:150,
if cid(i)==3,
p3(j)=i; %將屬于第三類的數據寫入數組p3,便于輸出
j=j+1;
end
end
disp(p3)
disp('}')
t4=toc
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -