視覺機器學習------K-means算法


K-means(K均值)是基於數據划分的無監督聚類算法。

一、基本原理

      聚類算法可以理解為無監督的分類方法,即樣本集預先不知所屬類別或標簽,需要根據樣本之間的距離或相似程度自動進行分類。簡單來說就是,給一堆數據讓你分類,但是你對這些數據的類別一無所知,因此,需要找到某種度量方式來比較這些數據之間的差異,從而將其分開來。

聚類算法可以分為基於划分的方法、基於聯通性的方法、基於概率分布模型的方法等,K-means屬於基於划分的聚類方法。

      基於划分的方法是將樣本集組成的矢量空間划分為多個區域{Si}i=1k,每個區域都存在一個區域相關的表示{ci}i=1k,通常稱為區域中心。對於每個樣本,可以建立一種樣本到區域中心的映射q(x):

其中1()為指示函數。

      根據建立的映射q(x),可以將所有樣本分類到相應的中心{ci}i=1k,得到最終的划分結果。如下圖所示:

 

      不同的基於划分的聚類算法的主要區別在於如何建立相應的映射方式q(x)。在經典的K-means算法中,映射是通過樣本與各中心之間的誤差平方和最小准則來建立的。

      假設有樣本集合D={xj}j=1n,xj∈Rd,K-means聚類算法的目標是將數據集划分為k(k<n)類:S={S1,S2,...,Sk},使划分后的k個子集合滿足類內的誤差平方和最小:

      其中:

      求解目標函數是一個經典的NP-hard問題,無法保證得到一個穩定的全局最優解。在Sturat Lloyd所提出的經典K-means聚類算法中,采取迭代優化策略,有效地求解目標函數的局部最優解。算法包括樣本分配、更新聚類中心等4個步驟。

     1.初始化聚類中心  c1(0),c2(0),...,ck(0),可選取樣本集的前k個樣本或者隨機選取k個樣本;

     2.分配各樣本xj到相近的聚類集合,樣本划分依據為:

式中i=1,2,...,k,p≠j。

     3.根據步驟2的分配結果,更新聚類中心

    4.若迭代達到最大迭代步數或者前后兩次迭代的差小於設定閾值ε,即,則算法結束;否則重復步驟2.

    K-means聚類算法中的步驟2和步驟3分別對樣本集合進行重新分配和重新計算聚類中心,通過迭代計算過程優化目標函數,實現類內誤差平方和最小。

二、算法改進

2.1 算法的計算復雜度分析

      首先,在樣本分配階段,需要計算kn次誤差平方和,計算復雜度為O(knd).其次,在更新聚類中心階段,計算復雜度為O(nd)。如果迭代次數為t,則算法的計算復雜度為O(kndt).因此K-means針對樣本個數n具有線性的計算復雜度,是一種非常有效的大數據聚類算法。其中:

2.2 聚類中心初始化的改進

      K-means對聚類中心的初始化比較敏感,不同初始化會帶來不同的聚類結果,這是因為K-means僅僅是對目標函數求取近似局部最優解,不能保證得到全局最優解,即在一定數據分布下聚類結果會因為初始化的不同產生很大偏差。

     在標准初始化K-means中,初始聚類中心采用隨機采樣方式,不能保證得到期望的聚類結果。為了獲得較好的聚類結果,可以多次隨機初始化聚類中心,得到多組結果進行對比和選擇。這么做會大大影響計算時間。

     簡單有效的改進方式是David Arthur提出的K-means++算法,該算法能夠有效產生初始的聚類中心,保證初始化后的K-means可以得到O(logk)的近似解,其理論證明可以參考文獻。首先隨機初始化一個聚類中心C={ci};然后通過迭代計算最大概率值:

     加入下一個聚類中心:

     直到選擇k個中心。

     K-means++算法的計算復雜度為O(knd),沒有增加過多的計算負擔,同時可以保證算法更有效地近似於最優解。

