數據挖掘算法07 - K-Means

K-Means

什麼是向量空間?

首先假設有一個數的集合 F,它滿足“F 中任意兩個數的加減乘除法(除數不爲零)的結果仍然在這個 F 中”,我們就可以稱 F 爲一個“域”。我們處理的數據通常都是實數,所以這裏我只考慮實數域。而如果域 F 裏的元素都爲實數,那麼 F 就是實數域。

我們已經介紹過向量之間的加法,以及標量和向量的乘法。這裏我們使用這兩個操作來定義向量空間。

假設 V 是 Fn 的非零子集,如果對任意的向量 x、向量 y∈V,都有 (x+y)∈V,我們稱爲 V 對向量的加法封閉;對任意的標量 k∈V,向量 x∈V,都有 kx 屬於 V,我們稱 V 對標量與向量的乘法封閉。

如果 V 滿足向量的加法和乘法封閉性,我們就稱 V 是 F 上的向量空間。向量空間除了滿足這兩個封閉性,還滿足基本運算法則,比如交換律、結合律、分配律等等。

向量之間的距離

  • 曼哈頓距離

在美國人口稠密的曼哈頓地區,從一個十字路口開車到另外一個十字路口,駕駛距離是多少呢?

城市街區

從圖中可以看出,從 A 點到 B 點有多條路徑,但是無論哪條,曼哈頓距離都是一樣的。

在二維空間中,兩個點(實際上就是二維向量)x(x1,x2)與 y(y1,y2)間的曼哈頓距離是:

推廣到 n 維空間,曼哈頓距離的計算公式爲:

其中 n 表示向量維度,xi 表示第一個向量的第 i 維元素的值,yi 表示第二個向量的第 i 維元素的值。

  • 歐氏距離(Euclidean Distance)

歐氏距離,其實就是歐幾里得距離。歐氏距離是一個常用的距離定義,指在 n 維空間中兩個點之間的真實距離,在二維空間中,兩個點 x(x1,x2)與 y(y1,y2)間的歐氏距離是:

推廣到 n 維空間,歐氏距離的計算公式爲:

  • 切比雪夫距離(Chebyshev Distance)

切比雪夫其實是在模擬國際象棋裏國王的走法。國王可以走臨近 8 個格子裏的任何一個,那麼國王從格子 (x1,x2) 走到格子 (y1,y2) 最少需要多少步呢?其實就是二維空間裏的切比雪夫距離。

一開始,爲了走儘量少的步數,國王走的一定是斜線,所以橫軸和縱軸方向都會減 1,直到國王的位置和目標位置在某個軸上沒有差距,這個時候就改爲沿另一個軸每次減 1。所以,國王走的最少格子數是 |x1−y1| 和 |x2−y2| 這兩者的較大者。所以,在二維空間中,兩個點 x(x1,x2)與 y(y1,y2) 間的切比雪夫距離是:

推廣到 n 維空間,切比雪夫距離的計算公式爲:

閔氏距離

上述三種距離,都可以用一種通用的形式表示,那就是閔可夫斯基距離,也叫閔氏距離。在二維空間中,兩個點 x(x1,x2) 與 y(y1,y2) 間的閔氏距離是:

兩個 n 維變量 x(x1,x2,…,xn) 與 y(y1,y2,…,yn) 間的閔氏距離的定義爲:

其中 p 是一個變參數,嘗試不同的 p 取值,你就會發現:

  • 當 p=1 時,就是曼哈頓距離;
  • 當 p=2 時,就是歐氏距離;
  • 當 p 趨近於無窮大的時候,就是切比雪夫距離。這是因爲當 p 趨近於無窮大的時候,最大的 |xi−yi| 會佔到全部的權重。

距離可以描述不同向量在向量空間中的差異,所以可以用於描述向量所代表的事物之差異(或相似)程度。

向量的長度

有了向量距離的定義,向量的長度就很容易理解了。向量的長度,也叫向量的模,是向量所對應的點到空間原點的距離。通常我們使用歐氏距離來表示向量的長度。

當然,我們也可以使用其他類型的距離。說到這裏,我也提一下“範數”的概念。範數滿足非負性、齊次性、和三角不等式。你可以不用深究這三點的含義,不過你需要知道範數常常被用來衡量某個向量空間中向量的大小或者長度。

  • L1 範數 ||x|| ,它是爲 x 向量各個元素絕對值之和,對應於向量 x 和原點之間的曼哈頓距離。
  • L2 範數 ||x||2,它是 x 向量各個元素平方和的 1/2 次方,對應於向量 x 和原點之間的歐氏距離。
  • Lp 範數 ||x||p,爲 x 向量各個元素絕對值 p 次方和的 1/p 次方,對應於向量 x 和原點之間的閔氏距離。
  • L∞ 範數 ||x||∞,爲 x 向量各個元素絕對值最大那個元素的絕對值,對應於向量 x 和原點之間的切比雪夫距離。

