淺談機器學習基礎(下)

利用回歸預測數(shù)值型數(shù)據(jù)

線性回歸

前面講的都是監(jiān)督學習中的分類,訓練出可以判斷樣本類別的模型,而回歸的目的是預測數(shù)值型的目標值,最直接的辦法是依據(jù)輸入寫出一個目標值的計算公式,將自變量代入后就能根據(jù)函數(shù)得到因變量的預測值。

先講最簡單的回歸方法:最小二乘法。

我們被給予二維平面內的一系列點,我們希望畫出一條直線,根據(jù)直線的方程(回歸方程)能夠以較小的誤差預測點所在的位置。

仍然按照前面提到過的思考方法,最小二乘法模型的優(yōu)化目標是什么?希望回歸方程的預測目標值與真實目標值之差的平方和最小。那最小二乘法的損失函數(shù)的是什么?平方損失函數(shù),表達式如下:


最小二乘法平方損失函數(shù)

那用什么方法去優(yōu)化目標函數(shù)?我們先將目標函數(shù)改為矩陣表示,再對w求導,令其導數(shù)為零,然后解得w如下:

w的預估最優(yōu)解

w上方的小標記表示那是w的最佳估計值,可能不是真實值。上面的公式中還用到了X的逆矩陣,所以這個方程只在X存在逆矩陣的時候適用。計算出w就得到了回歸直線,下圖是示例:

最小二乘法回歸示例

不過看上圖的樣本點似乎還有更好的擬合方式。最小二乘法這樣純粹的線性回歸往往會出現(xiàn)欠擬合現(xiàn)象,所以我們期望在估計中引入一些偏差,從而降低預測的均方誤差。

下面講的是局部加權線性回歸(LWLR),它的思想在于,我們給所有的樣本點賦予一定權重,并且認為離待預測點更近的樣本點所擁有的權重應該更高。

這樣解出回歸系數(shù)w的形式如下:

式子中的W是一個矩陣,為每個數(shù)據(jù)樣本點賦予一定權重。那W怎么確定?怎樣實現(xiàn)離待預測點更近則權重越高呢,這里我們使用核函數(shù),與SVM中的核函數(shù)類似,高斯核是比較常用的一種核,對應的權重公式如下:

高斯核權重公式

這樣就滿足了離待預測樣本點越近,權重越高的要求,k是需要我們設置的參數(shù),它用來調節(jié)『權重值在近樣本點的集中程度』:

k越小,權重值就越集中在近的樣本點。k越大,權重分布就越分散。

通過最小二乘法和局部加權線性回歸的回歸系數(shù)w求解公式可以發(fā)現(xiàn)我們都需要求X'X的逆矩陣,如果訓練樣本的特征比樣本數(shù)還多,或者某些列之間存在著線性相關關系,都會導致X不再是列滿秩矩陣,進而導致X'X的行列式近乎為0,也即X'X近乎為奇異矩陣、非滿秩矩陣、不可逆矩陣,如果對這樣的X'X求逆矩陣,就會找不到最優(yōu)解或者誤差很大。為了解決這樣的情況,我們引入幾種縮減方法,第一個介紹『嶺回歸』。

嶺回歸就是在原來最小二乘法式子求逆之前先加上一個階數(shù)與樣本數(shù)相同的對角矩陣,也即加上一個正則項,使矩陣為奇異的風險大降低,損失了無偏性,來換取高的數(shù)值穩(wěn)定性。計算公式如下:


嶺回歸回歸系數(shù)計算公式

λ是常數(shù),I是主對角線元素全為1的單位矩陣。在原有基礎上加上正則項后,還可以在樣本數(shù)過少的時候對系數(shù)進行懲罰,限制了所有w之平方和(系數(shù)越大、模型越復雜,越容易過擬合),防止過擬合,提高了泛化能力。為什么說系數(shù)越大越容易過擬合,因為系數(shù)往往是函數(shù)求導后的式子中所包含的,系數(shù)越大,則整個函數(shù)的導數(shù)越大,導數(shù)越大,整個模型就越有可能做一些激烈的變化去擬合所有的點,我們控制系數(shù)大小,即控制了整個函數(shù)導數(shù)的大小,使得曲線相對平滑,防止了過擬合,也就有了更高的泛化能力。

