數學之美3 - 線代篇

線代篇

  • 向量空間模型
  • 文本檢索
  • 文本聚類
  • 矩陣
  • 線性迴歸
  • PCA主成分分析
  • 奇異值分解

33 | 線性代數:線性代數到底都講了些什麼?

向量和向量空間

  • 標量(Scalar)。它只是一個單獨的數字,而且不能表示方向。從計算機數據結構的角度來看,標量就是編程中最基本的變量。這個很好理解,你可以回想一下剛開始學習編程時接觸到的標量類型的變量。
  • 向量(Vector),也可以叫作矢量。它代表一組數字,並且這些數字是有序排列的。我們用數據結構的視角來看,向量可以用數組或者鏈表來表達。
  • 特徵向量(Feature Vector)。由於特徵有很多維,因此我們可以使用向量來表示某個物體的特徵。其中,向量的每個元素就代表一維特徵,而元素的值代表了相應特徵的值,我們稱這類向量爲特徵向量。
  • 矩陣的特徵向量(Eigenvector)是兩碼事。那麼矩陣的特徵向量是什麼意思呢?矩陣的幾何意義是座標的變換。如果一個矩陣存在特徵向量和特徵值,那麼這個矩陣的特徵向量就表示了它在空間中最主要的運動方向。如果你對這幾個概念還不太理解,也不用擔心,在介紹矩陣的時候,我會詳細說說什麼是矩陣的特徵向量。

向量和標量最大的區別在於,向量除了擁有數值的大小,還擁有方向。向量或者矢量中的“向”和“矢”這兩個字,都表明它們是有方向的。你可能會問,爲什麼這一串數字能表示方向呢?這是因爲,如果我們把某個向量中的元素看作座標軸上的座標,那麼這個向量就可以看作空間中的一個點。以原點爲起點,以向量代表的點爲終點,就能形成一條有向直線。而這樣的處理其實已經給向量賦予了代數的含義,使得計算的過程中更加直觀。

標量和向量的區別,標量只是單獨的一個數,而向量是一組數。矩陣是向量的擴展,就是一個二維數組。我們可以使用哈希表的鏈地址法表示稀疏矩陣。

向量空間

標量和向量之間可以進行運算,比如標量和向量相加或者相乘時,我們直接把標量和向量中的每個元素相加或者相乘就行了,這個很好理解。可是,向量和向量之間的加法或乘法應該如何進行呢?我們需要先定義向量空間。向量空間理論上的定義比較繁瑣,不過二維或者三維的座標空間可以很好地幫助你來理解。這些空間主要有幾個特性:

  • 空間由無窮多個的位置點組成;
  • 這些點之間存在相對的關係;
  • 可以在空間中定義任意兩點之間的長度,以及任意兩個向量之間的角度;
  • 這個空間的點可以進行移動。

向量的運算

標量和向量或矩陣的加法、乘法比較簡單,就是把這個標量和向量或矩陣中所有的元素輪流進行相加或相乘。

向量之間的加法,是把兩者對應的元素相加。

向量之間的相乘分爲叉乘和點乘,默認向量乘法爲點乘。

點乘的作用是把相乘的兩個向量轉換成了標量,它有具體的幾何含義。我們會用點乘來計算向量的長度以及兩個向量間的夾角,所以一般情況下我們會默認向量間的乘法是點乘。至於向量之間的夾角和距離,它們在向量空間模型(Vector Space Model)中發揮了重要的作用。信息檢索和機器學習等領域充分利用了向量空間模型,計算不同對象之間的相似程度。

矩陣的運算

矩陣由多個長度相等的向量組成,其中的每列或者每行就是一個向量。因此,我們把向量延伸一下就能得到矩陣(Matrix)。

從數據結構的角度看,向量是一維數組,那矩陣就是一個二維數組。如果二維數組裏絕大多數元素都是 0 或者不存在的值,那麼我們就稱這個矩陣很稀疏(Sparse)。對於稀疏矩陣,我們可以使用哈希表的鏈地址法來表示。所以,矩陣中的每個元素有兩個索引。

我們換個角度來看,向量其實也是一種特殊的矩陣。如果一個矩陣是 n × m 維,那麼一個 n × 1 的矩陣也可以稱作一個 n 維列向量;而一個 1 × m 矩陣也稱爲一個 m 維行向量。

同樣,我們也可以定義標量和矩陣之間的加法和乘法,我們只需要把標量和矩陣中的每個元素相加或相乘就可以了。

矩陣加法比較簡單,只要保證參與操作的兩個矩陣具有相同的行維度和列維度,我們就可以把對應的元素兩兩相加。

矩陣乘法默認爲左矩陣的行向量和右矩陣的列向量兩兩點乘。

其中,矩陣 Z 爲矩陣 X 和 Y 的乘積,X 是形狀爲 i x k 的矩陣,而 Y 是形狀爲 k × j 的矩陣。X 的列數 k 必須和 Y 的行數 k 相等,兩者纔可以進行這樣的乘法。

我們可以把這個過程看作矩陣 X 的行向量和矩陣 Y的列向量兩兩進行點乘,我這裏畫了張圖,你理解了這張圖就不難記住這個公式了。

兩個矩陣中對應元素進行相乘,這種操作也是存在的,我們稱它爲元素對應乘積,或者 Hadamard 乘積。但是這種乘法咱們用得比較少,所以你只要知道有這個概念就可以了。

轉置(Transposition)是指矩陣內的元素行索引和縱索引互換。相應的,矩陣的形狀由轉置前的 n × m 變爲轉置後的 m × n。從幾何的角度來說,矩陣的轉置就是原矩陣以對角線爲軸進行翻轉後的結果。下面這張圖展示了矩陣 X 轉置之後的矩陣 X’:

除了轉置矩陣,另一個重要的概念是逆矩陣。爲了理解逆矩陣或矩陣逆(Matrix Inversion),我們首先要理解單位矩陣(Identity Matrix)。單位矩陣中,所有沿主對角線的元素都是 1,而其他位置的所有元素都是 0。通常我們只考慮單位矩陣爲方陣的情況,也就是行數和列數相等,我們把它記做 In,n 表示維數。

如果有矩陣 X,我們把它的逆矩陣記做,兩者相乘的結果是單位矩陣,寫成公式就是這種形式:

特徵值奇異值的概念以及求解比較複雜了,從大體上來理解,它們可以幫助我們找到矩陣最主要的特點。通過這些操作,我們就可以在機器學習算法中降低特徵向量的維度,達到特徵選擇和變換的目的。


34 | 向量空間模型:如何讓計算機理解現實事物之間的關係?