2.3 類別個數的自適應確定

      在經典的K-means算法中,聚類個數k需要預先設定,不具備自適應選擇能力,算法的每一步迭代都會單調地降低目標函數,在保持類別個數不變的前提下對樣本空間進行重新划分得到{Si}i=1k

      聚類算法中類別個數設定將會在很大程度上決定聚類效果,該參數根據自身的先驗知識或啟發式來確定,如事先已經知道樣本的大體分布或者知道樣本中包含的屬性個數,如數字、性別類型的樣本等。那么如何在算法中加入自適應決定類別個數的過程?

      經典方法是ISODATA算法,該算法與K-means在基本原則上一致,通過計算誤差平方和最小來實現聚類。但是ISODATA算法在迭代過程中引入類別的合並與分開機制。

     在每一次迭代中,ISODATA算法首先在固定類別個數的情況下進行聚類,然后根據設定樣本之間的距離閾值進行合並操作,並根據每一組類別Si中的樣本協方差矩陣信息來判斷是否分開。

     ISODATA算法在K-means迭代過程加入附加的啟發式重初始化,相比經典的K-means,計算效率會大大降低。

2.4 面向非標准正態分布或非均勻樣本集的算法改進

     經典的K-means采取二次歐式距離作為相似性度量,並且假設中的誤差服從標准的正態分布。因此,K-means在處理非標准正態分布和非均勻樣本集合時聚類效果較差

     如圖所示,針對非標准正態分布和非均勻樣本集時,K-means聚類不能得到預期結果,原因在於假設相似度度量為二次歐式距離,在實際的樣本集合中該假設不一定都會適用。

      為了有效克服該局限性假設,K-means需要推廣到更廣義的度量空間,經典的兩種改進框架為Kernel K-means和譜聚類Spectral Clustering.

      Kernel K-means將樣本點xi通過某種映射方式xi->Φ(xi)到新的高維空間Φ,在該空間中樣本點之間的內積可以通過對應的核函數進行計算,即:k(xi,xj)=Φ(xi)TΦ(xj)

      借助核函數的存在,可以在新空間進行K-means聚類,樣本之間的相似性度量就取決與核函數的選擇。

      譜聚類算法嘗試着變換樣本的度量空間,首先需要求取樣本集合的仿射矩陣,然后計算仿射矩陣的特征向量,利用得到特征向量進行K-means聚類。仿射矩陣的特征向量隱含地重新定義樣本定的相似性。

2.5 二分K-means聚類

      按照K-means聚類規則很容易陷入局部最小值,馬爾科夫隨機場中配置的代價函數不是好的目標函數,為了解決該問題,有人提出K-means聚類算法。首先把所有樣本作為一個簇,然后二分該簇,接着選擇其中一個簇繼續進行二分。選擇哪一個簇二分的原則就是能否使得誤差平方和盡可能小。該算法有了好的目標函數,SSE的計算其實就是距離和。

     圖1-3是K-means算法在隨機初始化不好的情況下聚類的效果。采用二分K-means聚類得到的效果如圖1-4所示。

三、仿真實驗

3.1 基於K-means的圖像分割

      首先對原始彩色圖像進行顏色空間轉換,從RGB通道轉為Lab顏色空間。

      然后在二維的ab通道建立圖像像素點,如圖1-5所示,測試圖像大小為300X400,可以得到2X120000的樣本集合,樣本分布情況如圖1-5(c)所示。

      接着對該樣本集合利用K-means進行聚類,采用K-means++進行初始化。當設定類別個數k=5時,可以得到如圖1-5(b)所示的分割結果,每一種顏色代表不同的聚類類別。  

      K-means有效地根據圖像的顏色信息對圖像的不同全區域進行標記,如天空、地面、建築物等。

%實現如何利用Kmeans聚類實現圖像的分割;

function kmeans_demo1()
clear;close all;clc;
%% 讀取測試圖像
im = imread('city.jpg');
imshow(im), title('Imput image');
%% 轉換圖像的顏色空間得到樣本
cform = makecform('srgb2lab');  %%rgb空間轉換成L*a*b*空間結構
lab = applycform(im,cform);     %%rgb空間轉換成L*a*b*空間
ab = double(lab(:,:,2:3));      %%把I_lab(:,:,2:3)轉變為double類型數據
nrows = size(lab,1); ncols = size(lab,2);%計算lab的維數,輸出一行向量[m n p]%
X = reshape(ab,nrows*ncols,2)';  %改變矩陣的列數和行數,但是數據總個數不變
figure, scatter(X(1,:)',X(2,:)',3,'filled'); % box on; %顯示顏色空間轉換后的二維樣本空間分布
%scatter可用於描繪散點圖。
%1.scatter(X,Y)
%X和Y是數據向量,以X中數據為橫坐標,以Y中數據位縱坐標描繪散點圖,點的形狀默認使用圈。
%2.scatter(...,'filled')
%描繪實心點。
%3.scatter3(x,y,z)
%描繪三維圖像。
%print -dpdf 2D1.pdf
%% 對樣本空間進行Kmeans聚類
k = 5; % 聚類個數
max_iter = 100; %最大迭代次數
[centroids, labels] = run_kmeans(X, k, max_iter); 

