1. 程式人生 > >K-Means 聚類

K-Means 聚類

src 選擇 高頻 進行 效率 需求 沒有 框架 容易

機器學習中的算法主要分為兩類,一類是監督學習,監督學習顧名思義就是在學習的過程中有人監督,即對於每一個訓練樣本,有對應的標記指明它的類型。如識別算法的訓練集中貓的圖片,在訓練之前會人工打上標簽,告訴電腦這些像素組合在一起,裏面包含了一只貓。而自然界中更多的數據樣本,事實上是沒有這些標記的,而我們針對這些沒有標記的數據樣本,對它們進行學習的算法就叫做無監督學習。聚類算法就是一種典型的無監督學習的算法。俗話說,物以類聚,聚類算法通常就是把分散在空間中的樣本按照一定的規則聚集在一起。K-Means聚類算法是聚類算法中最簡單最易於實現的一種。 在說明K-Means聚類算法的思想之前,我們先要搞懂距離的測量。 針對2維空間的點兩個點X=(1,2) Y=(3,4),通常我們將兩個點之間的距離所采用的方法都是歐式距離 sqrt((1-3)2 +(2-4)2) 技術分享圖片
歐氏距離表示的就是兩點在歐氏空間中線段的長度 但除了歐式距離之外我們還有很多度量距離的方法,比如曼哈頓距離 因為曼哈頓城區很方正,從一個地方走到另一個地方的距離就等於,起點的X坐標與終點坐標的X坐標差的絕對值加上起點Y坐標與終點Y坐標的差的絕對值,推廣到n維歐氏空間, 技術分享圖片 針對兩個向量的比較,我們還能夠使用向量的余弦夾角來定義相似性,也可以用來進行向量間距離的度量 技術分享圖片 在K-means聚類中,通常還是采用歐氏距離來表示樣本間的距離,在這裏只是說明對於樣本,我們是可以采用不同的度量方法去判斷樣本間的距離的。距離的度量就不做推廣了。 K-Means聚類算法的思想其實很簡單,K代表了聚類結果中包含了幾個簇,也就是聚類結果有幾個集合,這個K值是需要進行聚類的人手工添加的。 1.人工確定K的值後,我們先將在樣本空間中隨機選取K個值作為聚類的中心 2.接著遍歷樣本集,計算每一個樣本到各個中心的距離,將樣本點歸類到離它最近的中心所屬的簇 3.計算出每一個簇的中心 4.重復2,3直到收斂 用數學來表示這個思想就是: 1.初始化 t = 0(t代表叠代次數), 隨機選取k個中心點c1,…ck 2.將樣本分配到每個中心 技術分享圖片
3.更新簇中心 技術分享圖片 4 t=t+1 ,重復2,3,知道Ct不在變化 技術分享圖片 k-Means聚類算法運行過程 K-Means聚類的優缺點 優點: 簡單,算法效率高 易於實現 缺點: 需要人工設置K值 對離群點敏感 容易掉入局部最小值 一點小思考,如果樣本空間大,而樣本集並沒有均勻的分布在樣本空間中,那第一步的初始化就不能以在隨機在樣本空間中生成的方法產生,而應該在樣本集中隨機選點來產生中心。甚至在樣本中可能有一些偏離樣本集中心太大的樣本,我們把這樣的樣本叫做離群點,針對離群點,會對k-Means算法造成很大的影響,通常將這樣的樣本取出單獨分析,因為這些樣本作為高頻信息,本身就具有很好的研究價值。還有一個問題就是,K-Means聚類的收斂性,以及當k相同時,它的收斂結果都是一樣的嗎? 可以證明k-Means算法是可以收斂的,但是隨機的初始點不同,k-Means即使在k相同的情況下,也會得到不同的結果。因為我們有可能會陷入局部最優,而不是全局最優解中。 K-Means收斂性: 首先我們定義畸變函數: 技術分享圖片
畸變函數表示每個樣本點到其質心的距離平方和。K-Means算法的目的就是將畸變函數調整到最小。假設畸變函數沒有到達最小值,那麽首先可以固定每個類的質心,調整每個樣例的所屬的類別c來讓J函數減少,同樣,固定C,調整每個類的質心μ也可以使J減小。這兩個過程就是內循環中使J單調遞減的過程。當J遞減到最小時,μ和c也同時收斂。(在理論上,可以有多組不同的μ和c值能夠使得J取得最小值,但這種現象實際上是很少見的)。 由於畸變函數J是非凸函數,意味著我們不能保證取得的最小值是全局最小值,也就是說k-Means對質心初始位置的選取比較感冒,但一般情況下k-means達到的局部最優已經滿足需求。但如果你怕陷入局部最優,那麽可以選取不同的初始值多跑幾遍k-Means,然後取其中最小的J對應的μ和c輸出。 針對K-Means掉入局部最小值的優化 二分K-Means算法: 首先將所有點看成一個簇 當簇的數目小於k時 對於每一個簇 計算總誤差 在給定的簇上面進行K-Means聚類(k=2) 計算將該簇一分為二後的總誤差 選擇使得誤差最小的那個簇進行劃分操作 因為K-Means算法中初始的隨機種子點會對最後的結果產生深遠的影響,除了上面提到的多次運行產生結果外,也有改進的K-Means++算法: 假設已經選取了n個初始聚類中心(0<n<k),則在選取第n+1個聚類中心時,距離當前n個聚類中心越遠的點會有更高的概率被選中為第n+1個聚類中心。既聚類中心的距離離得越遠越好。 1.先隨機挑選隨機點當做種子點 2.針對每個點,我們都計算其和最近的種子點的距離D(x)並計算所有D(x)的距離sum(D(x)) 3.再取一個隨機值,用權重的方式來取計算下一個種子點,先取一個能落在sum(D(x))中的隨機值Random,然後用Random-=D(x),直到其<=0,此時的點就是下一個種子點 4.重復2,3直到選出k個種子點 5.進行k-means算法 K-Means在計算機視覺領域的應用 1.對圖像像素進行聚類 對像素進行聚類通常有兩種分類方法,一是根據圖片的灰度值(也就是響應值)進行聚類,二是根據圖片的色彩空間進行聚類 這個地方就可以用到文章開頭提到的距離度量問題,在針對灰度值進行聚類是,因為每個灰度值都是一個標量,我們可以采用歐氏距離來度量距離,但針對色彩空間進行聚類,例如RBG,每一個RGB值我們都可以看做一個三維向量,那針對向量進行距離的度量,我們就應該采用向量間的夾角的余弦來定義。 技術分享圖片 下圖是圖片基於灰度值以及色彩空間進行k-means聚類的結果 技術分享圖片 2.針對圖像算法中的一些向量特征,例如SIFT中的128維興趣點特征,構建一個匹配框架,將學習到興趣點進行聚類,建立一個匹配字典,再匹配新的特征時,對各個簇進行匹配 後記:閱讀了大量資料後,我發現K-Means算法與EM算法應該有很多內在的聯系,筆者沒有學習過EM算法,暫時不對這部分進行記錄,學習EM算法後,再對這部分進行更新

K-Means 聚類