所以當λ比較小時,系數(shù)與普通回歸一樣,而λ非常大時,所有回歸系數(shù)縮減為0,我們在中間某處選擇一個合適的λ值,使得預測結果最好。

實際上,嶺回歸通過增加正則項,就是為最小二乘法增加了這樣的約束條件:


除了嶺回歸,還有一種縮減方法叫做lasso,只不過它的約束條件是這樣:


用絕對值取代了平方和,雖然變化非常細微,但計算復雜度卻大大增加了,我們要介紹一個更簡單的方法,叫做『前向逐步回歸』。

前向逐步回歸是一種貪心算法,一開始所有的系數(shù)的權重都為1,然后每一步都是對某個權重增加或減少一個很小的值。

首先固定其他特征,只看第一個特征,看系數(shù)值是增加好還是減小好,處理完成后再處理第二個特征,不斷循環(huán)往復,處理完全部特征了再從第一個特征重新開始處理,一直到系數(shù)都穩(wěn)定下來。

樹回歸

上一節(jié)介紹了多種線性回歸算法,但是對于某些復雜的數(shù)據(jù)集,并不能建立全局的回歸方程,所以我們希望結合樹的思想,先將數(shù)據(jù)集進行分類,將數(shù)據(jù)集切分成很多份易建?;貧w的數(shù)據(jù),然后再用前面的回歸方法來求得回歸方程。

前面我們講過ID3決策樹算法,在那里我們一次分類就要消耗一個特征,在后面的分類過程中,這個被消耗掉的分類就不再起作用,這樣的分類有時候太過迅速,浪費了一些信息,而且ID3決策樹也只能處理離散型的數(shù)據(jù),如果要處理連續(xù)性數(shù)據(jù)需要先經(jīng)過一步預處理,但是這種處理會破壞連續(xù)性數(shù)據(jù)原本的內在性質。

為了解決前面提到的問題,我們介紹CART樹(分類回歸樹)構建算法,它利用二元切分法處理連續(xù)型變量,即每次把數(shù)據(jù)切為兩份,分別進入左子樹和右子樹?;贑ART可以構建回歸樹,也可以構建模型樹。

回歸樹概要,加載數(shù)據(jù)集,隨后選定最好的劃分特征和劃分特征值,將原數(shù)據(jù)集劃分成左子樹和右子樹,隨后不斷迭代劃分,直到滿足停止條件。當回歸樹構建完成后,我們用每個葉子節(jié)點數(shù)據(jù)的均值來代表這個葉子節(jié)點下的所有數(shù)據(jù)。

構建回歸樹的過程與ID3算法構建樹的過程非常相似,接下來需要確定的是兩點,一個是在構建回歸樹的過程中怎樣選定最好的劃分特征和劃分特征值,第二個是應該用什么作為提前停止條件。

在ID3算法中,我們每次選擇讓整個數(shù)據(jù)集香農熵減小最多(信息增益最大)的特征對數(shù)據(jù)集進行劃分,而在回歸樹算法中因為要處理的是連續(xù)性的數(shù)值變量,直接采用總方差來度量分類的有效程度,遍歷所有特征及其所有可能的取值,每次選擇讓整個數(shù)據(jù)集總方差減小最多的特征及劃分特征值對數(shù)據(jù)進行劃分。

回歸樹算法中需要提前設定兩個參數(shù)以控制算法的停止時機,一個是容許的誤差下降值,一個是切分的最少樣本數(shù)。也就是如果這次最佳劃分使總方差的下降值小于預定閾值,或劃分后的兩個子集存在某個子集大小小于預定閾值,則停止繼續(xù)劃分。

使用CART構建樹時還會涉及到樹剪枝的問題,一棵樹如果節(jié)點過多,表示該模型可能對數(shù)據(jù)進行了過擬合,我們可以通過交叉驗證來判斷是否發(fā)生了過擬合,通過降低決策樹復雜度來避免過擬合的過程稱為剪枝,提前終止條件實際上就是預剪枝,另一種形式的剪枝需要使用訓練集和測試集,稱作后剪枝。