%% 顯示聚類分割結果
figure, scatter(X(1,:)',X(2,:)',3,labels,'filled'); %顯示二維樣本空間聚類效果
hold on; scatter(centroids(1,:),centroids(2,:),60,'r','filled')
hold on; scatter(centroids(1,:),centroids(2,:),30,'g','filled')
box on; hold off;
%print -dpdf 2D2.pdf

pixel_labels = reshape(labels,nrows,ncols);
rgb_labels = label2rgb(pixel_labels);
figure, imshow(rgb_labels), title('Segmented Image');
%print -dpdf Seg.pdf
end

function [centroids, labels] = run_kmeans(X, k, max_iter)
% 該函數實現Kmeans聚類
% 輸入參數:
%                   X為輸入樣本集,dxN
%                   k為聚類中心個數
%                   max_iter為kemans聚類的最大迭代的次數
% 輸出參數:
%                   centroids為聚類中心 dxk
%                   labels為樣本的類別標記

%% 采用K-means++算法初始化聚類中心
  centroids = X(:,1+round(rand*(size(X,2)-1)))%四舍五入取整
  labels = ones(1,size(X,2));  %產生大小為1行,size(x,2)列的矩陣,矩陣元素都是1。
                               %size(x,2)表示x的列數;假設所有樣本標記為1
  for i = 2:k  %5個聚類個數
        D = X-centroids(:,labels);
        D = cumsum(sqrt(dot(D,D,1)));%dot(A,B,DIM)將返回A和B在維數為DIM的點積,
                                     %cumsum計算一個數組各行的累加值
        if D(end) == 0, centroids(:,i:k) = X(:,ones(1,k-i+1)); return; end
        centroids(:,i) = X(:,find(rand < D/D(end),1));
        [~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'));
  end
  
%% 標准Kmeans算法
  for iter = 1:max_iter
        for i = 1:k, l = labels==i; centroids(:,i) = sum(X(:,l),2)/sum(l); end
        [~,labels] = max(bsxfun(@minus,2*real(centroids'*X),dot(centroids,centroids,1).'),[],1);
  end
  
end

3.2 基於K-means的字典學習

     在視覺的特征學習算法中,字典學習是關鍵步驟,K-means算法可以看成一種最為基本的字典學習方法。

     首先從測試灰度圖像中收集10000張6x6大小的圖像小片(Patches);然后按照文獻的建議對所有圖像小片進行白化操作;最后,將所有圖像小片作為樣本集合,利用K-means進行聚類,那么聚類的中心便可作為字典元素。

     如圖1-6所示,學習到的字典元素類似於Gabor小波基,可以有效地刻畫圖像的邊緣信息,因此K-means是一種有效的字典學習方式。

四、算法特點

      K-means聚類算法是最為經典的機器學習方法之一,其目的在於把輸入的樣本向量分為k個組,求每組的聚類中心,使每組的聚類中心,使非相似性(距離)指標的價值函數(目標函數)最小。

      K-means聚類簡潔快速,假設均方誤差是計算群組分散度的最佳參數,對於滿足正態分布的數據聚類效果很好。可應用於機器學習、數據挖掘、模式識別、圖像分析和生物信息學等。

     K-means的性能依賴於聚類中心的初始位置,不能確保收斂於最優解,對孤立點敏感。可以采用一些前端方法,首先計算出初始聚類中心,或者每次用不同的初始聚類中心將算法運行多次,然后擇優確定。

     雖然二分K-means聚類算法改進了K-means的不足,但是它們共同的缺點就是必須實現確定K的值,不合適的k可能返回較差結果。對於海量數據,如何確定K的值是學術界一直在研究的問題,常用方法是層次聚類,或者借鑒LDA聚類分析。

 參考書籍:視頻機器學習20講及其配套代碼

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM