現有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算法,該算法採用簇中最接近簇均值的點來表示簇,更具備魯棒性。