如果使用預剪枝,我們需要不斷的修改停止條件,而后剪枝則不需要用戶指定參數(shù),但相對的,后剪枝不如預剪枝有效。

后剪枝需要在樹構建完成后使用測試集,自上而下找到葉節(jié)點,然后嘗試合并相鄰的葉節(jié)點,如果合并葉節(jié)點后能夠降低在測試集上的誤差,那我們就合并掉兩個葉節(jié)點。

接下來要講的是模型樹,模型樹與回歸樹的區(qū)別在于,每個葉子節(jié)點下不再是常數(shù),而是用線性函數(shù)來對數(shù)據(jù)做擬合,整棵模型樹成為了一個分段線性函數(shù)。

比如上圖這樣的數(shù)據(jù)就相當適合采用模型樹來建模,整個數(shù)據(jù)集會被分為兩個葉子節(jié)點,每個葉子節(jié)點下是一個線性函數(shù)。

其劃分的基本思想仍然是找讓整個數(shù)據(jù)集總誤差最小的劃分方式,回歸樹中的方法不能再用,但是我們在上一節(jié)講過了相當多的線性模型,也講過了它們對應的計算誤差的方式(平方誤差),我們只要在每次嘗試劃分后對每個葉子節(jié)點下用線性模型去擬合該節(jié)點下的數(shù)據(jù),然后分別計算誤差值,選取使總誤差最小的劃分方式即可。

樹回歸在預測復雜數(shù)據(jù)集時會比簡單的線性模型更有效。

無監(jiān)督學習

前兩部分講的都是有監(jiān)督學習,所做的大多是:『對于輸入數(shù)據(jù)X能預測變量Y』,而無監(jiān)督學習要回答的問題是:『從數(shù)據(jù)X中能發(fā)現(xiàn)什么』。

K-均值聚類算法

一句話概要,首先,選擇k個初始點作為質心,然后為每個樣本點找距其最近的質心,并將其分配給該質心所對應的簇,然后將每個簇的質心更新為該簇所有點的平均值,既然質心位置改變了,那對樣本點的劃分自然也要隨之改變,如此不斷迭代,直到對所有樣本點的分類都不再改變,也即算法收斂。

既然存在質心的概念,就要使用某種距離度量方式計算,我們當然可以用歐式距離公式,也可以利用余弦距離,根據(jù)兩者夾角的大小表示距離的大小。

這里我舉一個利用K-均值聚類算法進行文本分類的例子,類似于前面的樸素貝葉斯算法,我們?yōu)槊科臋n建立一個詞向量,只不過用的既不是詞袋模型也不是詞集模型,首先去掉單詞表中的所有的停用詞,之后每個詞的對應位置放置的,是這個詞在這篇文檔當中的TF-IDF值,若該詞在該文檔中所占比例越大,則其TF值越大,而若該詞在所有文檔中的出現(xiàn)比例越高,則其IDF值越小,最后計算其TF*IDF的值(TF-IDF值),作為該詞表示所在文檔主題的能力。這樣我們就得到了每篇文檔的詞向量,隨后走K-均值聚類算法的流程,先給出若干隨機向量,對全部文檔進行第一次分類,這里的距離度量方式采用的就是余弦距離,通過判斷兩個向量夾角的余弦值來描述兩者間的距離關系,若其夾角為0度,則余弦值為1,若其夾角為180度,則余弦值為-1,認為夾角余弦值越大則兩篇文檔越相近,越小則兩者越無關。

接下來我們要談一下K-均值聚類算法所存在的問題,首先K值是由用戶定義的,很多時候用戶并不知道要將K設置成多少,而且又因為其初始質心的設置是依靠隨機生成,所以K-均值算法會收斂到局部最小值而不是全局最小值。

我們通過SSE(誤差平方和)來度量聚類效果,SSE值越小說明數(shù)據(jù)點越接近它們對應的質心,我們當然可以通過增加簇的個數(shù)來降低SSE,但這違背了我們聚類的目標,我們希望在保持簇數(shù)目不變的情況下提高簇的質量。

