1. 程式人生 > >數據挖掘筆試面試(12)

數據挖掘筆試面試(12)

mod 反向 樹根 詳細 模型 word2vec 時代 只需要 當我

【校招面經】機器學習與數據挖掘常見面試題整理 part8

2018年08月04日 21:46:27 稻蛙 閱讀數:266

七十六、t-SNE

from:http://www.datakit.cn/blog/2017/02/05/t_sne_full.html

t-SNE(t-distributed stochastic neighbor embedding)是用於降維的一種機器學習算法,是由 Laurens van der Maaten 和 Geoffrey Hinton在08年提出來。此外,t-SNE 是一種非線性降維算法,非常適用於高維數據降維到2維或者3維,進行可視化。

SNE是通過仿射(affinitie)變換將數據點映射到概率分布上,主要包括兩個步驟:

  • SNE構建一個高維對象之間的概率分布,使得相似的對象有更高的概率被選擇,而不相似的對象有較低的概率被選擇。
  • SNE在低維空間裏在構建這些點的概率分布,使得這兩個概率分布之間盡可能的相似。

我們看到t-SNE模型是非監督的降維,他跟kmeans等不同,他不能通過訓練得到一些東西之後再用於其它數據(比如kmeans可以通過訓練得到k個點,再用於其它數據集,而t-SNE只能單獨的對數據做操作,也就是說他只有fit_transform,而沒有fit操作)

主要不足有四個:

  • 主要用於可視化,很難用於其他目的。比如測試集合降維,因為他沒有顯式的預估部分,不能在測試集合直接降維;比如降維到10維,因為t分布偏重長尾,1個自由度的t分布很難保存好局部特征,可能需要設置成更高的自由度。
  • t-SNE傾向於保存局部特征,對於本征維數(intrinsic dimensionality)本身就很高的數據集,是不可能完整的映射到2-3維的空間
  • t-SNE沒有唯一最優解,且沒有預估部分。如果想要做預估,可以考慮降維之後,再構建一個回歸方程之類的模型去做。但是要註意,t-sne中距離本身是沒有意義,都是概率分布問題。
  • 訓練太慢。有很多基於樹的算法在t-sne上做一些改進

七十七、奇異值分解(SVD)

from:http://www.cnblogs.com/go-go/p/9372863.html

奇異值往往對應著矩陣中隱含的重要信息,且重要性和奇異值大小正相關。每個矩陣A都可以表示為一系列秩為1的“小矩陣”之和,而奇異值則衡量了這些“小矩陣”對於A的權重。

奇異值分解(Singular Value Decomposition,以下簡稱SVD)是在機器學習領域廣泛應用的算法,它不光可以用於降維算法中的特征分解,還可以用於推薦系統,以及自然語言處理等領域。是很多機器學習算法的基石。本文就對SVD的原理做一個總結,並討論在在PCA降維算法中是如何運用運用SVD的。

1. 回顧特征值和特征向量

    我們首先回顧下特征值和特征向量的定義如下:

Ax=λx

    其中A是一個n×n的矩陣,x是一個n維向量,則我們說λ是矩陣A的一個特征值,而x是矩陣A的特征值λ所對應的特征向量。

    求出特征值和特征向量有什麽好處呢? 就是我們可以將矩陣A特征分解。如果我們求出了矩陣A的n個特征值λ1≤λ2≤...≤λn,以及這n個特征值所對應的特征向量{w1,w2,...wn},那麽矩陣A就可以用下式的特征分解表示:

A=WΣW−1

    其中W是這n個特征向量所張成的n×n維矩陣,而Σ為這n個特征值為主對角線的n×n維矩陣。

    一般我們會把W的這n個特征向量標準化,即滿足||wi||2=1, 或者說wTiwi=1,此時W的n個特征向量為標準正交基,滿足WTW=I,即WT=W−1, 也就是說W為酉矩陣。

    這樣我們的特征分解表達式可以寫成

A=WΣWT

    註意到要進行特征分解,矩陣A必須為方陣。那麽如果A不是方陣,即行和列不相同時,我們還可以對矩陣進行分解嗎?答案是可以,此時我們的SVD登場了。

