1. 程式人生 > >機器學習(25)之K-Means聚類演算法詳解

機器學習(25)之K-Means聚類演算法詳解

微信公眾號

關鍵字全網搜尋最新排名

【機器學習演算法】:排名第一

【機器學習】:排名第一

【Python】:排名第三

【演算法】:排名第四

前言

K-Means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。K-Means演算法有大量的變體,本文就從最傳統的K-Means演算法講起,在其基礎上講述K-Means的優化變體方法。包括初始化優化K-Means++, 距離計算優化elkan K-Means演算法和大資料情況下的優化Mini Batch K-Means演算法。

K-M原理

K-Means演算法的思想很簡單,對於給定的樣本集,按照樣本之間的距離大小,將樣本集劃分為K個簇。讓簇內的點儘量緊密的連在一起,而讓簇間的距離儘量的大。

如果用資料表示式表示,假設簇劃分為(C1,C2,...Ck),則我們的目標是最小化平方誤差E:

640?wx_fmt=png&wxfrom=5&wx_lazy=1

其中μi是簇Ci的均值向量,有時也稱為質心,表示式為:

0?wx_fmt=png

如果我們想直接求上式的最小值並不容易,這是一個NP難的問題,因此只能採用啟發式的迭代方法。K-Means採用的啟發式方式很簡單,用下面一組圖就可以形象的描述。

0?wx_fmt=png

上圖a表達了初始的資料集,假設k=2。在圖b中,我們隨機選擇了兩個k類所對應的類別質心,即圖中的紅色質心和藍色質心,然後分別求樣本中所有點到這兩個質心的距離,並標記每個樣本的類別為和該樣本距離最小的質心的類別如圖c所示,經過計算樣本和紅色質心和藍色質心的距離,我們得到了所有樣本點的第一輪迭代後的類別。

此時我們對當前標記為紅色和藍色的點分別求其新的質心,如圖d所示,新的紅色質心和藍色質心的位置已經發生了變動。圖e和圖f重複了我們在圖c和圖d的過程,即將所有點的類別標記為距離最近的質心的類別並求新的質心。最終我們得到的兩個類別如圖f。

當然在實際K-Mean演算法中,我們一般會多次執行圖c和圖d,才能達到最終的比較優的類別。

經典K-Meams演算法流程

首先我們看看K-Means演算法的一些要點。

1)對於K-Means演算法,首先要注意的是k值的選擇,一般來說,我們會根據對資料的先驗經驗選擇一個合適的k值,如果沒有什麼先驗知識,則可以通過交叉驗證選擇一個合適的k值。

2)在確定了k的個數後,我們需要選擇k個初始化的質心,就像上圖b中的隨機質心。由於我們是啟發式方法,k個初始化的質心的位置選擇對最後的聚類結果和執行時間都有很大的影響,因此需要選擇合適的k個質心,最好這些質心不能太近。

好了,現在我們來總結下傳統的K-Means演算法流程。 

輸入:樣本集D={x1,x2,...xm},聚類的簇樹k,最大迭代次數N

輸出:簇劃分C={C1,C2,...Ck} 

演算法流程

1) 從資料集D中隨機選擇k個樣本作為初始的k個質心向量: {μ1,μ2,...,μk}

2)對於n=1,2,...,N

a) 將簇劃分C初始化為Ct=∅,t=1,2...k

b) 對於i=1,2...m,計算樣本xi和各個質心向量μj (j=1,2,...k)的距離:

0?wx_fmt=png

將xi標記最小的為dij所對應的類別λi。此時更新Cλi=Cλi∪{xi}

c) 對於j=1,2,...,k,對Cj中所有的樣本點重新計算新的質心

0?wx_fmt=png

e) 如果所有的k個質心向量都沒有發生變化,則轉到步驟3)

3) 輸出簇劃分

K-Means不同改進版本

初始化優化版:K-Means++