我們可以采用這樣的后處理來提高K-均值聚類算法的聚類質量:首先將SSE值最大的簇拆分成兩個簇,具體方法可以是對該簇內的數(shù)據(jù)運行K-均值聚類算法,同時將K設置為2,而且,為了保證總的簇數(shù)不變,我們還要將兩個質心合并,我們可以選擇合并兩個最近的質心,或者合并兩個使得SSE增幅最小的質心。

為了克服K-均值聚類算法可能會收斂到局部最小值的問題,有人提出了二分K-均值算法,一句話概要,該算法首先將所有點作為一個簇,然后將該簇一分為二,之后選擇其中一個簇繼續(xù)進行劃分,選擇哪個簇取決于對其劃分是否可以最大程度降低SSE值(是不是與構建樹的過程有些相似),上述基于SSE的劃分過程不斷重復,直到得到用戶指定的簇數(shù)目為止。

使用Apriori算法進行關聯(lián)分析

一句話概要,Apriori算法首先根據(jù)所給數(shù)據(jù)構建只有一個元素的項集,然后判斷每個項集的支持度,去掉支持度不足的項集,再組合一元素項集構建二元素項集,再去掉支持度不足的項集,如此不斷迭代,直到不存在擁有更多元素的頻繁項集。之后是發(fā)現(xiàn)關聯(lián)規(guī)則,關聯(lián)規(guī)則產生于頻繁項集,一個頻繁項集可以生成多條可能的關聯(lián)規(guī)則,我們利用分級法,先生成右邊只有一個元素的關聯(lián)規(guī)則,然后判斷每條規(guī)則的可信度,去掉可信度不足的規(guī)則,再將可信度足夠的規(guī)則拆分子集,生成右邊有兩個元素的關聯(lián)規(guī)則,再去掉可信度不足的規(guī)則,如此不斷迭代,直到不存在右側有更多元素的關聯(lián)規(guī)則。

關聯(lián)分析包括發(fā)現(xiàn)頻繁項集和關聯(lián)規(guī)則,頻繁項集是經(jīng)常出現(xiàn)在一塊的物品的集合,關聯(lián)規(guī)則暗示兩種物品之間可能存在很強的關系,而且這種關系是有方向性的,A->B和B->A是兩條不同的關聯(lián)規(guī)則。

然后定義支持度與可信度,支持度用來描述頻繁項集,可信度用來描述關聯(lián)規(guī)則。一個項集的支持度被定義為數(shù)據(jù)集中包含該項集的記錄所占的比例。如果一共有10條記錄,5條記錄中出現(xiàn)了A,那A的支持度就是1/2;如果3條記錄中同時出現(xiàn)了AB,那AB的支持度就是3/10。可信度是針對由A->B這樣的關聯(lián)規(guī)則來定義的,可信度的計算基于支持度,上例中,A->B的可信度就是AB的支持度3/10除以A的支持度1/2,等于3/5;如果要計算B->A的支持度,那除以的就應該是B的支持度。

上面提到,我們只用支持度足夠的一元素項集構建二元素項集,這里用到了一個簡單的原理,如果這個一元素項集的支持度未達到閾值,那所有包含該元素的多元素項集的支持度也不可能達到閾值,這個很好理解,因為包含該元素的每個多元素項集的出現(xiàn)次數(shù)都不可能高于該元素的出現(xiàn)次數(shù)。

另外,如果某項集本身不是頻繁項集,那由該項集生成出來的關聯(lián)規(guī)則,在計算上確實是有可能有足夠可信度的,比如A、B、AB均只出現(xiàn)了一次,那A->B,B->A的可信度都是100%,但我們不選擇采信該關聯(lián)規(guī)則,因為數(shù)據(jù)量太小。

上面還提到,我們只選擇拆分可信度足夠的關聯(lián)規(guī)則來找更進一步的關聯(lián)規(guī)則,這里同樣用到一個原理,如果某條規(guī)則不滿足最小可信度要求,那該規(guī)則的所有子集也不可能滿足最小可信度的要求。