所以,在討論向量的長度時,我們需要弄清楚是 L 幾範數。

向量之間的夾角

在理解了向量間的距離和向量的長度之後,我們就可以引出向量夾角的餘弦,它計算了空間中兩個向量所形成夾角的餘弦值,具體的計算公式我列在了下面:

從公式可以看出,分子是兩個向量的點乘,而分母是兩者長度(或 L2 範數)的乘積,而 L2 範數可以使用向量點乘自身的轉置來實現。夾角餘弦的取值範圍在 [-1,1],當兩個向量的方向重合時夾角餘弦取最大值 1,當兩個向量的方向完全相反夾角餘弦取最小值 -1。值越大,說明夾角越小,兩點相距就越近;值越小,說明夾角越大,兩點相距就越遠

向量空間模型(Vector Space Model)

向量空間模型假設所有的對象都可以轉化爲向量,然後使用向量間的距離(通常是歐氏距離)或者是向量間的夾角餘弦來表示兩個對象之間的相似程度。我使用下圖來展示空間中向量之間的距離和夾角。

由於夾角餘弦的取值範圍已經在 -1 到 1 之間,而且越大表示越相似,所以可以直接作爲相似度的取值。相對於夾角餘弦,歐氏距離 ED 的取值範圍可能很大,而且和相似度呈現反比關係,所以通常要進行 1/(1-ED) 這種歸一化。

當 ED 爲 0 的時候,變化後的值就是 1,表示相似度爲 1,完全相同。當 ED 趨向於無窮大的時候,變化後的值就是 0,表示相似度爲 0,完全不同。所以,這個變化後的值,取值範圍是 0 到 1 之間,而且和相似度呈現正比關係。

早在上世紀的 70 年代,人們把向量空間模型運用於信息檢索領域。由於向量空間可以很形象地表示數據點之間的相似程度,因此現在我們也常常把這個模型運用在基於相似度的一些機器學習算法中,例如 K 近鄰(KNN)分類、K 均值(K-Means) 聚類等等。

監督式學習 & 非監督學習

在概率統計模塊中,我們介紹了分類(Classification/Categorization)和迴歸(Regression)這兩種監督式學習(Supervised Learning)。監督式學習通過訓練資料學習並建立一個模型,並依此模型對新的實例進行預測。

不過,在實際場景中,我們常常會遇到另一種更爲複雜的情況。這時候不存在任何關於樣本的先驗知識,而是需要機器在沒人指導的情形下,去將很多東西進行歸類。由於缺乏訓練樣本,這種學習被稱爲“非監督學習”(Unsupervised Learning),也就是我們通常所說的聚類(Clustering)。在這種學習體系中,系統必須通過一種有效的方法發現樣本的內在相似性,並把數據對象以羣組(Cluster)的形式進行劃分。

K 均值(K-Means)聚類算法

這個算法的名稱是 K 均值(K-Means)聚類算法,它讓我們可以在一個任意多的數據上,得到一個事先定好羣組數量(K)的聚類結果。這種算法的中心思想是:儘量最大化總的羣組內相似度,同時儘量最小化羣組之間的相似度。羣組內或羣組間的相似度,是通過各個成員和羣組質心相比較來確定的。想法很簡單,但是在樣本數量達到一定規模後,希望通過排列組合所有的羣組劃分,來找到最大總羣組內的相似度幾乎是不可能的。於是人們提出如下的求近似解的方法。

  • 從 N 個數據對象中隨機選取 k 個對象作爲質心,這裏每個羣組的質心定義是,羣組內所有成員對象的平均值。因爲是第一輪,所以第 i 個羣組的質心就是第 i 個對象,而且這時候我們只有這一個組員。
  • 對剩餘的對象,測量它和每個質心的相似度,並把它歸到最近的質心所屬的羣組。這裏我們可以說距離,也可以說相似度,只是兩者呈現反比關係。
  • 重新計算已經得到的各個羣組的質心。這裏質心的計算是關鍵,如果使用特徵向量來表示的數據對象,那麼最基本的方法是取羣組內成員的特徵向量,將它們的平均值作爲質心的向量表示。
  • 迭代上面的第 2 步和第 3 步,直至新的質心與原質心相等或相差之值小於指定閾值,算法結束。

我以二維空間爲例子,畫張圖來展示一下數據對象聚類的過程。

在這張圖中,( a )、( b )、( c ) 三步分別展示了質心和羣組逐步調整的過程。我們一一來看。(a) 步驟是選擇初始質心,質心用不同顏色的 x 表示;( b ) 步驟開始進行聚類,把點分配到最近的質心所在的組;( c ) 步驟重新計算每個羣組的質心,你會發現 x 的位置發生了改變。之後就是如此重複,進入下一輪聚類。