在上節我們提到,k個初始化的質心的位置選擇對最後的聚類結果和執行時間都有很大的影響,因此需要選擇合適的k個質心。如果僅僅是完全隨機的選擇,有可能導致演算法收斂很慢。K-Means++演算法就是對K-Means隨機初始化質心的方法的優化。

    K-Means++的對於初始化質心的優化策略也很簡單,如下:

a)  從輸入的資料點集合中隨機選擇一個點作為第一個聚類中心μ1

b) 對於資料集中的每一個點xi,計算它與已選擇的聚類中心中最近聚類中心的距離

0?wx_fmt=png

c) 選擇一個新的資料點作為新的聚類中心,選擇的原則是:D(x)較大的點,被選取作為聚類中心的概率較大

d) 重複b和c直到選擇出k個聚類質心

e) 利用這k個質心來作為初始化質心去執行標準的K-Means演算法

距離計算優化版:elkan K-Means

在傳統的K-Means演算法中,我們在每輪迭代時,要計算所有的樣本點到所有的質心的距離,這樣會比較的耗時。那麼,對於距離的計算有沒有能夠簡化的地方呢?elkan K-Means演算法就是從這塊入手加以改進。它的目標是減少不必要的距離的計算。那麼哪些距離不需要計算呢?elkan K-Means利用了兩邊之和大於等於第三邊,以及兩邊之差小於第三邊的三角形性質,來減少距離的計算。

第一種規律是對於一個樣本點x和兩個質心μj1,μj2。如果我們預先計算出了這兩個質心之間的距離D(j1,j2),則如果計算髮現2D(x,j1)≤D(j1,j2),我們立即就可以知道D(x,j1)≤D(x,j2)。此時我們不需要再計算D(x,j2),也就是說省了一步距離計算。

第二種規律是對於一個樣本點x和兩個質心μj1,μj2。我們可以得到D(x,j2)≥max{0,D(x,j1)−D(j1,j2)}。這個從三角形的性質也很容易得到。

利用上邊的兩個規律,elkan K-Means比起傳統的K-Means迭代速度有很大的提高。但是如果我們的樣本的特徵是稀疏的,有缺失值的話,這個方法就不使用了,此時某些距離無法計算,則不能使用該演算法。

大樣本優化版:Mini Batch K-Means

在統的K-Means演算法中,要計算所有的樣本點到所有的質心的距離。如果樣本量非常大,比如達到10萬以上,特徵有100以上,此時用傳統的K-Means演算法非常的耗時,就算加上elkan K-Means優化也依舊。在大資料時代,這樣的場景越來越多。此時Mini Batch K-Means應運而生。顧名思義,Mini Batch,也就是用樣本集中的一部分的樣本來做傳統的K-Means,這樣可以避免樣本量太大時的計算難題,演算法收斂速度大大加快。當然此時的代價就是我們的聚類的精確度也會有一些降低。一般來說這個降低的幅度在可以接受的範圍之內。

在Mini Batch K-Means中,我們會選擇一個合適的批樣本大小batch size,我們僅僅用batch size個樣本來做K-Means聚類。那麼這batch size個樣本怎麼來的?一般是通過無放回的隨機取樣得到的。為了增加演算法的準確性,我們一般會多跑幾次Mini Batch K-Means演算法,用得到不同的隨機取樣集來得到聚類簇,選擇其中最優的聚類簇。

K-Means與KNN

初學者很容易把K-Means和KNN搞混,兩者其實差別還是很大的。K-Means是無監督學習的聚類演算法,沒有樣本輸出;而KNN是監督學習的分類演算法,有對應的類別輸出。KNN基本不需要訓練,對測試集裡面的點,只需要找到在訓練集中最近的k個點,用這最近的k個點的類別來決定測試點的類別。而K-Means則有明顯的訓練過程,找到k個類別的最佳質心,從而決定樣本的簇類別.當然,兩者也有一些相似點,兩個演算法都包含一個過程,即找出和某一個點最近的點。兩者都利用了最近鄰(nearest neighbors)的思想。

K-Means小結

K-Means是個簡單實用的聚類演算法,這裡對K-Means的優缺點做一個總結。

優點

1)原理比較簡單,實現也是很容易,收斂速度快

2)聚類效果較優。