2. SVD的定義

    SVD也是對矩陣進行分解,但是和特征分解不同,SVD並不要求要分解的矩陣為方陣。假設我們的矩陣A是一個m×n的矩陣,那麽我們定義矩陣A的SVD為:

A=UΣVT

    其中U是一個m×m的矩陣,Σ是一個m×n的矩陣,除了主對角線上的元素以外全為0,主對角線上的每個元素都稱為奇異值,V是一個n×n的矩陣。U和V都是酉矩陣,即滿足UTU=I,VTV=I。下圖可以很形象的看出上面SVD的定義:

技術分享圖片

    那麽我們如何求出SVD分解後的U,Σ,V這三個矩陣呢?

    如果我們將A的轉置和A做矩陣乘法,那麽會得到n×n的一個方陣ATA。既然ATA是方陣,那麽我們就可以進行特征分解,得到的特征值和特征向量滿足下式:

(ATA)vi=λivi

    這樣我們就可以得到矩陣ATA的n個特征值和對應的n個特征向量v了。將ATA的所有特征向量張成一個n×n的矩陣V,就是我們SVD公式裏面的V矩陣了。一般我們將V中的每個特征向量叫做A的右奇異向量。

    如果我們將A和A的轉置做矩陣乘法,那麽會得到m×m的一個方陣AAT。既然AAT是方陣,那麽我們就可以進行特征分解,得到的特征值和特征向量滿足下式:

(AAT)ui=λiui

    這樣我們就可以得到矩陣AAT的m個特征值和對應的m個特征向量u了。將AAT的所有特征向量張成一個m×m的矩陣U,就是我們SVD公式裏面的U矩陣了。一般我們將U中的每個特征向量叫做A的左奇異向量。

    U和V我們都求出來了,現在就剩下奇異值矩陣Σ沒有求出了。由於Σ除了對角線上是奇異值其他位置都是0,那我們只需要求出每個奇異值σ就可以了。

    我們註意到:

A=UΣVT⇒AV=UΣVTV⇒AV=UΣ⇒Avi=σiui⇒σi=Avi/ui

    這樣我們可以求出我們的每個奇異值,進而求出奇異值矩陣Σ。

    上面還有一個問題沒有講,就是我們說ATA的特征向量組成的就是我們SVD中的V矩陣,而AAT的特征向量組成的就是我們SVD中的U矩陣,這有什麽根據嗎?這個其實很容易證明,我們以V矩陣的證明為例。

A=UΣVT⇒AT=VΣUT⇒ATA=VΣUTUΣVT=VΣ2VT

    上式證明使用了:UTU=I,ΣT=Σ。可以看出ATA的特征向量組成的的確就是我們SVD中的V矩陣。類似的方法可以得到AAT的特征向量組成的就是我們SVD中的U矩陣。

    進一步我們還可以看出我們的特征值矩陣等於奇異值矩陣的平方,也就是說特征值和奇異值滿足如下關系:

σi=λi−−√

    這樣也就是說,我們可以不用σi=Avi/ui來計算奇異值,也可以通過求出ATA的特征值取平方根來求奇異值。

3. SVD計算舉例

    這裏我們用一個簡單的例子來說明矩陣是如何進行奇異值分解的。我們的矩陣A定義為:

A=???011110???

    我們首先求出ATA和AAT

ATA=(011110)???011110???=(2112)

AAT=???011110???(011110)=???110121011???

    進而求出ATA的特征值和特征向量:

λ1=3;v1=(1/2–√1/2–√);λ2=1;v2=(−1/2–√1/2–√)

    接著求AAT的特征值和特征向量:

λ1=3;u1=???1/6–√2/6–√1/6–√???;λ2=1;u2=???1/2–√0−1/2–√???;λ3=0;u3=???1/3–√−1/3–√1/3–√???

 

    利用Avi=σiui,i=1,2求奇異值:

???011110???(1/2–√1/2–√)=σ1???1/6–√2/6–√1/6–√???⇒σ1=3–√

