基於K-means算法的樹葉分類

       現有n片不一樣種類的樹葉,編寫程序,完成對它們的自動分類。採用基於K-means算法的方法來完成分類。 算法

       K-means算法的處理流程以下。首先,隨機或按必定規則選擇k個對象,每一個對象表明一個簇的初始均值或中心。對剩餘的每一個對象,根據其與各個簇均值的距離,將它指派到與之最相近的簇中。而後計算每一個簇新的均值。不斷重複這個過程,直到數據的劃分再也不發生變化。 函數

       整個分類算法的僞代碼: code

input:n //樣本數
      k //欲分類數
      mrows //行像素
      ncols //列像素
for i=1 to n
      讀取圖片i;
      改變圖片i的像素數爲mrows*ncols;
      將真彩圖像轉換爲灰度圖;
      將像素矩陣轉換爲行向量leafs(i);
end;
調用K-means算法對leafs矩陣進行自動聚類;
返回聚類結果;
end;
        Matlab源代碼:

function idx=kmean( )
n=input('輸入樣本總數n:   ');
k=input('輸入要分紅的類數k:   ');
mrows=input('輸入行像素mrows:     ');
ncols=input('輸入行像素ncols:     ');
leaf=cell(1,n);
leafs=rand(n,mrows*ncols);
for i=1:n
    imageName=strcat(num2str(i),'.jpg'); %圖片名爲1.jpg,2.jpg……n.jpg
    leaf{i}=imread(imageName); %讀取圖片
    leaf{i}=imresize(leaf{i},[mrows,ncols]); %統一圖片的像素數
    leaf{i}=rgb2gray(leaf{i}); %真彩圖轉爲灰度圖
    leafs(i,:)=reshape(leaf{i},1,mrows*ncols); %將矩陣轉成向量,全部向量統一保存在leafs矩陣中
end
idx=kmeans(leafs,k);%調用kmeans函數,返回分類結果
end
實驗樣本(n=12,k=5):

分類結果: 對象

(1) 圖片

(2) input

(3) io

(4) function

(5) class

由實驗結果可見,分類效果基本使人滿意。 程序

不足與改進:

1.K-means算法須要用戶首先肯定k值,肯定不恰當的k值將使得分類效果較差。K-means算法是一種典型的劃分聚類方法,聚類結果能夠用層次聚類方法做爲驗證,層次聚類方法具備自底向上、逐步聚類的優勢,兩相結合,能夠取得使人滿意的聚類結果。

2.K-means算法初始化採用隨機取點的方法,可能會使算法產生收斂到局部最優而難以發現全局最優。能夠採用模擬退火算法與K-means算法的結合來解決此問題[2]。

        3.K-means算法對於孤立點數據或噪聲數據是敏感的,少許的該類數據可以對平均值產生較大的影響。在處理有孤立點或噪聲的數據時,可採用K-medoids算法,該算法採用簇中最接近簇均值的點來表示簇,更具備魯棒性。
相關文章
相關標籤/搜索