问题描述
- 我的matlsb版本是2014版的,运行下面的m程序会报错
-
%N是数据一共分为多少类
%data是输入的不带分类标号的数据
%u是每一类的中心
%re是返回带标号的数据
function [u, re]=kmeans(data ,N)
[m, n]=size(data); %m是数据个数,n是数据维数
ma=zeros(n);%每一维最大的数
mi=zeros(n);%每一维最小的数
u=zeros(N,n);%随机初始化,最终迭代到每一类的中心位置
for i=1:n
ma(i)=max(data(:,i));%每一维最大的数
mi(i)=min(data(:,i));%每一维最小的数
for j=1:N
u(j,i)=ma(i)+(mi(i)-ma(i))*rand();%随机初始化,不过还是在每一维中初始化好些
end
endwhile 1
pre_u=u;%上一次求得的中心位置
for i=1:N
tmp{i}=[];%公式一中的x(i)-uj,为公式一实现做准备
for j=1:m
tmp{i}=[tmp{i};data(j,:)-u(i,:)];
end
end
quan=zeros(m,N);
for i=1:m %实现公式一
c=[];
for j=1:N
c=[c norm(tmp{j}(i,:))];
end
[junk, index]=min(c);
quan(i,index)=norm(tmp{index}(i,:));
end
for i=1:N %公式二的实现
for j=i:n
u(i,j)=sun(quan(:,i).*data(:,j))/sum(quan(:,i));
end
end
if norm(pre_u-u)<0.1 %不断迭代直到位置不再变化
break;
end
end
re=[];
for i=1:m
tmp=[];
for j=1:N
tmp=[tmp norm(data(i,:)-u(j,:))];
end
[junk, index]=min(tmp);
re=[re;data(i,:) index];
end
end
//[m,n]=size(data);这一行会显示输入参数不足
解决方案
下面的sun应该是sum吧?
别的没看出有什么错误。
for i=1:N %公式二的实现
for j=i:n
u(i,j)=sun(quan(:,i).*data(:,j))/sum(quan(:,i));
end
end
解决方案二:
嗯,是的,说打错了,谢谢!
时间: 2024-11-02 18:23:34