3)演算法的可解釋度比較強。

4)主要需要調參的引數僅僅是簇數k。

缺點

1)K值的選取不好把握

2)對於不是凸的資料集比較難收斂

3)如果各隱含類別的資料不平衡,比如各隱含類別的資料量嚴重失衡,或者各隱含類別的方差不同,則聚類效果不佳。

4) 採用迭代方法,得到的結果只是區域性最優。

5) 對噪音和異常點比較的敏感。

歡迎分享給他人讓更多的人受益

0?wx_fmt=png

參考:

  1. 周志華《機器學習》

  2. Neural Networks and Deep Learning by By Michael Nielsen

  3. 部落格園

    http://www.cnblogs.com/pinard/p/6164214.html

  4. 李航《統計學習方法》

0?wx_fmt=png

加我微信:guodongwe1991,備註姓名-單位-研究方向(加入微信機器學習交流1群)

招募 志願者

廣告、商業合作

請加QQ:[email protected]

0?wx_fmt=jpeg

喜歡,別忘關注~

幫助你在AI領域更好的發展,期待與你相遇!

相關推薦

機器學習(25)K-Means演算法

微信公眾號 關鍵字全網搜尋最新排名 【機器學習演算法】:排名第一 【機器學習】:排名第一 【Python】:排名第三 【演算法】:排名第四 前言 K-Means演算法是無監督的聚類演算法,它實現起來比較簡單,聚類效果也不錯,因此應用很廣泛。K-Means演算法有大量的變體,本文就從最傳統的K-Means演算

機器學習筆記K-means

K-means聚類是聚類分析中比較基礎的演算法,屬於典型的非監督學習演算法。其定義為對未知標記的資料集,按照資料內部存在的資料特徵將資料集劃分為多個不同的類別,使類別內的資料儘可能接近,類別間的資料相似度比較大。用於衡量距離的方法主要有曼哈頓距離、歐氏距離、切比雪夫距離,其中

機器學習實戰k-means_程式碼註釋

#-*- coding: UTF-8 -*- from numpy import * def loadDataSet(fileName):#函式的輸入為檔名稱,函式的主要作用是將檔案中的每行內容轉換成浮點型, # 每行

吳恩達機器學習 筆記八 K-means演算法

1. 代價函式   K-means演算法是比較容易理解的,它屬於無監督學習方法,所以訓練樣本資料不再含有標籤。我們假設有樣本資料x(1),x(2),⋯,x(m)x(1),x(2),⋯,x(m),我們選擇設定KK個聚類中心u1,u2,⋯,uKu1,u2,⋯,uK

K-means演算法

K-means也是聚類演算法中最簡單的一種了,但是裡面包含的思想卻是不一般。最早我使用並實現這個演算法是在學習韓爺爺那本資料探勘的書中,那本書比較注重應用。看了Andrew Ng的這個講義後才有些明白K-means後面包含的EM思想。 聚類屬於無監督學習,以往的迴歸、樸素貝

Andrew Ng機器學習課程筆記(十二)無監督學習K-means演算法

Preface Unsupervised Learning(無監督學習) K-means聚類演算法 Unsupervised Learning 我們以前介紹的所有演算法都是基於有類別標籤的資料集,當我們對於沒有標籤的資料進行分類時,以前的方

機器學習K-means演算法

  k均值演算法的計算過程非常直觀:       1、從D中隨機取k個元素,作為k個簇的各自的中心。       2、分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。       3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇

非監督學習k-means演算法——Andrew Ng機器學習筆記(九)

寫在前面的話 在聚類問題中,我們給定一個訓練集,演算法根據某種策略將訓練集分成若干類。在監督式學習中,訓練集中每一個數據都有一個標籤,但是在分類問題中沒有,所以類似的我們可以將聚類演算法稱之為非監督式學習演算法。這兩種演算法最大的區別還在於:監督式學習有正確答

scikit-learn學習K-means演算法與 Mini Batch K-Means演算法

======================================================================本系列部落格主要參考 Scikit-Learn 官方網站上的每一個演算法進行,並進行部分翻譯,如有錯誤,請大家指正    轉載請註明出