舉個例子,我們找到一個頻繁項集0123,首先它可以生成這樣4條關聯(lián)規(guī)則:123->0、023->1、013->2、012->3。如果012->3這條關聯(lián)規(guī)則的可信度不夠,則12->03、02->13、01->23這三條關聯(lián)規(guī)則也不可能達到足夠的可信度。因為如果012->3這條關聯(lián)規(guī)則的可信度不夠,那么表示0123的支持度/012的支持度已經(jīng)不能滿足可信度需求,而01、02、12的支持度必然大于012的支持度,這種條件下,可信度計算公式的分子不變而分母增大,總可信度必然是減小的,所以更不可能高于可信度的最小閾值。既然12->03、02->13、01->23不滿足可信度要求,那就更不要說2->013、1->023、0->123了,證明同理。這種根據(jù)頻繁項集找關聯(lián)項集的方式也被叫做分級法。

FP-growth算法發(fā)現(xiàn)頻繁項集

一句話概要,FP指頻繁項集(Frequent Pattern),F(xiàn)P-growth專門用來發(fā)現(xiàn)頻繁項集,速度快于Apriori,只掃描數(shù)據(jù)集兩次,一次構建FP樹,一次從FP樹中挖掘頻繁項集。常被用來做輸入聯(lián)想,比如在百度搜索框里輸入『為什么』,就會聯(lián)想出一些有意思的東西。

FP-growth速度快于Apriori,因為Apriori對于每個潛在的頻繁項集都會掃描一遍數(shù)據(jù)集來判定其支持度是否達到要求。FP-growth只掃描數(shù)據(jù)集兩次,一次構建FP樹,一次從FP樹中挖掘頻繁項集。

那什么是FP樹?FP樹通過鏈接來連接相似元素,被連起來的元素項可以看成一個鏈表,示例如下:


FP樹

用于生成FP樹的數(shù)據(jù)

同搜索樹不同的是,一個元素項可以在一棵FP樹中出現(xiàn)多次。FP樹會存儲項集的出現(xiàn)頻率,而每個項集會以路徑的方式存儲在樹中。存在相似元素的集合會共享樹的一部分。只有當集合之間完全不同時,樹才會分叉。樹節(jié)點上給出集合中的單個元素及其所在序列中的出現(xiàn)次數(shù),路徑會給出該序列的出現(xiàn)次數(shù)。

上面的FP樹就是由下面的數(shù)據(jù)集生成的,一點點來分析,z一共出現(xiàn)了5次,其中zr(不包括zxyrt)出現(xiàn)1次,zxyrt出現(xiàn)1次,zxyst出現(xiàn)2次,這樣加起來,z出現(xiàn)了4次,看數(shù)據(jù),發(fā)現(xiàn)z還單獨出現(xiàn)了1次,所以一共5次。r一共出現(xiàn)了3次,是將3條路徑(zrzryrt、xsr)中的r出現(xiàn)次數(shù)相加。其實我們還可以發(fā)現(xiàn),原數(shù)據(jù)當中還有一些h、j、pvu、o、qe、m沒有在FP樹中出現(xiàn),這里也同樣引入了支持度的概念,數(shù)據(jù)集中出現(xiàn)次數(shù)小于3次的字母不被放入樹中。

第一次遍歷數(shù)據(jù)集會獲得每個元素項的出現(xiàn)頻率,接下來過濾掉不滿足最小支持度的元素項,之后對數(shù)據(jù)集中的每條數(shù)據(jù)按照元素項的絕對出現(xiàn)頻率來排序。在構建時,讀入每個項集并將其添加到一條已經(jīng)存在的路徑中,如果該路徑不存在,則創(chuàng)建一條新路徑。除此之外,我們還要建立一個頭指針表用來保持對每個滿足最小支持度字母的引用。至此,就完成了FP樹的構建。

之后要做的是從FP樹中挖掘頻繁項集,挖掘頻繁項集分為三個步驟:從FP樹中獲取條件模式基、利用條件模式基構建一個條件FP樹、迭代直到樹包含一個元素項為止。

首先是查找條件模式基,條件模式基是以所查找元素為結尾的路徑集合,通俗的來講也就是前綴路徑,一條前綴路徑是介于所查找元素與樹根節(jié)點之間的所有內容。我們可以先通過前面的頭指針表找到每個頻繁項每個元素項的位置,再向前上溯這棵樹直到根節(jié)點為止,以此來找到所有的前綴路徑,也就是條件模式基。

下面是每個頻繁項的條件模式基實例:


