niaoerfeiba 2015-10-29 10:58 采纳率: 0%
浏览 1429
已结题

我的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
end

while 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);这一行会显示输入参数不足

  • 写回答

2条回答 默认 最新

  • ysuwood 2015-10-29 11:37
    关注

    下面的sun应该是sum吧?
    别的没看出有什么错误。

         for i=1:N %公式二的实现
            for j=i:n
                u(i,j)=sun(quan(:,i).*data(:,j))/sum(quan(:,i));
            end
        end
    
    评论

报告相同问题?

悬赏问题

  • ¥15 微带串馈天线阵列每个阵元宽度计算
  • ¥15 keil的map文件中Image component sizes各项意思
  • ¥30 BC260Y用MQTT向阿里云发布主题消息一直错误
  • ¥20 求个正点原子stm32f407开发版的贪吃蛇游戏
  • ¥15 划分vlan后,链路不通了?
  • ¥20 求各位懂行的人,注册表能不能看到usb使用得具体信息,干了什么,传输了什么数据
  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 Centos / PETGEM
  • ¥15 划分vlan后不通了
  • ¥20 用雷电模拟器安装百达屋apk一直闪退