總的來說,K 均值算法是通過不斷迭代、調整 K 個聚類質心的算法。而質心或者羣組的中心點,是通過求羣組所包含的成員之平均值來計算的。

使用向量空間進行聚類

以文本聚類爲例,講講如何使用向量空間模型和聚類算法,去除重複的新聞。

我們在看新聞的時候,一般都希望不斷看到新的內容。可是,由於現在的報道渠道非常豐富,經常會出現熱點新聞霸佔版面的情況。假如我們不想總是看到重複的新聞,應該怎麼辦呢?有一種做法就是對新聞進行聚類,那麼內容非常類似的文章就會被聚到同一個分組,然後對每個分組我們只選擇 1 到 2 篇顯示就夠了。

基本思路確定後,我們可以把整個方法分爲三個主要步驟。

第一步,把文檔集合都轉換成向量的形式。

第二步,使用 K 均值算法對文檔集合進行聚類。這個算法的關鍵是如何確定數據對象和分組質心之間的相似度。針對這點,我們有兩個點需要關注。

  • 使用向量空間中的距離或者夾角餘弦度量,計算兩個向量的相似度。
  • 計算質心的向量。K 均值裏,質心是分組裏成員的平均值。所以,我們需要求分組裏所有文檔向量的平均值。求法非常直觀,就是分別爲每維分量求平均值,我把具體的計算公式列在這裏:

其中,xi 表示向量的第 i 個分量,xij 表示第 j 格向量的第 i 個分量,而 j=1,2,…,n 表示屬於某個分組的所有向量。

第三步,在每個分類中,選出和質心最接近的幾篇文章作爲代表。而其他的文章作爲冗餘的內容過濾掉。

使用 Python 裏的 sklearn 庫,來展示使用歐氏距離的 K 均值算法。

理解 K-Means 算法原理前,先看下這三個問題

  • 如何確定 K 類的中心點?

其中包括了初始的設置,以及中間迭代過程中中心點的計算。在初始設置中,會進行 n_init 次的選擇,然後選擇初始中心點效果最好的爲初始值。在每次分類更新後,你都需要重新確認每一類的中心點,一般採用均值的方式進行確認。

  • 如何將其他點劃分到 K 類中?

這裏實際上是關於距離的定義,我們知道距離有多種定義的方式,在 K-Means 和 KNN 中,我們都可以採用歐氏距離、曼哈頓距離、切比雪夫距離、餘弦距離等。對於點的劃分,就看它離哪個類的中心點的距離最近,就屬於哪一類。

  • 如何區分 K-Means 和 KNN 這兩種算法呢?

剛學過 K-Means 和 KNN 算法的同學應該能知道兩者的區別,但往往過了一段時間,就容易混淆。所以我們可以從三個維度來區分 K-Means 和 KNN 這兩個算法:

  1. 首先,這兩個算法解決數據挖掘的兩類問題。K-Means 是聚類算法,KNN 是分類算法
  2. 這兩個算法分別是兩種不同的學習方式。K-Means 是非監督學習,也就是不需要事先給出分類標籤,而 KNN 是有監督學習,需要我們給出訓練數據的分類標識
  3. 最後,K 值的含義不同。K-Means 中的 K 值代表 K 類。KNN 中的 K 值代表 K 個最接近的鄰居

K-Means 的工作原理

  • 選取 K 個點作爲初始的類中心點,這些點一般都是從數據集中隨機抽取的;
  • 將每個點分配到最近的類中心點,這樣就形成了 K 個類,然後重新計算每個類的中心點;
  • 重複第二步,直到類不發生變化,或者你也可以設置最大迭代次數,這樣即使類中心點發生變化,但是隻要達到最大迭代次數就會結束。

Kmeans & Knn 的區別

K-means開班,選老大,風水輪流轉,直到選出最佳中心老大

Knn小弟加隊伍,離那個班相對近,就是那個班的

  • Kmeans

一羣人的有些人想要聚在一起;首先大家民主(無監督學習)隨機選K個老大(隨機選擇K箇中心點);誰跟誰近,就是那個隊伍的人(計算距離,距離近的聚合到一塊);隨着時間的推移,老大的位置在變化(根據算法,重新計算中心點);直到選出真正的中心老大(重複,直到準確率最高)

  • Knn

一個人想要找到自己的隊伍;首先聽從神的旨意(有監督學習),隨機最近的幾個鄰居;看看距離遠不遠(根據算法,計算距離);近的就是一個班的了(屬於哪個分類多,就是哪一類)

總結

在聚類中,數據對象之間的相似度時很關鍵的。如果我們把樣本轉換爲向量,然後使用向量空間中的距離或者夾角餘弦,就很自然的能獲得這種相似度,所以向量空間模型和聚類算法可以很容易的結合在一起。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章