k-means算法原理以及數學知識

摘要算法

在大數據算法中,聚類算法通常都是做爲其餘算法分析的基礎,對數據進行聚類能夠從總體上分析數據的一些特性。聚類有不少的算法,k-means是最簡單最實用的一種算法。在這裏對k-means算法的原理以及其背後的數學推導作一ide

些詳細的介紹,並討論在實際應用中要避免的一些坑。函數

算法

k-means算法很簡單,可是當咱們正真把這個算法用在生產中時仍是存在不少的細節須要考慮的,這些細節將要在後面進行討論。首先給出k-means算法的步驟:大數據


一、給出k個初始聚類中心優化

二、repeat:spa

      把每個數據對象從新分配到k個聚類中心處,造成k個簇3d

      從新計算每個簇的聚類中心orm

三、until  聚類中心不在發生變化對象


k和初始聚類中心的選擇的討論

一、k的選擇

當咱們拿到一批數據時,大多數狀況下咱們是不知道簇的個數的。blog

a、在一些狀況下,咱們經過對業務瞭解的加深,是能夠找到數據的簇的,好比咱們手裏有一批用戶購買商品的記錄數據,已經統計出用戶工做日和週末購買物品的數量,在二維作座標中分別爲:工做日購買的物品數和週末購買的物品數,從這咱們能夠發現,咱們人爲已經把數據分爲三個簇:週末購買、工做日購買和週末和工做日都購買的人數

b、當咱們真的肯定不了數據的簇時,咱們能夠經過相關的算法來大概肯定數據的簇。對k進行屢次取值,經過一個目標函數f進行度量,選取使這個f值最小的k做爲聚類中心(目標函數f後面會講到),進行屢次選擇k值時,時間和空間複雜度都會增長。還一種策略是經過一個算法canopy算法初始選取出聚類的個數k和初始的聚中心做爲k-means算法的輸入,而canopy算法不須要輸入k和初始聚類中心,它能夠做爲k-means算法預處理算法用來選取k-means算法。所須要的k值和聚類中心

二、聚類中心的選擇

選取初始聚類中心是最讓人頭疼的一件事,若是選擇的很差就容易找到局部最優聚類中心而不是全局最優的聚類中心。

a、知道了k後,再選取初始的聚類中心。一種策略是進行屢次隨機的選擇k個點做爲初始聚類中心,比較目標函數f,選取目標函數f最小的最爲初始的聚類中心,這種隨機選擇有不少的不足:一、無形中就增長了時間開銷和空間開銷  二、找到的聚類中心多是局部最優的而不是全局最優的,由於當隨機選擇的兩個聚類中心位於一個簇中,不管怎麼從新計算聚類中心,獲得的結果都不是全局最優的,分類的結果也不是咱們想要的。雖然這種策略有不少的不足,不表明咱們不可使用,在實際應用中咱們仍是能夠選擇這中策略進行生產的。

b、當知道了k後,還有一種選取聚類中心的策略:首先咱們把數據分爲兩個部分:聚類中心集合和原始數據集合,首先咱們從原始數據集合中隨機的選擇一個數據最爲初始聚類中心的一個簇中心放入聚類中心集合中,而後咱們再從原始數據集中選擇一個聚類聚類中心集合中全部的記錄都最遠的一個點做爲下一個初始的聚類中心。這種選擇在實際應用中證實了也是比較好的一種策略,獲得的效果要比a策略獲得的好一些,可是這種策略要受到離羣點的擾動比較的大,同時選擇初始聚類中心的計算量也是很是大的,空間消耗也很是的大。

c、當k不知道的狀況下,最經常使用的一種策略就是使用canopy算法來尋找k和聚類中心。


k-means最近鄰的度量

在k-means算法中,咱們須要把數據集分到距離聚類中心最近的那個簇中,這樣就須要最近鄰的度量策略。咱們須要用什麼來衡量最近,怎麼衡量?k-means算法須要計算距離,計算距離就須要數值,所以k-means算法也是對數值型數據比較實用。k-means算法中最經常使用的度量公式:在歐式空間中採用的是歐式距離,在處理文檔中採用的是餘弦類似度函數,有時候也採用曼哈頓距離做爲度量,不一樣的狀況實用的度量公式是不同的。

歐式距離

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202

餘弦類似度計算公式

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202

向量表示法

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202

曼哈頓距離:

%E5%B1%8F%E5%B9%95%E5%BF%AB%E7%85%A7%202

k-means算法背後的數據知識(k-means算法好壞的評價標準)

k-means算法要解決的問題是咱們把數據給分紅不一樣的簇,那咱們要達到的目標是什麼呢?是使得同一個簇的差別很小,不一樣簇之間的數據差別最大化,這是文字描述的,不能用來標準化研究或者數學推導,咱們想要剛纔的一句話用一個數據公式或者數學模型來進行衡量,創建怎麼樣的數學公式才能用來衡量上面的描述?通常狀況下采用的是偏差平方和做爲衡量的目標函數SSE,上面提到的目標函數f就是SSE也是偏差平方和。先上公式:


%E5%85%AC%E5%BC%8F%E4%B8%80.png?version=

元素解釋:C表示的聚類中心的值,x是屬於這個簇的數據點,d爲歐式距離

爲了實現同一個簇的差別很小,不一樣簇之間的元素數據差別最大化(咱們默認的數據都是在歐式空間中,數據的差別採用的是歐式距離來進行衡量)。爲了實現這個目標,其實是使偏差平方和SSE最小,在了k-means算法中,有兩個地方下降了SSE數值:把數據點分到距離中心點最近的簇中,這樣計算出來的SSE將減小、從新計算聚類中心點,又進一步的下降了SSE,可是這樣的優化策略只是爲了找到局部最優解,若是想要找到全局最優解須要找到合理的初始聚類中心。

還有一個問題須要咱們來討論,咱們爲何選取簇集合的平均值做爲聚類中心呢,由於這樣才能是SSE達到最小,在數學中求一個函數的最小值,怎麼辦?是否是求導,咱們發現SSE是一個二元函數,那就求偏導吧,以下推導。

%E5%85%AC%E5%BC%8F%E4%BA%8C.png?version=

從上面的推導,能夠看出咱們爲何選擇均值做爲聚類中心,當聚類中心爲簇中的均值時,才能是SSE最小,在接下來會對sparkMLlib中對於k-means的算法進行詳細的介紹,再補吧

相關文章
相關標籤/搜索