matlab iris kmeans,K-means算法用于Iris数据集

首先是K-menas算法函数,这里使用3维形式,尽管Iris数据集有4维,但是考虑到4维数据无法绘制图像,所以在这里选择三维。

function [ resX,resY,resZ,recordd] = Kmeans( x,y,z,k )

%resX 存储结果

%resY

%resZ

%centerX 存储聚类中心点

%centerY

%centerZ

%oldcenterX 存储上一次的聚类中心,用于判断是否达到结束循环的条件

%oldcenterY

%oldcenterZ

%recordd 记录每个聚类中的元素个数

resX=zeros(k,length(x));

resY=zeros(k,length(y));

resZ=zeros(k,length(x));

centerX=zeros(1,k);

centerY=zeros(1,k);

centerZ=zeros(1,k);

oldcenterX=zeros(1,k);

oldcenterY=zeros(1,k);

oldcenterZ=zeros(1,k);

recordd=zeros(1,k);

for i=1:k

%生成随机聚类中心

centerX(i)=x(round(rand()*length(x)));

centerY(i)=y(round(rand()*length(x)));

centerZ(i)=z(round(rand()*length(x)));

%保证聚类中心不能够重复

if(i > 1 && centerX(i) == centerX(i-1) && centerY(i) == centerY(i-1)&&centerZ(i) == centerZ(i-1))

i=i-1;

end

end

while 1

resX(:)=0; %将每个聚类的点清空,用新的聚类中心重新进行聚类

resY(:)=0;

resZ(:)=0;

recordd(:)=0;

for i=1:length(x)

%给每一个点分类

belong=1;

for j=2:k

%采用欧式距离,寻找到当前点最近的聚类中心

if(power((x(i)-centerX(belong)),2)+power((y(i)-centerY(belong)),2)+power((z(i)-centerZ(belong)),2)>power((x(i)-centerX(j)),2)+power((y(i)-centerY(j)),2)+power((z(i)-centerZ(j)),2))

belong=j;

end

end

%当前聚类中心内部点数加1

recordd(belong)=recordd(belong)+1;

%将此点放入聚类中心中

resX(belong,recordd(belong))=x(i);

resY(belong,recordd(belong))=y(i);

resZ(belong,recordd(belong))=z(i);

end

%存放聚类中心

oldcenterX=centerX;

oldcenterY=centerY;

oldcenterZ=centerZ;

%更新聚类中心

for i=1:k

%recordd(i)=0表示此类内部无点,则保持聚类中心不变

if(recordd(i)==0)

continue

end

centerX(i)=sum(resX(i,:))/recordd(i);

centerY(i)=sum(resY(i,:))/recordd(i);

centerZ(i)=sum(resZ(i,:))/recordd(i);

end

%如果聚类中心没有改变就停止

if mean([centerX == oldcenterX centerY == oldcenterY centerZ==oldcenterZ]) == 1

break;

end

end

centerX

centerY

centerZ

%下面只是优化内存

maxPos = max(recordd);

resX = resX(:,1:maxPos);

resY = resY(:,1:maxPos);

resZ = resZ(:,1:maxPos);

end

然后是读取数据和显示函数

由于.data数据集本身matlab读取较为困难,所以将其转化为了.txt形式

%读取Iris数据

[data1,data2,data3,data4,data5]=textread('Iris.txt','%f%f%f%f%s','delimiter',',');

%选取k=3

k = 3;

%调用函数,这里选择的是feature1、feature2、feature4

[resX resY resZ record] = Kmeans(data1,data2,data4,k);

%绘制图像

for i = 1:length(record)

plot3(resX(i,1:record(i)),resY(i,1:record(i)),resZ(i,1:record(i)),'*')

hold on

end

% 下面是标记出每一个类别的类别代表点

for i = 1:length(record)

plot3(mean(resX(i,1:record(i)),2)',mean(resY(i,1:record(i)),2)',mean(resZ(i,1:record(i)),2)','Marker','square','Color','k','MarkerFaceColor','k','LineStyle','none')

end

Result

89651be19f7b?from=groupmessage

124.jpg

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Kmeans聚类算法是一种经典的无监督学习算法,它通过将数据分成若干个簇来实现聚类。在Kmeans算法中,簇的个数是预先设定的,算法迭代地更新每个簇的质心,并将每个数据点划分到最近的质心所在的簇中。 下面我们将介绍如何使用MATLAB实现基于数据分布密度的Kmeans聚类算法。 首先,我们需要准备一个数据集。这里我们使用MATLAB自带的iris数据集。代码如下: ``` load fisheriris X = meas; ``` 接着,我们需要设定簇的个数K以及迭代次数maxit。代码如下: ``` K = 3; % 簇的个数 maxit = 100; % 最大迭代次数 ``` 然后,我们需要初始化每个簇的质心。这里我们使用随机选择的方法来初始化质心。代码如下: ``` idx = randperm(size(X,1)); centroids = X(idx(1:K),:); ``` 接着,我们进入算法的主要循环。在每次迭代中,我们需要计算每个数据点到每个簇质心的距离,并将每个数据点划分到最近的簇中。然后,我们需要更新每个簇的质心。代码如下: ``` for i = 1:maxit % 计算每个数据点到每个簇质心的距离 D = pdist2(X,centroids); % 将每个数据点划分到最近的簇中 [~,labels] = min(D,[],2); % 更新每个簇的质心 for j = 1:K centroids(j,:) = mean(X(labels==j,:),1); end end ``` 最后,我们可以将聚类结果可视化。代码如下: ``` gscatter(X(:,1),X(:,2),labels,'rgb') hold on plot(centroids(:,1),centroids(:,2),'kx','MarkerSize',10,'LineWidth',2) legend('Cluster 1','Cluster 2','Cluster 3','Centroids') ``` 完整代码如下: ``` load fisheriris X = meas; K = 3; % 簇的个数 maxit = 100; % 最大迭代次数 idx = randperm(size(X,1)); centroids = X(idx(1:K),:); for i = 1:maxit % 计算每个数据点到每个簇质心的距离 D = pdist2(X,centroids); % 将每个数据点划分到最近的簇中 [~,labels] = min(D,[],2); % 更新每个簇的质心 for j = 1:K centroids(j,:) = mean(X(labels==j,:),1); end end gscatter(X(:,1),X(:,2),labels,'rgb') hold on plot(centroids(:,1),centroids(:,2),'kx','MarkerSize',10,'LineWidth',2) legend('Cluster 1','Cluster 2','Cluster 3','Centroids') ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值