以前写的,今天翻到了。
3维指标可以实现绘图,有需要代码自取。
A=input("请输入需要聚类的矩阵A=");
color={'r*','y*','b*','g*','p*'};
%%定义不同类颜色
K=input("请输入聚类的簇数k=");
choose=input("指标在列(1)/行(2)上");
if choose~=1
A=A';
end
[m,n]=size(A);
disp(["共有",num2str(m),"个样本",num2str(n),"个指标"]);
if n<=3
plot3(A(:,1),A(:,2),A(:,3),"bo");
hold on;
end
disp("根据k++的特点随机选取K个相隔尽可能远的簇类")
I=zeros(1,K);%%初始化K个聚类中心
I(1)=randi([1,m],1,1);%%从m个样本点中随机抽取一个样本点作为初始聚类中心
plot3(A(I(1),1),A(I(1),2),A(I(1),3),"ro");%%标记聚类中心
center=A(I(1),:);
d=ones(K,m)*inf;%%初始化距离矩阵
for k=1:K
d(k,:)=zeros(1,m);
for j=1:m
d(k,j)=d(k,j)+sum((center-A(j,:)).^2);
%%第k个聚类中心距离各个样本点的距离
end
prob=min(d)./sum(min(d)); %%距离-概率
if k+1<=K
I(k+1)=randsrc(1,1,[1:m;prob]);
center=A(I(k+1),:);
plot3(A(I(k+1),1),A(I(k+1),2),A(I(k+1),3),"ro");
end
end
hold off;
for i=1:K
center(i,:)=A(I(i),:); %%转移聚类中心
end
count=input("请输入最大迭代次数count=");
class=zeros(count,m);%%存放每一次迭代后的结果
for each=1:count
for i=1:K
for j=1:m
d(i,j)=sum((A(j,:)-center(i,:)).^2);
%%d(i,j)表示第i类与第j个样本之间的距离
end
end
[min,class(each,:)]=min(d);%%找出距离聚类中心最近的每个样本的类
clear min;
for i=1:m
if n==3
plot3(A(i,1),A(i,2),A(i,3),char(color(class(each,i))));
hold on;
end
end
if each>1 %%防止数组越界
if class(each,:)==class(each-1,:)
break
end
end
pause(0.5)
end