???011110???(−1/2–√1/2–√)=σ2???1/2–√0−1/2–√???⇒σ2=1

當然,我們也可以用σi=λi−−√直接求出奇異值為3–√和1.

最終得到A的奇異值分解為:

A=UΣVT=???1/6–√2/6–√1/6–√1/2–√0−1/2–√1/3–√−1/3–√1/3–√??????3–√00010???(1/2–√−1/2–√1/2–√1/2–√)

      

4. SVD的一些性質 

    上面幾節我們對SVD的定義和計算做了詳細的描述,似乎看不出我們費這麽大的力氣做SVD有什麽好處。那麽SVD有什麽重要的性質值得我們註意呢?

    對於奇異值,它跟我們特征分解中的特征值類似,在奇異值矩陣中也是按照從大到小排列,而且奇異值的減少特別的快,在很多情況下,前10%甚至1%的奇異值的和就占了全部的奇異值之和的99%以上的比例。也就是說,我們也可以用最大的k個的奇異值和對應的左右奇異向量來近似描述矩陣。也就是說:

Am×n=Um×mΣm×nVTn×n≈Um×kΣk×kVTk×n

    其中k要比n小很多,也就是一個大的矩陣A可以用三個小的矩陣Um×k,Σk×k,VTk×n來表示。如下圖所示,現在我們的矩陣A只需要灰色的部分的三個小矩陣就可以近似描述了。

技術分享圖片

    由於這個重要的性質,SVD可以用於PCA降維,來做數據壓縮和去噪。也可以用於推薦算法,將用戶和喜好對應的矩陣做特征分解,進而得到隱含的用戶需求來做推薦。同時也可以用於NLP中的算法,比如潛在語義索引(LSI)。下面我們就對SVD用於PCA降維做一個介紹。

5. SVD用於PCA

    在主成分分析(PCA)原理總結中,我們講到要用PCA降維,需要找到樣本協方差矩陣XTX的最大的d個特征向量,然後用這最大的d個特征向量張成的矩陣來做低維投影降維。可以看出,在這個過程中需要先求出協方差矩陣XTX,當樣本數多樣本特征數也多的時候,這個計算量是很大的。

    註意到我們的SVD也可以得到協方差矩陣XTX最大的d個特征向量張成的矩陣,但是SVD有個好處,有一些SVD的實現算法可以不求先求出協方差矩陣XTX,也能求出我們的右奇異矩陣V。也就是說,我們的PCA算法可以不用做特征分解,而是做SVD來完成。這個方法在樣本量很大的時候很有效。實際上,scikit-learn的PCA算法的背後真正的實現就是用的SVD,而不是我們我們認為的暴力特征分解。

    另一方面,註意到PCA僅僅使用了我們SVD的右奇異矩陣,沒有使用左奇異矩陣,那麽左奇異矩陣有什麽用呢?

    假設我們的樣本是m×n的矩陣X,如果我們通過SVD找到了矩陣XXT最大的d個特征向量張成的m×d維矩陣U,則我們如果進行如下處理:

X′d×n=UTd×mXm×n

    可以得到一個d×n的矩陣X‘,這個矩陣和我們原來的m×n維樣本矩陣X相比,行數從m減到了k,可見對行數進行了壓縮。也就是說,左奇異矩陣可以用於行數的壓縮。相對的,右奇異矩陣可以用於列數即特征維度的壓縮,也就是我們的PCA降維。    

6. SVD小結 

    SVD作為一個很基本的算法,在很多機器學習算法中都有它的身影,特別是在現在的大數據時代,由於SVD可以實現並行化,因此更是大展身手。SVD的原理不難,只要有基本的線性代數知識就可以理解,實現也很簡單因此值得仔細的研究。當然,SVD的缺點是分解出的矩陣解釋性往往不強,有點黑盒子的味道,不過這不影響它的使用。

七十八、勢函數

技術分享圖片

七十九、word2vec原理_CBOW與Skip-Gram模型基礎

