资源简介

K-means算法的Matlab实现,内含经典Iris数据集,需要下载者将其转化为矩阵,作为算法的参数输入。

资源截图

代码片段和文件信息

function result=K_means(datakinitset)
    [rowscolumns]=size(data);%获取数据的行列
    for i=1:k
    data(initset(i)columns+1)=i;%初始聚簇代表确定
    oldClusetCenter(i:)=data(initset(i)1:columns);
    oldClusterRows{i}=initset(i);%初始第i簇的行号
    end
    %结束标记
    flag=1;
    %迭代次数
    iteratenum=0;
    
    while(flag==1)
        iteratenum=iteratenum+1;
        fprintf(‘-第%d次迭代:\n‘iteratenum);
        flag=0;
       %计算欧几里得距离,划分簇
       for ii=1:rows
           for jj=1:k
                res=(data(ii1:columns)-oldClusetCenter(jj:)).*(data(ii1:columns)-oldClusetCenter(jj:));
                dist(jj)=sqrt(sum(res));%dist矩阵存放欧几里得距离
           end
           data(iicolumns+1)=find(dist==min(dist));%最小欧几里得距离,划分簇
           dist(1:k)=0;%距离置零
       end
       %计算新的聚簇代表
       for cluster=1:k
           newClusterRows{cluster}=find(data(:columns+1)==cluster);%用cell来存储第k簇的行号,不能用数组
           newClusetCenter(cluster:)=mean(data(newClusterRows{cluster}1:columns));
           if (all(ismember(newClusterRows{cluster}oldClusterRows{cluster}))&&all(ismember(oldClusterRows{cluster}newClusterRows{cluster})))~=1%判断每一簇的行号是否发生变化
               oldClusterRows{cluster}=newClusterRows{cluster};
               oldClusetCenter(cluster:)=newClusetCenter(cluster:);
               flag=1;
           end
           fprintf(‘-----第%d簇的聚簇代表坐标为:\n‘cluster);
           disp(newClusetCenter(cluster:));
           fprintf(‘--------在本簇的元组行号为:\n‘);
           disp(newClusterRows{cluster}‘);
       end
    end
end

 属性            大小     日期    时间   名称
----------- ---------  ---------- -----  ----

     文件       1679  2018-03-12 15:10  K_means.m

     文件       4700  2018-03-12 16:05  Iris数据集.txt

----------- ---------  ---------- -----  ----

                 6379                    2


评论

共有 条评论