scikit-learn學習K-means演算法與 Mini Batch K-Means演算法 [轉自別的作者,還有其他sklearn翻譯]

http://blog.csdn.net/gamer_gyt/article/details/51244850 ====================================================================== 本系列部落格主要

MatLab建模學習筆記14——K-Means演算法

網際網路的發展帶動雲端計算、虛擬化、大資料等IT新技術的興起,各行各業的網際網路化日趨明顯。其中大資料的興起和發展壯大成為了IT時代或者說資訊時代最為典型的特徵之一。僅就大資料本身而言,其本身就具有資料體積大、資料多樣性、價值密度低、資料更新快等特點。所以,要想

ML-61: 機器學習K均值(K-Means)演算法含原始碼

機器學習之K均值聚類演算法1 演算法原理2 演算法例項3 典型應用參考資料 機器學習分為監督學習、無監督學習和半監督學習(強化學習)。無監督學習最常應用的場景是聚類(clustering)和降維(dimension reduction)。聚類演算法包括:K均值

機器學習--無監督學習K-means方法

一、引言 從上次SVM之後幾節課講的是學習理論,這塊理論性比較深,我得好好消化一下。所以先總結一下第一個無監督的機器學習演算法,K-means聚類方法。 所謂無監督學習,就是資料樣本沒有標籤,要讓學習演算法自己去發現數據之間內在的一些結構和規律。就好比做題沒有標準答案,所以

吳恩達老師機器學習筆記K-means演算法(二)

運用K-means聚類演算法進行影象壓縮 趁熱打鐵,修改之前的演算法來做第二個練習—影象壓縮 原始圖片如下: 程式碼如下: X =imread('bird.png'); % 讀取圖片 X =im2double(X); % unit8轉成double型別 [m,n,z]=size

吳恩達老師機器學習筆記K-means演算法(一)

今天接著學習聚類演算法 以後堅決要八點之前起床學習!不要浪費每一個早晨。 K-means聚類演算法聚類過程如下: 原理基本就是先從樣本中隨機選擇聚類中心,計算樣本到聚類中心的距離,選擇樣本最近的中心作為該樣本的類別。最後某一類樣本的座標平均值作為新聚類中心的座標,如此往復。 原

機器學習 (十二)讓你輕鬆理解K-means 演算法

前言        你還記得菜市場賣菜的嗎?書店賣書的或者是平時去超市買東西時的物品,它們是不是都根據相似性擺放在一起了呢,飲料、啤酒、零食分佈在各自區域,像這樣各級事物的相似特點或特性組織在一起的方法,在機器學習裡面即成為

機器學習】接地氣地解釋K-means演算法

       俗話說“物以類聚,人以群分”,這句話在K-means聚類演算法裡面得到了充分的繼承。而K-means演算法的實際應用範圍可謂是大到無法估量,基本可以說,只要你想不到,沒有聚類聚不起來的東西!       &nbs

吳恩達機器學習第七次作業Part1: K-means演算法

這是習題和答案的下載地址,全網最便宜,只要一積分哦~~~ 0.綜述 學習K-means聚類演算法,並對一幅影象進行畫素壓縮。 1.Find Closest Centroids 這是指令碼 %% ================= Part 1: Find Clo

K-means演算法——機器學習

聚類屬於無監督學習,以往的迴歸、樸素貝葉斯、SVM 等都是有類別標籤 y 的,也就 是說樣例中已經給出了樣例的分類。而聚類的樣本中卻沒有給定 y,即監督樣本。 在聚類問題中,給我們的訓練樣本是{?(1),…,?(?)},每個?(?) ∈ ℝ?,沒有了 y。  K-mean

機器學習 K-means 演算法 C++

筆記: 尚未解決的問題 :     1. 只支援二維,而不支援三維或更高,需要模板元     2. 尚未實現如何刪除極端點, 即預處理     3. 尚未視覺化 編譯環境 Ubuntu gcc 5.4 編譯選項  g++ -std=c++14 #include &l