from:https://www.cnblogs.com/pinard/p/7160330.html

 word2vec是google在2013年推出的一個NLP工具,它的特點是將所有的詞向量化,這樣詞與詞之間就可以定量的去度量他們之間的關系,挖掘詞之間的聯系。雖然源碼是開源的,但是谷歌的代碼庫國內無法訪問,因此本文的講解word2vec原理以Github上的word2vec代碼為準。本文關註於word2vec的基礎知識。

1. 詞向量基礎

    用詞向量來表示詞並不是word2vec的首創,在很久之前就出現了。最早的詞向量是很冗長的,它使用是詞向量維度大小為整個詞匯表的大小,對於每個具體的詞匯表中的詞,將對應的位置置為1。比如我們有下面的5個詞組成的詞匯表,詞"Queen"的序號為2, 那麽它的詞向量就是(0,1,0,0,0)。同樣的道理,詞"Woman"的詞向量就是(0,0,0,1,0)。這種詞向量的編碼方式我們一般叫做1-of-N representation或者one hot representation.

技術分享圖片

    One hot representation用來表示詞向量非常簡單,但是卻有很多問題。最大的問題是我們的詞匯表一般都非常大,比如達到百萬級別,這樣每個詞都用百萬維的向量來表示簡直是內存的災難。這樣的向量其實除了一個位置是1,其余的位置全部都是0,表達的效率不高,能不能把詞向量的維度變小呢?

    Dristributed representation可以解決One hot representation的問題,它的思路是通過訓練,將每個詞都映射到一個較短的詞向量上來。所有的這些詞向量就構成了向量空間,進而可以用普通的統計學的方法來研究詞與詞之間的關系。這個較短的詞向量維度是多大呢?這個一般需要我們在訓練時自己來指定。

    比如下圖我們將詞匯表裏的詞用"Royalty","Masculinity", "Femininity"和"Age"4個維度來表示,King這個詞對應的詞向量可能是(0.99,0.99,0.05,0.7)。當然在實際情況中,我們並不能對詞向量的每個維度做一個很好的解釋。

技術分享圖片

    有了用Dristributed representation表示的較短的詞向量,我們就可以較容易的分析詞之間的關系了,比如我們將詞的維度降維到2維,有一個有趣的研究表明,用下圖的詞向量表示我們的詞時,我們可以發現:

King→−Man→+Woman→=Queen→

技術分享圖片

    可見我們只要得到了詞匯表裏所有詞對應的詞向量,那麽我們就可以做很多有趣的事情了。不過,怎麽訓練得到合適的詞向量呢?一個很常見的方法是使用神經網絡語言模型。