什麼是向量空間?

首先假設有一個數的集合 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) 間的閔氏距離是:

兩個 nnn 維變量 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) 聚類等等。


35 | 文本檢索:如何讓計算機處理自然語言?

什麼是信息檢索?

信息檢索就是讓計算機根據用戶信息需求,從大規模、非結構化的數據中,找出相關的資料。

這裏的“非結構化”其實是針對經典的關係型數據庫(Relation Database)而言的,比如 DB2、Oracle DB、MySQL 等等。

布爾模型

在信息檢索中,相關性是個永恆的話題。“這篇文章是否和體育相關?”當被問及這個問題,我們要大致看一下文章的內容,才能做出正確的判斷。可是,迄今爲止,計算機尚無法真正懂得人類的語言,它們該如何判定呢?好在科學家們設計了很多模型,幫助計算機處理基於文本的相關性。

最簡單的模型是布爾模型,它藉助了邏輯(布爾)代數的基本思想。如果我想看一篇文章是否關於體育,最簡單的方法莫過於看看其中是否提到和體育相關的關鍵詞,比如“足球”“NBA”“奧運會”等等。如果有,就相當於返回值爲“真”,我就認爲這篇文章就是相關的。如果沒有,就相當於返回值爲“假”,我就認爲這篇文章不相關。這就是布爾模型的核心思想。

向量空間模型

和布爾模型相比,向量空間模型更爲複雜,也更爲合理。如我之前介紹的,此模型的重點是將文檔轉換爲向量,然後比較向量之間的距離或者相似程度。在轉換的時候,我們通常會使用詞包(Bag Of Word)的方式,忽略了單詞在文章中出現的順序,簡化計算複雜度。類似地,這個模型也會把用戶輸入的查詢轉換爲向量。如此一來,相關性問題就轉化爲計算查詢向量和文檔向量之間的距離或者相似度了。距離越小或者說相似度越高,那麼我們就認爲相關度越高。

相對於標準的布爾數學模型,向量空間模型的主要優勢在於,允許文檔和查詢之間的部分匹配連續的相似程度以及基於這些的的排序。結果不再侷限於布爾模型的“真”“假”值。此外,單詞或詞組的權重可以不再是二元的,而是可以使用例如 tf-idf(term frequency–inverse document frequency)的機制。

信息檢索中的向量空間模型

整個方法從大體上來說,可以分爲四個主要步驟。

  • 第一步,把文檔集合都轉換成向量的形式。
  • 第二步,把用戶輸入的查詢轉換成向量的形式,然後把這個查詢的向量和所有文檔的向量,進行比對,計算出基於距離或者夾角餘弦的相似度。
  • 第三步,根據查詢和每個文檔的相似度,找出相似度最高的文檔,認爲它們是和指定查詢最相關的。
  • 第四步,評估查詢結果的相關性。

把文檔轉爲特徵向量

任何向量都有兩個主要的構成要素:維度和取值。這裏的維度表示向量有多少維分量、每個分量的含義是什麼,而取值表示每個分量的數值是多少。而原始的文本和向量差別很大,我們需要經過若干預處理的步驟。

我們首先來看看如何爲文本創建向量的維度。簡單地說,我們要把文章中唯一的單詞或者詞組,作爲向量的一個維度。

在概率統計的模塊中,我說過如何基於詞包(Bag of Word)的方式來預處理文本,包括針對中文等語系的分詞操作、針對英文等拉丁語系的詞幹(Stemming)和歸一化(Normalization)處理,以及所有語言都會碰到的停用詞(Stopword)、同義詞和擴展詞處理。完成了前面這些預處理,我們就可以獲得每篇文檔出現的單詞和詞組。而通過對所有文檔中的單詞和詞組進行去重,我們就可以構建整個文檔集合的詞典(Vocabulary)。向量空間模型把詞典中的每個詞條作爲向量的一個維度。

有了向量的維度,我們再來考慮每個維度需要取什麼值。最簡單的方法是用“1”表示這個詞條出現在文檔中,“0”表示沒有出現。不過這種方法沒有考慮每個詞的權重。有些詞經常出現,它更能表達文章的主要思想,對於計算機的分析能起到更大的作用。對於這點,有兩種常見的改進方法,分別是使用詞頻和詞頻 x 逆文檔頻率來實現的。

我們先來看基於詞頻的方法。假設我們有一個文檔集合 c,d 表示 c 中的一個文檔,t 表示一個單詞,那麼我們使用 tf 表示詞頻(Term Frequency),也就是一個詞 t 在文檔 d 中出現的次數。這種方法的假設是,如果某個詞在文檔中的 tf 越高,那麼這個詞對於這個文檔來說就越重要。

另一種改進方法,不僅考慮了 tf,還考慮了 idf。這裏 idf 表示逆文檔頻率(Inverse Document Frequency)。

首先,df 表示文檔頻率(Document Frequency),也就是文檔集合 c 中出現某個詞 t 的文檔數量。一般的假設是,某個詞 t 在文檔集合 c 中,出現在越多的文檔中,那麼其重要性越低,反之則越高。剛開始可能感覺有點困惑,但是仔細想想不難理解。

在討論體育的文檔集合中,“體育”一詞可能會出現在上萬篇文章中,它的出現並不能使得某篇文檔變得和“體育”這個主題更相關。相反,如果只有 3 篇文章討論到中國足球,那麼這 3 篇文章和中國足球的相關性就遠遠高於其他文章。“中國足球”這個詞組在文檔集合中就應該擁有更高的權重,用戶檢索“中國足球”時,這 3 篇文檔應該排在更前面。所以,我們通常用 df 的反比例指標 idf 來表示這種重要程度,基本公式如下:

其中 N 是整個文檔集合中文章數量,log 是爲了確保 idf 分值不要遠遠高於 tf 而埋沒 tf 的貢獻。這樣一來,單詞 t 的 df 越低,其 idf 越高,t 的重要性越高。那麼綜合起來,tf-idf 的基本公式表示如下:

一旦完成了從原始文檔到向量的轉換,我們就可以接受用戶的查詢(Query)。

查詢和文檔的匹配