大括號里面的,是該條前綴路徑上的所有節(jié)點,z前面沒有別的節(jié)點,所以大括號中為空,大括號后面的數(shù)字代表了這條前綴路徑的出現(xiàn)次數(shù)。

接下來我們要做的是根據(jù)條件模式基構建條件FP樹,條件FP樹的構建與FP樹的構建非常相似,區(qū)別在于,條件FP樹是針對某個頻繁項來講的,我們在上一步中已經(jīng)找到了每個頻繁項的條件模式基,構造該頻繁項的條件FP樹所使用的數(shù)據(jù),就只是該頻繁項所對應的條件模式基,也就是說構造初始FP樹,我們用的是所有的數(shù)據(jù),構建每個頻繁項的條件FP樹,我們只用這個頻繁項的條件模式基。當然,構造條件FP樹時,也需要先排序然后去掉不滿足最低支持度的項,因為即便某項在全部的數(shù)據(jù)中是頻繁項,但在某頻繁項的條件模式基中卻不一定是頻繁項了。

接下來再對構建的條件FP樹去抽取條件模式基,再迭代構建條件FP樹,直到條件樹中沒有元素為止,如此我們就能得到所有的頻繁項集。

其他工具

利用PCA與SVD來簡化數(shù)據(jù)

PCA是主成分分析的簡寫,實際上就是將N維數(shù)據(jù)降維到最能代表數(shù)據(jù)集真實結構的K個正交維度上去(N>K),且這K個維度是重新構造而成的,而不是從原有N維中選取,這K維特征被稱為主成分。其價值在于四點:使數(shù)據(jù)集更容易使用、降低很多算法的計算開銷、去除噪聲、使結果易懂。

PCA對數(shù)據(jù)進行降維,我們要把高維度的數(shù)據(jù)去除噪聲,只保留最重要的N個維度,那怎么確定需要保留的維度呢?第一個維度選擇的是原始數(shù)據(jù)中方差最大的方向,通俗的講,就是給定大量數(shù)據(jù)點,我們畫出一條直線,盡可能的經(jīng)過這些點,這條直線的方向就是方差最大的方向(下面會給出示例圖)。接下來要找第二個維度,對第二個維度有這樣的要求,它需要與第一個維度正交,我們要在與第一個坐標軸正交的所有坐標軸里找到方差最大的方向作為第二個坐標軸,第三個坐標軸同理,它需要與前兩個坐標軸均正交。


PCA方法降維

原理如上文所講,那具體如何處理呢?這里會涉及到協(xié)方差矩陣的概念,首先,方差和標準差是用來描述一維數(shù)據(jù)的,而如果我們想要處理多維數(shù)據(jù),發(fā)現(xiàn)兩維數(shù)據(jù)之間的相關關系,就要用到協(xié)方差矩陣,我們依照方差公式類比推得協(xié)方差公式。


方差公式
協(xié)方差公式

若協(xié)方差的結果為正值,則說明兩者正相關;若為負值,則說明兩者負相關;為零則說明不相關,相互獨立。

上面的協(xié)方差公式只能處理二維問題,那我們要處理多維之間的相關關系,那自然該想到使用矩陣表示,由協(xié)方差組成的協(xié)方差矩陣。


三維數(shù)據(jù)下的協(xié)方差矩陣示例

接下來,我們求這個協(xié)方差矩陣的特征值,選擇保留K個最大的特征值,這K個特征值所對應的特征向量也就給出了K個最重要的真實結構,而且協(xié)方差矩陣是對稱陣,其特征值對應的特征向量都是相互正交的,滿足作為相互獨立坐標軸的條件,我們可以通過將原數(shù)據(jù)乘以這K個特征向量將其轉化到新空間。

