1.聚类分析基础
function [ distance ] = step1_mission( v1, v2 )
%%%%%%%%%% Begin %%%%%%%%%%
[m,p]=size(v1);
[n,p]=size(v2);
distance=zeros(m,n);
for mm=1:m
for nn=1:n
distance(mm,nn)=sqrt(sum((v1(mm,:)-v2(nn,:)).^2));
end
end
%%%%%%%%%% End %%%%%%%%%%
end
2.基于欧式距离的 K-means 聚类法
function [output_c] = step2_mission( vs, init_c )
% 读取样本个数,特征维度,初始化类心
[sample_num,~] = size(vs); % sample_num读取样本个数
[center_num, center_d] = size(init_c); % center_num类心个数,center_d 特征维度大小
old_c = init_c;
new_c = init_c;
% K-means 算法迭代部分
while 1
% 计算样本到类心欧式距离,并根据欧式距离进行分类
%%%%%%%%%% Begin %%%%%%%%%%
for i=1:sample_num
infer=99999;
for j=1:center_num
dist=euclidean_dist(vs(i,:),init_c(j,:));
if dist<infer
infer=dist;
classify(i)=j;
end
end
end
%%%%%%%%%% End %%%%%%%%%%
% 初始化新类心
new_c = zeros(center_num, center_d);
new_c_count = zeros(1,center_num);
% 使用重心法计算计算新类心
for idx = 1:sample_num
new_c(classify(idx),:) = new_c(classify(idx),:) + vs(idx,:);
new_c_count(classify(idx)) = new_c_count(classify(idx)) + 1;
end
new_c = new_c./((new_c_count')*ones(1, center_d));
% 判断是否收敛,阈值为0.01,是则结束迭代,否则更新类心继续迭代
%%%%%%%%%% Begin %%%%%%%%%%
flag=1;
for i=1:center_num
for j=1:center_d
if old_c(i,j)-new_c(i,j)>0.01
flag=0;
end
end
end
if flag
break;
else
old_c=new_c;
end
%%%%%%%%%% End %%%%%%%%%%
end
% 返回聚类类心作为结果
output_c = new_c;
end
function distance = euclidean_dist(v1, v2)
% 请将任务一中计算欧式距离的语句补充于此
%%%%%%%%%% Begin %%%%%%%%%%
[m,p]=size(v1);
[n,p]=size(v2);
distance=zeros(m,n);
for mm=1:m
for nn=1:n
distance(mm,nn)=sqrt(sum((v1(mm,:)-v2(nn,:)).^2));
end
end
%%%%%%%%%% End %%%%%%%%%%
end