我写的代码如下,得不出答案啊....我要疯了。。。求大神!
function km1(k,A)
warning off
[n,p]=size(A);%输入数据有n个样本,p个属性
cid=ones(k,p+1);%聚类中心组成k行p列的矩阵,k表示第几类,p是属性
%A(:,p+1)=100;
A(:,p+1)=0;
for i=1:k
cid(i,:)=A(i,:); %直接取前三个元祖作为聚类中心
cid;
end
Asum=0;
Csum2=NaN;
e=1;
times=1;
P=0.01;
while e>0.000001 || e<-0.000001
times=times+1; %计算每个向量到聚类中心的欧氏距离
for i=1:n
for j=1:k
dist(i,j)=sqrt(sum((A(i,:)-cid(j,:)).^2));%欧氏距离
end
%A(i,p+1)=min(dist(i,:));%与中心的最小距离
[x,y]=find(dist(i,:)==min(dist(i,:)));
[c,d]=size(find(y==A(i,p+1)));
if c==0 %说明聚类中心变了
A(i,p+1)=y(1,1);%重新分配聚类结果
A
else
continue;
end
end
i
for i=1:n
for j=1:k
P1=sqrt(sum((A(i,:)-cid(j,:)).^2)/n-1);
end
end
P1
for j=1:k
Asum=0;
[r,c]=find(A(:,p+1)==j);
cid(j,:)=mean(A(r,:),1);%新的聚类中心
for m=1:length(r)
Asum=Asum+sqrt(sum((A(r(m),:)-cid(j,:)).^2));
end
Csum(1,j)=Asum;
end
sum(Csum(1,:))
%if sum(Csum(1,:))>Csum2
% break;
%end
Csum2=sum(Csum(1,:));
Csum;
cid; %得到新的聚类中心
for j=1:k
[r,b]=find(A(:,p+1)==j);
for m=1:length(r)
dist1(m,j)=sqrt(sum ((A(r(m),:)-cid(j,:)).^2));
end
end
[x,y]=find(max(max(dist1)));
[c,d]=find(A(:,p+1)==y);
c
C=A(c,:)
C
dist2=pdist(C,'euclidean')
a=max(max(dist2))
[v,x]=find(dist2==a);
v
x
z=c(v(1))
q=c(x(1))
cid(y,:)= A(z,:)
A(q,p+1)= k+1
cid(k+1,:)= A(q,:)
cid
k=k+1
e=(P1-P)/P
P=P1
end
times
display('A矩阵,最后一列是所属类别');
A
for j=1:k
[a,b]=size(find(A(:,p+1)==j));
numK(j)=a;
end
numK
times;
xlswrite('data.xls',A); %把矩阵A写到excel文件中,保存在工作路径下
display('数据已保存为excel格式');