在計算查詢和文檔的相似度之前,我們還需要把查詢轉換成向量。由於用戶的查詢也是由自然語言組成,所以這個轉換的流程和文檔的轉換流程是基本一致的。不過,查詢也有它的特殊性,因此需要注意下面幾個問題。

  • 第一,查詢和文檔長度不一致。人們輸入的查詢通常都很短,甚至都不是一個句子,而只是幾個關鍵詞。這種情況下,你可能會覺得兩個向量的維度不同,無法計算它們之間的距離或夾角餘弦。對於這種情況,我們可以使用文檔字典中所有的詞條來構建向量。如果某維分量所對應的詞條出現在文檔或者查詢中,就取 1、tf 或 tf-idf 值,如果沒有就取 0。這樣,文檔向量和查詢向量的維度就相同了,只是查詢向量更稀疏、擁有多維度的 0。
  • 第二,查詢裏出現了文檔集合裏沒有的詞。簡單的做法是直接去除這維分量,也可以使用相對於其他維度來說極小的一個數值,這和分類中的平滑技術類似。
  • 第三,查詢裏詞條的 idf 該如何計算。如果我們使用 tf-idf 機制來計算向量中每個維度的取值,那麼就要考慮這個問題。由於查詢本身並不存在文檔集合的概念,所以也就不存在 df 和 idf。對於這種情況,我們可以借用文檔集合裏對應詞條的 idf。

把查詢轉換成向量之後,我們就可以把這個查詢的向量和所有文檔的向量依次對比,看看查詢和哪些文檔更相似。我們可以結合上一節所說的,計算向量之間的距離或者夾角餘弦。由於夾角餘弦不用進行歸一化,所以這種方法更爲流行。需要注意的是,信息檢索裏,夾角餘弦的取值範圍通常是 [0,1],而不再是 [-1,1]。這是因爲在進行文本處理的時候,我們根據單詞的出現與否,設置 0、1/tf/tf-idf,因此向量每個分量的取值都是正的。

在概率統計模塊中,我介紹過特徵選擇和特徵值的轉換。由於文本向量往往是非常稀疏的,我們也可能需要對轉換後的文檔和查詢向量,進行這兩項操作。

排序和評估

完成了前兩步,後面的排序和評估就很直觀了。我們按照和輸入查詢的相似程度,對所有文檔進行相似度由高到低的排序,然後取出前面的若干個文檔,作爲相關的信息返回。當然,這裏你需要注意,這裏所說的“相關性”是從向量空間模型的角度出發,不代表所返回的信息一定滿足用戶的需求。因此,我們還需要設計各種離線或者在線的評估,來衡量向量空間模型的效果。

總結

今天我從文本的信息檢索出發,介紹如何使用向量空間模型。在使用這個模型之前,很重要的處理步驟,就是要把原始數據轉換成向量。這裏所說的數據類型是文本,所以我們要進行分詞等操作,然後構建文檔的字典,並使用字典的詞條來構建向量。如果是其他類型的數據,我們則需要提取相應的特徵,並利用這些特徵來構建向量。

如果我們把查詢也轉換成向量,那麼就可以計算查詢向量和文檔向量之間的相似度。通過這種相似度,我們就能對所有的文檔進行排序,找出向量空間模型認爲“最相關”的文章。

假設查詢的平均長度(或詞條數量)遠遠小於文檔的平均長度,我們把查詢的平均長度記做 m,那麼對於每次計算查詢向量和文檔向量的相似度,時間複雜度都是 O(m)。假設文檔集中文檔的數量平均是 n,那麼根據時間複雜度的四則運算法則,把查詢和所有文檔比較的時間複雜度是 O(m*n)。

其實,在第 17 講我曾經提到過了倒排索引的案例,我們可以把倒排索引和向量空間模型相結合。倒排索引可以快速找到包含查詢詞的候選文檔,這樣就避免了不必要的向量計算。更多具體的內容,我會在之後的實戰模塊爲你詳細講解。


36 | 文本聚類:如何過濾冗餘的新聞?

監督式學習 & 非監督學習