2. CBOW與Skip-Gram用於神經網絡語言模型

    在word2vec出現之前,已經有用神經網絡DNN來用訓練詞向量進而處理詞與詞之間的關系了。采用的方法一般是一個三層的神經網絡結構(當然也可以多層),分為輸入層,隱藏層和輸出層(softmax層)。

    這個模型是如何定義數據的輸入和輸出呢?一般分為CBOW(Continuous Bag-of-Words 與Skip-Gram兩種模型。

    CBOW模型的訓練輸入是某一個特征詞的上下文相關的詞對應的詞向量,而輸出就是這特定的一個詞的詞向量。比如下面這段話,我們的上下文大小取值為4,特定的這個詞是"Learning",也就是我們需要的輸出詞向量,上下文對應的詞有8個,前後各4個,這8個詞是我們模型的輸入。由於CBOW使用的是詞袋模型,因此這8個詞都是平等的,也就是不考慮他們和我們關註的詞之間的距離大小,只要在我們上下文之內即可。

技術分享圖片

    這樣我們這個CBOW的例子裏,我們的輸入是8個詞向量,輸出是所有詞的softmax概率(訓練的目標是期望訓練樣本特定詞對應的softmax概率最大),對應的CBOW神經網絡模型輸入層有8個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某8個詞對應的最可能的輸出中心詞時,我們可以通過一次DNN前向傳播算法並通過softmax激活函數找到概率最大的詞對應的神經元即可。

    

    Skip-Gram模型和CBOW的思路是反著來的,即輸入是特定的一個詞的詞向量,而輸出是特定詞對應的上下文詞向量。還是上面的例子,我們的上下文大小取值為4, 特定的這個詞"Learning"是我們的輸入,而這8個上下文詞是我們的輸出。

    這樣我們這個Skip-Gram的例子裏,我們的輸入是特定詞, 輸出是softmax概率排前8的8個詞,對應的Skip-Gram神經網絡模型輸入層有1個神經元,輸出層有詞匯表大小個神經元。隱藏層的神經元個數我們可以自己指定。通過DNN的反向傳播算法,我們可以求出DNN模型的參數,同時得到所有的詞對應的詞向量。這樣當我們有新的需求,要求出某1個詞對應的最可能的8個上下文詞時,我們可以通過一次DNN前向傳播算法得到概率大小排前8的softmax概率對應的神經元所對應的詞即可。

    以上就是神經網絡語言模型中如何用CBOW與Skip-Gram來訓練模型與得到詞向量的大概過程。但是這和word2vec中用CBOW與Skip-Gram來訓練模型與得到詞向量的過程有很多的不同。

    word2vec為什麽 不用現成的DNN模型,要繼續優化出新方法呢?最主要的問題是DNN模型的這個處理過程非常耗時。我們的詞匯表一般在百萬級別以上,這意味著我們DNN的輸出層需要進行softmax計算各個詞的輸出概率的的計算量很大。有沒有簡化一點點的方法呢?

3. word2vec基礎之霍夫曼樹

    word2vec也使用了CBOW與Skip-Gram來訓練模型與得到詞向量,但是並沒有使用傳統的DNN模型。最先優化使用的數據結構是用霍夫曼樹來代替隱藏層和輸出層的神經元,霍夫曼樹的葉子節點起到輸出層神經元的作用,葉子節點的個數即為詞匯表的小大。 而內部節點則起到隱藏層神經元的作用。

    具體如何用霍夫曼樹來進行CBOW和Skip-Gram的訓練我們在下一節講,這裏我們先復習下霍夫曼樹。

    霍夫曼樹的建立其實並不難,過程如下:

    輸入:權值為(w1,w2,...wn)的n個節點

    輸出:對應的霍夫曼樹

    1)將(w1,w2,...wn)看做是有n棵樹的森林,每個樹僅有一個節點。

    2)在森林中選擇根節點權值最小的兩棵樹進行合並,得到一個新的樹,這兩顆樹分布作為新樹的左右子樹。新樹的根節點權重為左右子樹的根節點權重之和。

    3) 將之前的根節點權值最小的兩棵樹從森林刪除,並把新樹加入森林。

    4)重復步驟2)和3)直到森林裏只有一棵樹為止。

    下面我們用一個具體的例子來說明霍夫曼樹建立的過程,我們有(a,b,c,d,e,f)共6個節點,節點的權值分布是(16,4,8,6,20,3)。

    首先是最小的b和f合並,得到的新樹根節點權重是7.此時森林裏5棵樹,根節點權重分別是16,8,6,20,7。此時根節點權重最小的6,7合並,得到新子樹,依次類推,最終得到下面的霍夫曼樹。

技術分享圖片

    那麽霍夫曼樹有什麽好處呢?一般得到霍夫曼樹後我們會對葉子節點進行霍夫曼編碼,由於權重高的葉子節點越靠近根節點,而權重低的葉子節點會遠離根節點,這樣我們的高權重節點編碼值較短,而低權重值編碼值較長。這保證的樹的帶權路徑最短,也符合我們的信息論,即我們希望越常用的詞擁有更短的編碼。如何編碼呢?一般對於一個霍夫曼樹的節點(根節點除外),可以約定左子樹編碼為0,右子樹編碼為1.如上圖,則可以得到c的編碼是00。

    在word2vec中,約定編碼方式和上面的例子相反,即約定左子樹編碼為1,右子樹編碼為0,同時約定左子樹的權重不小於右子樹的權重。

    我們在下一節的Hierarchical Softmax中再繼續講使用霍夫曼樹和DNN語言模型相比的好處以及如何訓練CBOW&Skip-Gram模型

數據挖掘筆試面試(12)