基于K-means算法的树叶分类

现有n片不同种类的树叶,编写程序,完成对它们的自动分类。采用基于K-means算法的方法来完成分类。
       K-means算法的处理流程如下。首先,随机或按一定规则选择k个对象,每个对象代表一个簇的初始均值或中心。对剩余的每个对象,根据其与各个簇均值的距离,将它指派到与之最相近的簇中。然后计算每个簇新的均值。不断重复这个过程,直到数据的划分不再发生变化。
      整个分类算法的伪代码:

01
input:n //样本数
02
      k //欲分类数
03
      mrows //行像素
04
      ncols //列像素
05
for i=1 to n
06
      读取图片i;
07
      改变图片i的像素数为mrows*ncols;
08
      将真彩图像转换为灰度图;
09
      将像素矩阵转换为行向量leafs(i);
10
end;
11
调用K-means算法对leafs矩阵进行自动聚类;
12
返回聚类结果;
13
end;
        Matlab源代码:
01
function idx=kmean( )
02
n=input('输入样本总数n:   ');
03
k=input('输入要分成的类数k:   ');
04
mrows=input('输入行像素mrows:     ');
05
ncols=input('输入行像素ncols:     ');
06
leaf=cell(1,n);
07
leafs=rand(n,mrows*ncols);
08
for i=1:n
09
    imageName=strcat(num2str(i),'.jpg'); %图片名为1.jpg,2.jpg……n.jpg
10
    leaf{i}=imread(imageName); %读取图片
11
    leaf{i}=imresize(leaf{i},[mrows,ncols]); %统一图片的像素数
12
    leaf{i}=rgb2gray(leaf{i}); %真彩图转为灰度图
13
    leafs(i,=reshape(leaf{i},1,mrows*ncols); %将矩阵转成向量,所有向量统一保存在leafs矩阵中
14
end
15
idx=kmeans(leafs,k);%调用kmeans函数,返回分类结果
16
end
实验样本(n=12,k=5):


由实验结果可见,分类效果基本令人满意。

不足与改进:

1.K-means算法需要用户首先确定k值,确定不恰当的k值将使得分类效果较差。K-means算法是一种典型的划分聚类方法,聚类结果可以用层次聚类方法作为验证,层次聚类方法具有自底向上、逐步聚类的优点,两相结合,可以取得令人满意的聚类结果。

2.K-means算法初始化采用随机取点的方法,可能会使算法产生收敛到局部最优而难以发现全局最优。可以采用模拟退火算法与K-means算法的结合来解决此问题[2]。

        3.K-means算法对于孤立点数据或噪声数据是敏感的,少量的该类数据能够对平均值产生较大的影响。在处理有孤立点或噪声的数据时,可采用K-medoids算法,该算法采用簇中最接近簇均值的点来表示簇,更具有鲁棒性。

0 个评论

要回复文章请先登录注册