在概率統計模塊中,我們介紹了分類(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 均值算法。

Python 中的 K 均值算法

在嘗試下面的代碼之前,你需要看看自己的機器上是不是已經安裝了 scikit-learn。Scikit-learn 是 Python 常用的機器學習庫,它提供了大量的機器學習算法的實現和相關的文檔,甚至還內置了一些公開數據集,是我們實踐機器學習算法的好幫手。

首先,我使用 sklearn 庫中的 CountVectorizer,對一個測試的文檔集合構建特徵,也就是詞典。這個測試集合有 7 句話,2 句關於籃球,2 句關於電影,還有 3 句關於遊戲。

總結

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


37 | 矩陣(上):如何使用矩陣操作進行PageRank計算?

回顧 PageRank 鏈接分析算法

PageRank 是基於馬爾科夫鏈的。它假設了一個“隨機衝浪者”模型,衝浪者從某張網頁出發,根據 Web 圖中的鏈接關係隨機訪問。在每個步驟中,衝浪者都會從當前網頁的鏈出網頁中,隨機選取一張作爲下一步訪問的目標。此外,PageRank 還引入了隨機的跳轉操作,這意味着衝浪者不是按 Web 圖的拓撲結構走下去,只是隨機挑選了一張網頁進行跳轉。

基於之前的假設,PageRank 的公式定義如下:

其中,pi 表示第 i 張網頁,Mi 是 pi 的入鏈接集合,pj 是 Mi 集合中的第 j 張網頁。PR(pj) 表示網頁 pj 的 PageRank 得分,L(pj)表示網頁 pj 的出鏈接數量,1/L(pj) 就表示從網頁 pj 跳轉到 pi 的概率。α 是用戶不進行隨機跳轉的概率,N 表示所有網頁的數量。

PageRank 的計算是採樣迭代法實現的:一開始所有網頁結點的初始 PageRank 值都可以設置爲某個相同的數,例如 1,然後我們通過上面這個公式,得到每個結點新的 PageRank 值。每當一張網頁的 PageRank 發生了改變,它也會影響它的出鏈接所指向的網頁,因此我們可以再次使用這個公式,循環地修正每個網頁結點的值。由於這是一個馬爾科夫過程,所以我們能從理論上證明,所有網頁的 PageRank 最終會達到一個穩定的數值。整個證明過程很複雜,這裏我們只需要知道這個迭代計算的過程就行了。

簡化 PageRank 公式

那麼,這個計算公式和矩陣操作又有什麼聯繫呢?爲了把問題簡化,我們暫時不考慮隨機跳轉的情況,而只考慮用戶按照網頁間鏈接進行隨機衝浪。那麼 PageRank 的公式就簡化爲:

我們再來對比看看矩陣點乘的計算公式。

以上兩個公式在形式上是基本一致的。因此,我們可以把 Σ(PR(pj)/L(pj)) 的計算,分解爲兩個矩陣的點乘。一個矩陣是當前每張網頁的 PageRank 得分,另一個矩陣就是鄰接矩陣。所謂鄰接矩陣,其實就是表示圖結點相鄰關係的矩陣。

考慮隨機跳轉

我們把 Σ(PR(pj)/L(pj)) 部分用 A 表示,那麼完整的 PageRank 公式就可以表示爲:

於是,我們可以把上述公式分解爲如下兩個矩陣的點乘

我們前面提到,PageRank 算法需要迭代式計算。爲了避免計算後的數值越來越大甚至溢出,我們可以進行歸一化處理,保證所有結點的數值之和爲 1。

接下來,我們只需要再重複之前的步驟,直到每個結點的值趨於穩定就可以了。

使用 Python 進行實現

說到這裏,我已經把如何把整個 PageRank 的計算,轉換成多個矩陣的點乘這個過程講完了。這樣一來,我們就可以利用 Python 等科學計算語言提供的庫,來完成基於 PageRank 的鏈接分析。

總結

我們可以把向量看作一維數組,把矩陣看作二維數組。矩陣的點乘,是由若干個向量的點乘組成的,所以我們可以通過矩陣的點乘操作,挖掘多組向量兩兩之間的關係。

今天我們講了矩陣的點乘操作在 PageRank 算法中的應用。通過表示網頁的鄰接二元關係,我們可以使用矩陣來計算 PageRank 的得分。在這個應用場景下,矩陣點乘體現了多個馬爾科夫過程中的狀態轉移。

矩陣點乘和其他運算操作,還可以運用在很多其他的領域。例如,我在上一節介紹 K 均值聚類算法時,就提到了需要計算某個數據點向量、其他數據點向量之間的距離或者相似度,以及使用多個數據點向量的平均值來獲得質心點的向量,這些都可以通過矩陣操作來完成。

另外,在協同過濾的推薦中,我們可以使用矩陣點乘,來實現多個用戶或者物品之間的相似程度,以及聚集後的相似程度所導致的最終推薦結果。


38 | 矩陣(下):如何使用矩陣操作進行協同過濾推薦?

我這裏說的推薦,是指爲用戶提供可靠的建議、並協助用戶挑選物品的一種技術。一個好的推薦系統需要建立在海量數據挖掘基礎之上,並根據用戶所處的情景和興趣特點,向用戶推薦可能感興趣的信息和商品。

協同過濾(Collaborative Filtering)是經典的推薦算法之一,它充分利用了用戶和物品之間已知的關係,爲用戶提供新的推薦內容。我會從這種二元關係出發,給你講講如何使用矩陣計算,來實現協同過濾推薦算法。

用矩陣實現推薦系統的核心思想

矩陣中的二維關係,除了可以表達圖的鄰接關係,還可以表達推薦系統中用戶和物品的關係。

簡單地理解就是,推薦系統會根據用戶所處的場景和個人喜好,推薦他們可能感興趣的信息和商品。比如,你在閱讀一部電影的影評時,系統給你推薦了其他“你可能也感興趣的電影”。可以看出來,推薦系統中至少有 2 個重要的角色:用戶和物品。用戶是系統的使用者,物品就是將要被推薦的候選對象。

在此之前,我們先來看什麼是協同過濾。你可以把它理解爲最直觀的“口口相傳”。假設我們願意接受他人的建議,尤其是很多人都向你建議的時候。其主要思路就是利用已有用戶羣過去的行爲或意見,預測當前用戶最可能喜歡哪些東西。根據推薦依據和傳播的路徑,又可以進一步細分爲基於用戶的過濾和基於物品的過濾。

基於用戶的過濾

首先,我們來看基於用戶的協同過濾。它是指給定一個用戶訪問(我們假設有訪問就表示有興趣)物品的數據集合,找出和當前用戶歷史行爲有相似偏好的其他用戶,將這些用戶組成“近鄰”,對於當前用戶沒有訪問過的物品,利用其近鄰的訪問記錄來預測。我畫了一張圖方便你理解。

根據這張圖的訪問關係來看,用戶 A 訪問了物品 A 和 C,用戶 B 訪問了物品 B,用戶 C 訪問了物品 A,C 和 D。我們計算出來,用戶 C 是 A 的近鄰,而 B 不是。因此係統會更多地向用戶 A 推薦用戶 C 訪問的物品 D。

理解了這個算法的基本概念,我們來看看如何使用公式來表述它。假設有 m 個用戶,n 個物品,那麼我們就能使用一個 m×n 維的矩陣 X 來表示用戶對物品喜好的二元關係。基於這個二元關係,我們可以列出下面這兩個公式:

其中,第一個公式比較容易理解,它的核心思想是計算用戶和用戶之間的相似度。完成了這一步我們就能找到給定用戶的“近鄰”。

我們可以使用向量空間模型中的距離或者是夾角餘弦來處理,在這裏我使用了夾角餘弦,其中 usi1,i2 表示用戶 i1 和 i2 的相似度,而 Xi1 表示矩陣中第 i1 行的行向量。分子是兩個表示用戶的行向量之點乘,而分母是這兩個行向量 L2 範數的乘積。

第二個公式利用第一個公式所計算的用戶間相似度,以及用戶對物品的喜好度,預測任一個用戶對任一個物品的喜好度。其中 pi,j 表示第 i 用戶對第 j 個物品的喜好度,usi,k 表示用戶 i 和 k 之間的相似度,xk,j 表示用戶 k 對物品 j 的喜好度。注意這裏最終需要除以 Σusi,k,是爲了進行歸一化。

從這個公式可以看出,如果 usi,k 越大,xk,j 對最終 pi,j 的影響越大,反之如果 usi,k 越小,xk,j 對最終 pi,j 的影響越小,充分體現了“基於相似用戶”的推薦。

上面這種基於用戶的協同過濾有個問題,那就是沒有考慮到用戶的喜好程度是不是具有可比性。假設用戶的喜好是根據對商品的評分來決定的,有些用戶比較寬容,給所有的商品都打了很高的分,而有些用戶比較嚴苛,給所有商品的打分都很低。分數沒有可比性,這就會影響相似用戶查找的效果,最終影響推薦結果。這個時候我們可以採用之前介紹的特徵值變化,對於原始的喜好度矩陣,按照用戶的維度對用戶所有的喜好度進行歸一化或者標準化處理,然後再進行基於用戶的協同過濾。

基於物品的過濾

基於物品的協同過濾是指利用物品相似度,而不是用戶間的相似度來計算預測值。我同樣用圖來幫助你理解。

在這張圖中,物品 A 和 C 因爲都被用戶 A 和 B 同時訪問,因此它們被認爲相似度更高。當用戶 C 訪問過物品 A 後,系統會更多地向用戶推薦物品 C,而不是其他物品。

基於物品的協同過濾同樣有兩個公式,你可以看一下。

第一個公式的核心思想是計算物品和物品之間的相似度,在這裏我仍然使用夾角餘弦。其中 isj1,j2 表示物品 j1 和 j2 的相似度,而 Xj 表示了 X 中第 j1 列的列向量,而 Xj2 表示了 X 中第 j2 列的列向量。分子是兩個表示物品的列向量之點乘,而分母是這兩個列向量 L2 範數的乘積。

第二個公式利用第一個公式所計算的物品間相似度,和用戶對物品的喜好度,預測任一個用戶對任一個物品的喜好度。其中 pi,j 表示第 i 用戶對第 j 個物品的喜好度,xi,k 表示用戶 i 對物品 k 的喜好度,isk,j 表示物品 k 和 j 之間的相似度,注意這裏除以 Σisk,j 是爲了進行歸一化。從這個公式可以看出,如果 isk,j 越大,xi,k 對最終 pi,j 的影響越大,反之如果 isk,j 越小,xi,k 對最終 pi,j 的影響越小,充分體現了“基於相似物品”的推薦。

類似地,用戶喜好程度的不一致性,同樣會影響相似物品查找的效果,並最終影響推薦結果。我們也需要對於原始的喜好度矩陣,按照用戶的維度對用戶的所有喜好度,進行歸一化或者標準化處理。

總結

今天我首先簡要地介紹了推薦系統的概念和主要思想。爲了給用戶提供可靠的結果,推薦系統需要充分挖掘歷史數據中,用戶和物品之間的關係。協同過濾的推薦算法就很好地體現了這一點。

一旦涉及用戶和物品的這種二元關係,矩陣就有用武之地了。我通過矩陣來表示用戶和物品的關係,並通過矩陣計算來獲得協同過濾的結果。協同過濾分爲基於用戶的過濾和基於物品的過濾兩種,它們的核心思想都是相同的,因此矩陣操作也是類似的。在這兩個應用場景下,矩陣點乘體現了多個用戶或者物品之間的相似程度,以及聚集後的相似程度所導致的最終推薦結果。

當然,基於用戶和物品間關係的推薦算法有很多,對矩陣的操作也遠遠不止點乘、按行求和、元素對應乘除法。我後面會介紹如何使用矩陣的主成分分析或奇異值分解,來進行物品的推薦。


39 | 線性迴歸(上):如何使用高斯消元求解線性方程組?

迴歸分析

機器學習中兩類很重要的方法:迴歸分析以及線性迴歸。迴歸分析屬於監督式學習算法,主要研究一個或多個隨機變量 y1,y2,…,yi 與另一些變量 x1,x2,…,xi 之間的關係。其中,我們將y1,y2,…,yi 稱爲因變量,x1,x2,…,xi 稱爲自變量。按照不同的維度,我們可以把迴歸分爲三種。

  • 按照自變量數量,當自變量 x 的個數大於 1 時就是多元迴歸。
  • 按照因變量數量,當因變量 y 個數大於 1 時就是多重回歸。
  • 按照模型種類,如果因變量和自變量爲線性關係時,就是線性迴歸模型;如果因變量和自變量爲非線性關係時時,就是非線性迴歸分析模型。

高斯消元法

求解線性方程組最常見的方法之一,高斯消元法。這個方法主要包含了消元回代兩個步驟。這些步驟都可以使用矩陣的操作來進行。

從矩陣的角度來說,消元就是把係數矩陣變爲上三角矩陣,而回代是把這個上三角矩陣變爲單位矩陣

我們可以直接把用於消元和回代的矩陣,用於由係數和因變量值組成的增廣矩陣,並獲得最終的方程解。

線性迴歸分析時,方程組的處理方式和普通的方程組求解

線性方程組的概念,也是線性迴歸分析的基礎。在線性迴歸時,我們也能獲得由很多觀測數據值所組成的方程組。但是,在進行線性迴歸分析時,方程組的處理方式和普通的方程組求解有一些不同。其中有兩個最主要的區別。

  • 第一個區別是,在線性迴歸分析中,樣本數據會告訴我們自變量和因變量的值,要求的是係數。而在線性方程組中,我們已知係數和因變量的值,要求的是自變量的值。
  • 第二個區別是,在線性迴歸分析中,方程的數量要遠遠大於自變量的數量,而且我們不要求每個方程式都是完全成立。這裏,不要求完全成立的意思是,擬合出來的因變量值可以和樣本數據給定的因變量值存在差異,也就允許模型擬合存在誤差。模型擬合的概念我在上一模塊的總結篇中重點講解了,所以你應該能理解,模型的擬合不可能 100% 完美,這和我們求解線性方程組精確解的概念是不同的。正是因爲這兩點差異,我們無法直接使用消元法來求解線性迴歸。

40 | 線性迴歸(中):如何使用最小二乘法進行直線擬合?

最小二乘法

最小二乘法的主要思想就是求解未知參數,使得理論值與觀測值之差(即誤差,或者說殘差)的平方和達到最小。我們可以使用下面這個公式來描述。

其中,yi 表示來自數據樣本的觀測值,而 y^ 是假設的函數的理論值,ε 就是我們之前提到的誤差,在機器學習中也常被稱爲損失函數,它是觀測值和真實值之差的平方和。最小二乘法裏的“二乘”就是指的平方操作。有了這個公式,我們的目標就很清楚了,就是要發現使ε最小化時候的參數。

那麼最小二乘法是如何利用最小化 ε 的這個條件來求解的呢?讓我們從矩陣的角度出發來理解整個過程。有了上面的定義之後,我們就可以寫出最小二乘問題的矩陣形式。

其中 B 爲係數矩陣,X 爲自變量矩陣,Y 爲因變量矩陣。換句話說,我們要在向量空間中,找到一個 B,使向量 XB 與 Y 之間歐氏距離的平方數最小的 B。

推導得:

總結

今天我們探討了爲什麼簡單的線性方程組無法滿足線性函數擬合的需求,最主要的原因就是現實的觀測數據往往不是精確的線性關係,存在一定的誤差。我們所要做的就是,在允許一定範圍的誤差前提下,找到一種線性關係,儘量的滿足觀察數據,使得我們所定義的誤差最小

最小二乘法通過向量空間的歐氏距離之平方,定義了預測值和真實值之間的誤差。在給定自變量和因變量的觀測值之後,最小二乘法可以幫助我們推導出所有自變量的係數,並最小化誤差。我使用矩陣的形式,爲你推導了整個過程。


41 | 線性迴歸(下):如何使用最小二乘法進行效果驗證?

基於最小二乘法的求解

線性迴歸模型根據大量的訓練樣本,推算出係數矩陣 B,然後根據新數據的自變量 X 向量或者矩陣,計算出因變量的值,作爲新數據的預測。

Python 代碼實現

這一部分,我們使用 Python 的代碼,來驗證一下之前的推算結果是不是正確,並看看最小二乘法和 Python sklearn 庫中的線性迴歸,這兩種結果的對比。

首先,我們使用 Python numpy 庫中的矩陣操作來實現最小二乘法。主要的函數操作涉及矩陣的轉置、點乘和求逆。具體的代碼和註釋我列在了下方。

需要注意的是,使用線性迴歸的時候,我們都有一個前提假設,那就是數據的自變量和因變量之間現線性關係。如果不是線性關係,那麼使用線性模型來擬合的效果一定不好。

總結

今天我們使用了具體的案例來推導最小二乘法的計算過程,並用 Python 代碼進行了驗證。通過最近 3 節的講解,相信你對線性方程組求精確解、求近似解、以及如何在線性迴歸中運用這些方法,有了更加深入的理解。

實際上,從廣義上來說,最小二乘法不僅可以用於線性迴歸,還可以用於非線性的迴歸。其主要思想還是要確保誤差ε最小,但是由於現在的函數是非線性的,所以不能使用求多元方程求解的辦法來得到參數估計值,而需要採用迭代的優化算法來求解,比如梯度下降法、隨機梯度下降法和牛頓法。


42 | PCA主成分分析(上):如何利用協方差矩陣來降維?

在概率統計模塊,我詳細講解了如何使用各種統計指標來進行特徵的選擇,降低用於監督式學習的特徵之維度。接下來的幾節,我會闡述兩種針對數值型特徵,更爲通用的降維方法,它們是主成分分析 PCA(Principal Component Analysis)和奇異值分解 SVD(Singular Value Decomposition)。這兩種方法是從矩陣分析的角度出發,找出數據分佈之間的關係,從而達到降低維度的目的,因此並不需要監督式學習中樣本標籤和特徵之間的關係。

PCA 分析法的主要步驟

在解釋這個方法之前,我先帶你快速回顧一下什麼是特徵的降維。在機器學習領域中,我們要進行大量的特徵工程,把物品的特徵轉換成計算機所能處理的各種數據。通常,我們增加物品的特徵,就有可能提升機器學習的效果。可是,隨着特徵數量不斷的增加,特徵向量的維度也會不斷上升。這不僅會加大機器學習的難度,還會影響最終的準確度。針對這種情形,我們需要過濾掉一些不重要的特徵,或者是把某些相關的特徵合併起來,最終達到在減少特徵維度的同時,儘量保留原始數據所包含的信息。

PCA 分析法提出了一種可行的解決方案。它包括了下面這樣幾個主要的步驟:

  • 標準化樣本矩陣中的原始數據;
  • 獲取標準化數據的協方差矩陣;
  • 計算協方差矩陣的特徵值和特徵向量;
  • 依照特徵值的大小,挑選主要的特徵向量;
  • 生成新的特徵。

假設我們獲得了 k 個特徵值和對應的特徵向量,那麼我們就有:

按照所對應的λ數值的大小,對這 k 組的 v 排序。排名靠前的 v 就是最重要的特徵向量。

假設我們只取前 k1 個最重要的特徵,那麼我們使用這 k1 個特徵向量,組成一個 n×k1 維的矩陣 D。

把包含原始數據的 m×n 維矩陣 X 左乘矩陣 D,就能重新獲得一個 m×k1 維的矩陣,達到了降維的目的。

有的時候,我們無法確定 k1 取多少合適。一種常見的做法是,看前 k1 個特徵值的和佔所有特徵值總和的百分比。假設一共有 10 個特徵值,總和是 100,最大的特徵值是 80,那麼第一大特徵值佔整個特徵值之和的 80%,我們認爲它能表示 80% 的信息量,還不夠多。那我們就繼續看第二大的特徵值,它是 15,前兩個特徵值之和有 95,佔比達到了 95%,如果我們認爲足夠了,那麼就可以只選前兩大特徵值,把原始數據的特徵維度從 10 維降到 2 維。

總結

這一節,我首先簡要地重溫了爲什麼有時候需要進行特徵的降維和基於分類標籤的特徵選擇。隨後,我引出了和特徵選擇不同的另一種方法,基於矩陣操作的 PCA 主成分分析。這種方法的幾個主要步驟包括,標準化原始數據、獲得不同特徵的協方差矩陣、計算協方差矩陣的特徵值和特徵向量、選擇最重要的主成分,以及通過所選擇的主成分來轉換原始的數據集。

要理解 PCA 分析法是有一定難度的,主要是因爲兩點原因:第一,計算的步驟有些複雜。第二,這個方法的核心思路有些抽象。這兩點可能會讓剛剛接觸 PCA 的學習者,感到無從下手。


43 | PCA主成分分析(下):爲什麼要計算協方差矩陣的特徵值和特徵向量?

爲什麼要使用協方差矩陣?

首先要回答的第一個問題是,爲什麼我們要使用樣本數據中,各個維度之間的協方差,來構建一個新的協方差矩陣?要弄清楚這一點,首先要回到 PCA 最終的目標:降維。降維就是要去除那些表達信息量少,或者冗餘的維度。

我們首先來看如何定義維度的信息量大小。這裏我們認爲樣本在某個特徵上的差異就越大,那麼這個特徵包含的信息量就越大,就越重要。相反,信息量就越小,需要被過濾掉。很自然,我們就能想到使用某維特徵的方差來定義樣本在這個特徵維度上的差異。

另一方面,我們要看如何發現冗餘的信息。如果兩種特徵是有很高的相關性,那我們可以從一個維度的值推算出另一個維度的值,所表達的信息就是重複的。在概率和統計模塊,我介紹過多個變量間的相關性,而在實際運用中,我們可以使用皮爾森(Pearson)相關係數,來描述兩個變量之間的線性相關程度。這個係數的取值範圍是 [-1,1],絕對值越大,說明相關性越高,正數表示正相關,負數表示負相關。

皮爾森係數計算公式如下:

其中 n 表示向量維度,xk,i 和 xk,j 分別爲兩個特徵維度 i 和 j 在第 k 個採樣上的數值。 x¯,i 和 x¯,j 分別表示兩個特徵維度上所有樣本的均值,σx 和 σy 分別表示兩個特徵維度上所有樣本的標準差。

我把皮爾森係數的公式稍加變化,你來觀察一下皮爾森係數和協方差之間的關係。

你看,變換後的分子不就是協方差嗎?而分母類似於標準化數據中的分母。所以在本質上,皮爾森相關係數和數據標準化後的協方差是一致的。

考慮到協方差既可以衡量信息量的大小,也可以衡量不同維度之間的相關性,因此我們就使用各個維度之間的協方差所構成的矩陣,作爲 PCA 分析的對象。就如前面說講述的,這個協方差矩陣主對角線上的元素是各維度上的方差,也就體現了信息量,而其他元素是兩兩維度間的協方差,也就體現了相關性。

爲什麼要計算協方差矩陣的特徵值和特徵向量?

關於這點,我們可以從兩個角度來理解。

第一個角度是對角矩陣。所謂對角矩陣,就是說只有矩陣主對角線之上的元素有非 0 值,而其他元素的值都爲 0。我們剛剛解釋了協方差矩陣的主對角線上,都是表示信息量的方差,而其他元素都是表示相關性的協方差。既然我們希望儘可能保留大信息量的維度,而去除相關的維度,那麼就意味着我們希望對協方差進行對角化,儘可能地使得矩陣只有主對角線上有非 0 元素。

假如我們確實可以把矩陣儘可能的對角化,那麼對角化之後的矩陣,它的主對角線上元素就是、或者接近矩陣的特徵值,而特徵值本身又表示了轉換後的方差,也就是信息量。而此時,對應的各個特徵向量之間是基本正交的,也就是相關性極低甚至沒有相關性。

第二個角度是特徵值和特徵向量的幾何意義。在向量空間中,對某個向量左乘一個矩陣,實際上是對這個向量進行了一次變換。在這個變換的過程中,被左乘的向量主要發生旋轉和伸縮這兩種變化。如果左乘矩陣對某一個向量或某些向量只發生伸縮變換,不對這些向量產生旋轉的效果,那麼這些向量就稱爲這個矩陣的特徵向量,而伸縮的比例就是特徵值。換句話來說,某個矩陣的特徵向量表示了這個矩陣在空間中的變換方向,這些方向都是趨於正交的,而特徵值表示每個方向上伸縮的比例

如果一個特徵值很大,那麼說明在對應的特徵向量所表示的方向上,伸縮幅度很大。這也是爲什麼,我們需要使用原始的數據去左乘這個特徵向量,來獲取降維後的新數據。因爲這樣做可以幫助我們找到一個方向,讓它最大程度地包含原有的信息。需要注意的是,這個新的方向,往往不代表原始的特徵,而是多個原始特徵的組合和縮放。

小結

這兩節,我詳細講解了 PCA 主成分分析法,它是一種針對數值型特徵、較爲通用的降維方法。和特徵選擇不同,它並不需要監督式學習中的樣本標籤,而是從不同維度特徵之間的關係出發,進行了一系列的操作和分析。主要步驟包括,標準化原始的數據矩陣、構建協方差矩陣、計算這種協方差矩陣的特徵值和特徵向量、挑選較大特徵值所對應的特徵向量、進行原始特徵數據的轉換。如果排名靠前的特徵向量,或者說主成分,已經包括了足夠的信息量,那麼我們就可以通過選擇較少的主成分,對原始的樣本矩陣進行轉換,從而達到降維的目的。

PCA 方法一開始不是很好理解,其主要的原因之一是它背後的核心思想並不是很直觀。爲此,我詳細解釋了爲什麼 PCA 會從標準化和協方差入手來構建協方差矩陣。對於同類的特徵來說,標準化之後的協方差就是方差,表示了這一維特徵所包含的信息量。而對於不同類的特徵來說,標準化之後的協方差體現了這兩維特徵的相關性。鑑於這兩個特性,我們需要求解協方差矩陣的特徵值和特徵向量。如果你弄清楚了這幾個關鍵點,那麼 PCA 方法也就不難理解了。


44 | 奇異值分解:如何挖掘潛在的語義關係?

SVD 奇異值分解

今天,我們來聊另一種降維的方法,SVD 奇異值分解(Singular Value Decomposition)。它的核心思路和 PCA 不同。PCA 是通過分析不同緯特徵之間的協方差,找到包含最多信息量的特徵向量,從而實現降維。而 SVD 這種方法試圖通過樣本矩陣本身的分解,找到一些“潛在的因素”,然後通過把原始的特徵維度映射到較少的潛在因素之上,達到降維的目的。

方陣的特徵分解

方陣(Square Matrix)是一種特殊的矩陣,它的行數和列數相等。如果一個矩陣的行數和列數都是 n,那麼我們把它稱作 n 階方陣。

如果一個矩陣和其轉置矩陣相乘得到的是單位矩陣,那麼它就是一個酉矩陣(Unitary Matrix)。

X′X=I

其中 X’表示 X 的轉置,I 表示單位矩陣。換句話說,矩陣 X 爲酉矩陣的充分必要條件是 X 的轉置矩陣和 X 的逆矩陣相等。

之前我們說過特徵向量表示了矩陣變化的方向,而特徵值表示了變化的幅度。實際上,通過特徵值和特徵矩陣,我們還可以把矩陣 X 進行特徵分解(Eigendecomposition)。這裏矩陣的特徵分解,是指把矩陣分解爲由其特徵值和特徵向量表示的矩陣之積的方法。如果我們求出了矩陣 X 的 k 個特徵值 λ1,λ2,…,λn 以及這 n 個特徵值所對應的特徵向量 v1,v2,…,vn,那麼就有 XV=VΣ。

其中,V 是這 n 個特徵向量所張成的 n×n 維矩陣,而 Σ 爲這 n 個特徵值爲主對角線的 n×n 維矩陣。進一步推導,我們可以得到:

矩陣的奇異值分解

SVD 分解和特徵分解相比,在形式上是類似的。假設矩陣 X 是一個 m×n 維的矩陣,那麼 X 的 SVD 爲 X=UΣV′。

轉化爲方陣

左奇異向量:矩陣 XX’ 的 m 個特徵值和對應的 m 個特徵向量 u。通過 XX’的所有特徵向量構造一個 m×m 的矩陣 U。

右奇異向量:矩陣 X′X 的 n 個特徵值和對應的 n 個特徵向量 v。通過 X’X 的所有特徵向量構造一個 n×n 維的矩陣 V。

現在,包含左右奇異向量的 U 和 V 都求解出來了,只剩下奇異值矩陣 Σ 了。之前我提到,Σ 除了對角線上是奇異值之外,其他位置的元素都是 0,所以我們只需要求出每個奇異值 σ 就可以了。這個解可以通過下面的公式推導求得:

其中 vi 和 ui 都是列向量。一旦我們求出了每個奇異值 σ,那麼就能得到奇異值矩陣 Σ。

潛在語義分析和 SVD

潛在語義分析 LSA(Latent Semantic Analysis)或者叫潛在語義索引 LSI(Latent Semantic Index)。

和一般的向量空間模型有所不同,LSA 通過詞條和文檔所組成的矩陣,發掘詞和詞之間的語義關係,並過濾掉原始向量空間中存在的一些“噪音”,最終提高信息檢索和機器學習算法的精確度。LSA 主要包括以下這些步驟。

  • 第一步,分析文檔集合,建立表示文檔和詞條關係的矩陣。
  • 第二步,對文檔 - 詞條矩陣進行 SVD 奇異值分解。在 LSA 的應用場景下,分解之後所得到的奇異值σ對應了一個語義上的“概念”,而 σ 值的大小表示這個概念在整個文檔集合中的重要程度。U 中的左奇異值向量表示了每個文檔和這些語義“概念”的關係強弱,V 中的右奇異值向量表示每個詞條和這些語義“概念”的關係強弱。所以說,SVD 分解把原來的詞條 - 文檔關係,轉換成了詞條 - 語義概念 - 文檔關係。

我畫了一張圖幫助你理解這個過程。

在這種圖中,我們有一個 7×5 維的矩陣 X,表示 7 個文檔和 5 個單詞。經過 SVD 分解之後,我們得到了兩個主要的語義概念,一個概念描述了計算機領域,另一個概念描述了醫學領域。矩陣 U 描述文檔和這兩個概念之間的關係,而矩陣 V’ 描述了各個詞語和這兩個概念之間的關係。如果要對文檔進行檢索,我們可以使用 U 這個降維之後的矩陣,找到哪些文檔和計算機領域相關。同樣,對於聚類算法,我們也可以使用 U 來判斷哪些文檔屬於同一個類。

  • 第三步,對 SVD 分解後的矩陣進行降維,這個操作和 PCA 主成分分析的降維操作是類似的。
  • 第四步,使用降維後的矩陣重新構建概念 - 文檔矩陣,新矩陣中的元素不再表示詞條是不是出現在文檔中,而是表示某個概念是不是出現在文檔中。

總的來說,LSA 的分解,不僅可以幫助我們找到詞條之間的語義關係,還可以降低向量空間的維度。在這個基礎之上在運行其他的信息檢索或者機器學習算法,就更加有效。

總結

之前介紹的 PCA 主成分分析,要求矩陣必須是對稱的方陣,因此只適用於刻畫特徵之間關係的協方差矩陣。但是,有的時候我們需要挖掘的是樣本和特徵之間的關係,例如文檔和詞條。這個時候矩陣並不是對稱的方陣,因此無法直接使用 PCA 分析。

爲此,SVD 奇異值分解提供了一種可行的方案。它巧妙的運用了矩陣 X 和自己的轉置相乘,生成了兩種對稱的方陣,並通過這兩者的特徵分解,獲得了 SVD 中的左奇異向量所組成的矩陣 U 和右奇異向量所組成的矩陣 V,並最終推導出奇異值矩陣Σ。這樣,SVD 就可以對原始的數據矩陣進行分解,並運用最終的奇異向量進行降維。

我們可以把 SVD 運用在很多場合中,在不同的應用場景下,U,V 和 Σ 代表了不同的含義。例如,在 LSA 分析中,通過對詞條和文檔矩陣的 SVD 分解,我們可以利用 Σ 獲得代表潛在語義的一些概念。而矩陣 U 表示了這些概念和文檔之間的關係,矩陣 V 表示了這些概念和單個詞語之間的關係。


45 | 線性代數篇答疑和總結:矩陣乘法的幾何意義是什麼?

矩陣乘法的幾何意義

在闡述 PCA 主成分分析的時候,我們聊過爲什麼這個方法要研究協方差矩陣的特徵值和特徵向量。其中,我提到對某個向量左乘一個矩陣,實際上是對這個向量進行了一次變換。某個矩陣的特徵向量表示了這個矩陣在空間中的變換方向,這些方向都是正交或者趨於正交的,而特徵值表示每個方向上伸縮的比例。

弄清楚了矩陣左乘向量的幾何意義,那麼矩陣左乘矩陣的幾何意義也就不難理解了。假設我們讓矩陣 X 左乘矩陣 Y,那麼可以把右矩陣 Y 看作一堆列向量的集合,而左乘矩陣 X 就是對每個 Y 中的列向量進行變換。另外,如果二維空間理解了,那麼三維、四維直到 n 維空間就可以以此類推了。

SVD 分解中的 U 和 V 矩陣

證明 U 中的向量就是 XX′ 的特徵向量。

極客時間版權所有: https://time.geekbang.org/column/article/88078

從這個證明的過程,我們也發現了,XX’或者 X’X 特徵值矩陣等於奇異值矩陣的平方,也就是說我們可以通過求出 X’X 特徵值的平方根來求奇異值。

總結

線性代數最基本的概念包括了向量、矩陣以及對應的操作。向量表示了一組數的概念,非常適合表示一個對象的多維特徵,因此被廣泛的運用在信息檢索和機器學習的領域中。而矩陣又包含了多個向量,所以適合表示多個數據對象的集合。同時,矩陣也可以用於表達二維關係,例如網頁的鄰接矩陣,用戶對物品的喜好程度,關鍵詞在文檔中的 tf-idf 等等。

由於向量和矩陣的特性,我們可以把它們運用在很多算法和模型之中。向量空間模型定義了向量之間的距離或者餘弦夾角,我們可以利用這些指標來衡量數據對象之間的相似程度,並把這種相似程度用於定義查詢和文檔之間的相關性,或者是文檔聚類時的歸屬關係。矩陣的運算體現了對多個向量同時進行的操作,比如最常見的左乘,就可以用在計算 PageRank 值,協同過濾中的用戶或者物品相似度等等。

當然,矩陣的運用還不止計算數據對象之間的關係。最小二乘法的實現、PCA 主成分的分析、SVD 奇異值的分解也可以基於矩陣的運算。這些都可以幫助我們發現不同維度特徵之間的關係,並利用這些關係找到哪些特徵更爲重要,選擇或者創建更爲重要的特徵。

有的時候,線性代數涉及的公式和推導比較繁瑣。在思考的過程中,我們可以把矩陣的操作簡化爲向量之間的操作,而把向量之間的操作簡化爲多個變量之間的運算。另外,我們可以多結合實際的案例,結合幾何空間、動手推算,甚至可以編程實現某些關鍵的模塊,這些都有利於理解和記憶。

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