而且我們其實還發(fā)現(xiàn)了一點,PCA方法中特征值最大的那個特征向量的方向(投影到該坐標軸后數(shù)據(jù)集總方差最大的方向),實際上也就是我們用最小二乘法對數(shù)據(jù)集進行擬合所得到的線性回歸直線的方向,這個是可以證明的,最小二乘法目標函數(shù)的優(yōu)化目標實際上就是找到數(shù)據(jù)集協(xié)方差矩陣(X'X)的最大特征值,而最大特征值對應的特征向量也就是最小二乘法的回歸直線。

PCA將N個特征降維到K個,所以可以用來進行數(shù)據(jù)壓縮,例如100維的向量最后可以用10維來表示,那么壓縮率為90%。

SVD是奇異值分解的簡稱,SVD同樣是將高維數(shù)據(jù)降低到低維,或者理解成在噪聲數(shù)據(jù)中抽取相關特征。

SVD的應用非常廣,其中一個就是隱性語義索引,SVD可以抽取文檔和詞的概念,也就是可以識別擁有同一主題的文章以及同義詞。舉個例子,如果我們要根據(jù)某個關鍵詞找出包含它的文章,如果文檔中的該詞包含了錯別字,或者使用的是該詞的同義詞,只基于詞語存在與否的搜索是無法找到這樣的文章的,但是使用SVD就可以做到。

SVD的另一個應用就是推薦系統(tǒng),簡單的推薦系統(tǒng)直接用余弦距離等計算項或者人之間的相似度,更先進的方法則先利用SVD從數(shù)據(jù)中構建出一個主題空間,然后再在該空間下計算相似度。對于原始數(shù)據(jù)矩陣進行SVD處理就能將數(shù)據(jù)壓縮到若干概念中去。

接下來先講SVD的推導過程,再根據(jù)原理更深入的講應用過程,推導過程有些復雜。

在推理SVD之前,先做一步EVD推理,SVD是奇異值分解,EVD是特征值分解,這里我們選擇一種特殊的矩陣,也就是對稱陣,前面我們也提到過對稱陣有種性質,就是它的特征向量相互正交,或者講可以構成一組正交基。

首先假設我們有一個滿秩對稱陣A,它的特征值是λ,相應的單位特征向量是x,假設一共有m個特征值。則根據(jù)特征值、特征向量的定義,下式成立:

將上式以矩陣形式表示:




兩側同時右乘U的逆矩陣得(因為U為正交陣,其逆矩陣等于其轉置):

假設我們現(xiàn)在要將一個新的向量x轉化到A所在的列空間之中,也即如下式:

由于上文中講,A為對稱陣,x為它的單位特征向量(舊x),所以x為一套正交基,所以我們就可以把新x這個向量用舊x這套正交基表示:

所以得到下式:


緊接著,中間的對角陣與右邊的a(也就是A的特征向量們)相乘,實際上就是對a在各個維度上進行拉伸或壓縮:

由上圖,如果A不滿秩,也就是A存在為零的特征值,那么中間的對角陣對角線上就存在零元素,這時候就會導致維度退化,映射后的向量會落在m維空間的子空間之中。

最后一個變換就是U對拉伸或壓縮后的向量做變換,由于UU'是互為逆矩陣,所以U變換是U'變換的逆變換。

因為UU'里面的是A的特征向量們,是一組正交基,對其拉伸壓縮后,向量之間仍然正交,所以實際上,A可以起到將一組正交基轉化到另一組正交向量的作用。

接下來要分析的是,對于任意一個M*N的矩陣A,A矩陣將N維空間中的向量映射到K(K<=M)維空間中(K是矩陣A的秩),現(xiàn)在的目標是,找到這樣一組正交基,經(jīng)過A變換后仍然是正交的。假設,已經(jīng)找到這樣一組v

經(jīng)過A映射后,將其映射為:

如果要使它們兩兩正交,即:


根據(jù)假設,存在:


所以如果我們將v選擇為A'A的特征向量的話,因為A'A是對稱陣,所以v之間兩兩正交,λA'A的特征值,那么:

所以我們就找到了一組正交基,經(jīng)過A變換之后仍然是正交的。

接下來我們將其單位化,因為:


所以:


單位化:


可得:


接下來:



從而:


即得:


SVD分解公式

SVD的核心原理,就是任意一個M*N的矩陣A,都能被拆分成M*M的正交陣U、M*N的對角陣Σ、N*N的正交陣V'的乘積。VA'A的特征向量矩陣,ΣA'A的奇異值矩陣,至于U,每個Ui都是由A*Vi并單位化(除以對應奇異值)后得出的。

而且如果A不滿秩,那利用矩陣分塊乘法就能對式子進行化簡,就能找到A對應的滿秩分解,A=XY,X是M*K,Y是K*N,K為A的秩。

前面講了原理,下面講SVD的應用,其實SVD除了基礎應用之外還有拓展出來的RSVD與SVD++,這里不講。

SVD的第一個用途是用來簡化數(shù)據(jù)(或者講去除噪聲),前面說的滿秩分解實際上就是將M*N的Σ對角陣中對角線上的零元素分塊出來與U、V'K列/行之后的元素相乘使其總結果為零,這樣就只剩下了M*K的X和K*N的Y。這樣既然有些維度可以因為對應奇異值為零被完全去掉而不影響結果,那么我們也可以將一些對應奇異值小的維度去掉,只保留擁有高奇異值的維度,從而減少了大量維度但只損失很少的信息。

SVD的第二個用途是在自然語言處理中,我在《數(shù)學之美》這本書上讀到。我們用A矩陣來描述成千上萬篇文章和幾十上百萬個詞的關聯(lián)性,A里面每一列是一篇文章,每一行代表一個詞,對應位置上是這個詞的加權詞頻(比如TF-IDF值),然后我們對A進行奇異值分解,分成這樣:A=XBY,這里和前面的:A=XY的關聯(lián)性在于,兩式的X相同,第二式的Y等于第一式中的BYX是M*K,B是K*K,Y是K*N。

第一個矩陣X是對詞分類的結果,它的每一行表示一個詞,每一列表示一個同義詞類,對應位置的值表示該詞和該同義詞類的相關性大小。

第三個矩陣Y是對文章分類的結果,它的每一列對應一篇文章,每一行表示一個主題,對應位置的值表示該文章和該主題的相關性大小。

第二個矩陣則展示了不同同義詞類和不同文章主題的相關性大小。

SVD的第三個用途是用在推薦系統(tǒng)中,同樣是用在推薦系統(tǒng)中,我在CSDN博客上看到了與《機器學習實戰(zhàn)》里面不一樣的用法,《機器學習實戰(zhàn)》里面,是根據(jù)我前面講的SVD的第一個用途,對用戶評分數(shù)據(jù)進行簡化,然后在簡化過的數(shù)據(jù)上運行相似度算法,所謂相似度算法也就是計算歐氏距離、余弦距離或者皮爾遜相關系數(shù)等。而我在博客中看到的用法如下:

前面我們證明了任意一個矩陣A都能被我們滿秩分解,那么現(xiàn)在我們有個評分矩陣R

我們將其分解:


上圖中的U表示用戶數(shù),I表示商品數(shù)。然后就是利用R中的已知評分訓練PQ使得PQ相乘的結果最好地擬合已知的評分,那么未知的評分也就可以用P的某一行乘上Q的某一列得到了:

我們還是采用之前的方法,先列損失函數(shù)(目標函數(shù))再優(yōu)化,這里采用平方誤差函數(shù):


優(yōu)化這個的方法用梯度下降就可以了,前面詳細講過。這個式子在梯度下降的時候,很容易讓人產生一個疑惑,x在哪?自變量在哪?好像只有w沒有x,的確,普通的式子中,都是將wx進行某種計算得到估計值,進而得到每個樣本的估計誤差值,但是在這個式子中,x實際上是一種對w的選取邏輯,也就是行號和列號,根據(jù)x選擇相應w進行計算,得到估計值,計算誤差,梯度下降優(yōu)化w,提高擬合效果。這是這個目標函數(shù)與其他使用梯度下降方法進行優(yōu)化的目標函數(shù)不同的地方。

第一個Topic機器學習基礎到此結束,下一個Topic是深度學習基礎。從1月15號到今天,正好一個月,在公司實習,996,只能抽業(yè)余時間來寫,一個月兩萬五千多字,對自己來講也算是在人工智能產品經(jīng)理方向走出的第一步,希望自己能繼續(xù)堅持下去,疏漏之處在所難免,希望得到各位前輩的批評指正。

也感謝能一句句看到這的你,如果你不是直接翻到結尾的話:)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
【社區(qū)內容提示】社區(qū)部分內容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內容

友情鏈接更多精彩內容