把無監督學習分成兩種
一種是化繁為簡,可以分成兩大類:聚類和降維
所謂的化繁為簡的意思是說,找一個函數,可以input看起來像樹的東西,output都是抽象的樹,把本來復雜的東西,變成比較簡單的output。在做無監督學習時,通常只會有函數中的一邊。比如找一個函數,可以把所有的樹都變成抽象的樹,但是擁有的數據,只有一大堆各種不同的圖像,不知道它的output長什么樣子。
另外一種是無中生有,找一個函數,隨機給它一個input(比如一個數字1),然后output一棵樹,輸入數字2,output另外一棵樹,輸入3,又是另外一棵樹。輸入一個隨機數,就自動畫一張圖出來,不同的數畫出來的圖不一樣。這個任務里面,要找的可以畫圖的函數,只有output沒有input。只有一大堆的圖像,但是不知道輸入什么數字才可以得到這些圖像。
聚類
K-means聚類
什么是聚類?
假設做圖像的聚類,現在有一大堆的圖像,然后把它們分成一類一類的。之后可以說,上圖左邊的圖像都屬於簇1,右邊的圖像都屬於簇2,上方的圖像都屬於簇3,就像貼標簽的意思,把本來有些不同的圖像,都用同一個class表示,就做到化繁為簡這件事情。
這里最關鍵的問題是到底要有幾個簇,這個就跟神經網絡是幾層一樣,是依賴經驗的,當然也不能太多,比如多到說9張圖像9個簇,那聚類就沒有意義,直接每個圖像一個簇就好了,或者說全部圖像都是一個簇,也跟沒有做一樣。
聚類方法最常用的就是K-means,有一大堆未標注數據\(x^1\)到\(x^N\),每一個\(x\)代表一張圖像,做成k個簇。
怎么做?
先找簇的中心,假如每一個對象都用一個向量表示,有\(K\)個簇就需要\(c^1\)到\(c^K\)個中心。
可以從訓練數據里隨機找\(K\)個對象出來作為初始化中心。
對所有數據,決定屬於哪一個簇,假設\(x^n\)和\(c^i\)最接近,那么\(x^n\)就屬於\(c^i\),用\(b_i^n\)表示。然后更新簇,所有屬於\(c^i\)的數據做平均,就是第\(i\)個簇新的中心,更新要反復進行。
之所以從數據集挑選\(K\)個樣本做初始化簇中心,有一個很重要的原因是,如果是純粹隨機的(不從數據集里挑),那很可能在第一次分配這個簇中心的時候,沒有任何一個樣本跟這個中心很像,也可以說這個簇沒有任何樣本,再次更新就會出錯。
層次聚類
假設有5個樣本做層次聚類,先要做一個樹結構。計算兩兩樣本的相似度,挑出最相似的數據對。
比如第一個和第二個樣本最相似,那就合並(比如用平均值代表),5個樣本變為4個樣本;再計算相似度,配對的是4,5樣本,然后把他們合並(平均值),變成3個樣本;接着計算相似度,配對的是黃色數據點和剩下的藍色數據點,再次合並(平均),最后只剩紅色和綠色,那么最后平均起來得到root。根據5筆數和之間的相似度,就建立出了一個樹結構。
樹結構只是告訴我們說哪些樣本比較像,還沒有做聚類。
怎么做聚類?
接下來要決定在這棵樹上切一刀,
比如在上圖藍線初切一刀,意味着把數據分成3簇,1、2為一簇,3單獨為一簇,4、5為一簇。
在紅色線切一刀,則1、2、3為一簇,4、5為一簇。
在綠色點切一刀,則1、2為一簇,3、 4、 5單獨為一簇。
層次聚類和K-means的差別
如何決定你簇的數目,在K-means里要自己決定k的值,而在層次聚類里要決定的是在哪里切一刀,如果切比較容易考慮的話,那層次聚類可能更好。
Distributed Representation
光做聚類的話是很卡的,做聚類就是以偏概全,因為每個對象都必須屬於某一個簇。就好像念力分成6大類,每個人都會被分配到6個大類其中一類,但是這樣分配太過粗糙,比如某個人的能力既有強化系的特性又有放出系的特性,只分為一類就會丟失很多信息,應該像上圖左下方一樣進行表示。
只分為一類就是以偏概全了,應該要用一個向量來表示每個對象,向量的每個維度代表了某一種特質(屬性)。這件事情叫做Distributed Representation。
如果對象是一個高維的東西,例如圖像,現在用它的特性來表示,就會把它從高維空間變成低維空間,這件事情叫做降維。Distributed Representation和降維是一樣的東西,不同的稱呼。
降維
為什么降維有用?
假設數據分布如上圖左邊,在3D空間里分布是螺旋的樣子,但是用3D描述數據分布比較浪費的,直覺上也可以感覺可以攤開變成右邊2D的樣子,只需要2D的空間就可以描述3D的信息。在3D空間里面解比較麻煩,那就在2D里做這個任務。
考慮一個比較具體的例子MNIST,在MNIST里面,每一個input的數字都是28*28的矩陣來描述。但是實際上,多數28 * 28矩陣轉成一個圖像看起來都不像數字,在28 * 28空間里是數字的矩陣是很少的。所以要描述一個數字,或許不需要用到28 * 28維,遠比28 * 28維少。
所以舉一個極端的例子,有一堆3,從像素點看要用28 * 28維來描述每張圖像。實際上,只要用一個維度就可以表示,中間的是3,其他的3都是中間的3左轉右轉10、 20度。所以唯一需要記錄的就是中間的3,左轉和右轉了多少度,即只需要角度的變化,就可以知道28維空間中的變化。
怎么做降維?
找一個函數,input是一個向量x,output是另外一個向量\(z\)(\(z\)的維度比\(x\)小)。
在降維里最簡單的方法是特征選擇,把數據的分布拿出來看一下, 在二維平面上發現數據集中在\(x_2\)維度,所以\(x_1\)這個維度沒什么用,那么就把他拿掉,等於是降維這件事。特征選擇不一定有用,有可能case里面任何一個維度都不能拿掉。
另一個常見的方法是PCA,函數是一個很簡單的線性函數,input \(x\)和output \(z\)之間的關系就是一個線性的transform,即\(x\)乘上一個矩陣\(W\) 得到\(z\) 。現在不知道\(z\)長什么樣子,要根據一大堆的\(x\)把\(W\)找出來。
PCA-投影角度
剛才講過PCA要做的事是找\(W\),假設一個比較簡單的case,考慮一個維度的case。假設要把我們的數據投射到一維空間上,即\(z\)只是一維的向量。\(w^1\)是\(W\)的第一行,和\(x\)(列向量)做內積得到一個標量\(z_1\)。
\(w^1\)應該長什么樣子?
首先假設\(w^1\)的長度是1,即\(||w^1||_2=1\),一定要有這個假設。
如果\(||w^1||_2=1\),\(w^1\)是高維空間中的一個向量,那么\(z_1就是\)就是\(x\)在\(w^1\)上的投影長度。
現在做的事情就是,求出每一個\(x\)在\(w^1\)上的投影,那\(w^1\)應該長什么樣子?
舉個例子,假設上圖右上方是\(x\)的分布,\(x\)都是二維的,每個點代表一只寶可夢,橫坐標是攻擊力,縱坐標是防御力。今天要把二維投影到一維,應該要選什么樣的\(w^1\)?可以選$w^1 $如上圖右上方右斜方向,也可以選左斜方向,選不同的方向,最后得到的投影的結果會不一樣。
那總要給我們一個目標,我們才知道要選什么樣的\(w^1\),現在目標是經過投影后得到的\(z_1\)的分布越大越好。我們不希望投影后所有的點都擠在一起,把本來數據點之間的奇異度消去。我們希望投影后,數據點之間的區別仍然看得出來,那么我們可以找投影后方差越大的那個\(w^1\) 。
看上面的例子,如果是右斜方向,那么方差較大,左斜方向方差則較小,所以更可能選擇右斜方向作為\(w^1\)。
從上面的例子里看,\(w^1\)代表了寶可夢的強度,寶可夢可能有一個隱藏的向量代表它的強度,這個隱藏的向量同時影響了防御力和攻擊力,所以防御力和攻擊力會同時上升。
如果要用方程表示,就會說現在要去最大化的對象是\(z_1\)的方差。
假設知道怎么做,解一下\(W\)。找到一個\(w^1\),讓\(z_1\)的方差最大。
接下來,你可能不想投影到一維的,想投影到二維平面,這時候就把\(x\)和另一個\(w^2\)做內積得到\(z_2\)。
\(z_1,z_2\)串起來就是\(z\),\(w^1,w^2\)的轉置排起來就是\(W\)的第一行和第二行。
找\(z_2\)和找\(z_1\)一樣,首先\(w^2\)的2-norm是1,希望\(z_2\)的分布越大越好,但是如果只是讓\(z_2\)的方差越大越好,那找出來的就是\(w_1\)(因為\(w_1\)是讓投影方差最大的),那么就需要再加一個約束。這個約束是,\(w_2\)要跟之前找出來的\(w_1\)正交(\(w_1\)和\(w_2\)的內積為0)。借助這個方法,你想投影到K維,就找\(w_1,w_2,...,w_k\)分別作為\(W\)的行。
找出來的\(W\)會是一個單位正交矩陣,\(w_i,w_j\)是正交的,\(w_1和w_2\)的2-norm都是1。
怎么解\(w_1,w_2\)?
其實要用拉格朗日乘子法。\(\bar{z_1}\)是\(z_1\)的均值,\(\bar{z_1}\)是summation over所有\(w^1\)跟\(x\)的內積,summation 跟\(w^1\)無關,把\(w^1\)提出來變為\(\large \bar{z_1}=w^1 \cdot \sum x=w^1\cdot \bar{x}\),得到\(w^1\)跟\(x\)的平均的內積。
我們要最大化的對象是\(z_1\)的方差(計算公式如上圖),\(a^Tba^Tb=a^Tb(a^Tb)^T\)中可以變為\((a^Tb)^T\)的原因是\(a^Tb\)是一個標量,標量轉置仍為自身。
summation over在\(x\)上,和\(w^1\)無關,看上圖左下方藍色框框,藍色框框內是\(x\)的協方差矩陣公式。
\(x\)的形式應該為\(\begin{bmatrix} \bf{x_1\\x_2\\ \vdots \\ x_n} \end{bmatrix}\),轉置則為\(\begin{bmatrix} \bf{x_1^T }& \bf{x_2^T} & \cdots & \bf{x_n^T} \end{bmatrix}\) ,注意里面每個\(\bf{x}\)都是一個向量,代表一個維度的所有樣本數值,例如協方差矩陣第一個元素為(假設\(x_1\)已經是減去均值后的值)
\(\frac{1}{N} \begin{bmatrix} x_1^1 & x_1^2 & \cdots & x_1^N\end{bmatrix}\)\(\begin{bmatrix} x_1^1 \\ x_1^2 \\ \cdots \\ x_1^N\end{bmatrix}=\frac{1}{N}((x_1^1)^2+(x_1^2)^2+\cdots +(x_1^N)^2)\)就是變量\(x_1\)與\(x_1\)的協方差,同理
\(\frac{1}{N} \begin{bmatrix} x_1^1 & x_1^2 & \cdots & x_1^N\end{bmatrix}\)\(\begin{bmatrix} x_2^1 \\ x_2^2 \\ \cdots \\ x_2^N\end{bmatrix}=\frac{1}{N}(x_1^1 x_2^1+x_1^2x_2^2+\cdots +x_1^Nx_2^N)\)就是變量\(x_1\)與\(x_2\)的協方差。
我們用\(S\)來描述\(x\)的協方差矩陣,現在問題變為要找一個\(w^1\),最大化\((w^1)^TSw^1\),但是這個最大化對象是有約束條件的,如果沒有約束條件的話,那把\(w^1\)每一個值都變得無窮大就結束了。
它的約束是\(w^1\)的2-norm要等於1。
\(S\)是\(x\)的協方差矩陣,對稱且半正定的(所有的特征值都是非負的)。這里先給出結論,\(w^1\)是協方差矩陣對應最大特征值的特征向量。
中間的計算過程需要用拉格朗日乘子法,加上約束后的目標函數為\(g(w^1)\),然后\(g\)對所有\(w\)(\(w\)是一個向量)做偏微分等於0,整理后得到一個式子\(Sw^1=\alpha w^1\),那么\(w^1\)就是\(S\)的一個特征向量。
但是\(S\)有很多個2-norm為1的特征向量,接下來要做的事情就是找使\((w^1)^TSw^1\)最大的\(w^1\)。把\((w^1)^TSw^1\)整理成\(\alpha (w^1)^Tw^1\),由於\((w^1)^Tw^1=1\),最后變為\(\alpha\) 。
當\(w^1\)對應最大的特征值時,\(\alpha\)最大(即是最大的特征值\(\lambda _1\))。
要找投影向量\(w_2\)(投影到\(w_2\)的方差第二大)的時候,要解的是上圖最上方的式子。最大化在\(w_2\)上投影的方差\((w^2)^TSw^2\),同時要有約束\((w^2)^Tw^2=1\)和\((w^2)^Tw^1=0\),\(w^2\)和\(w^1\)要是正交的。解這個問題,會發現\(w^2\)也是協方差矩陣的一個特征向量,對應到第二大的特征值\(\lambda_2\)。
再次使用拉個朗日乘子法,如上圖最上方第二行所示,要加上兩個約束條件,拉格朗日乘子為\(\alpha\)和\(\beta\)。
接下來對\(w^2\)里每個參數做偏微分,做完之后得到式子\(Sw^2-\alpha w^2-\beta w^1=0\)
然后左邊同乘\(w^1\)的轉置變成\((w^1)^TSw^2-\alpha (w^1)^T w^2-\beta (w^1)^T w^1=0\),
由於\((w^1)^Tw^1 =1,(w^1)^Tw^2=0\),而\((w^1)^TSw^2\)是一個標量,轉置等於自身,則
\((w^1)^TSw^2-\alpha (w^1)^T w^2-\beta (w^1)^T w^1=0\)
\(((w^1)^TSw^2)^T -\alpha \times0-\beta\times1=0\)
因為\(S\)是對稱的,轉置等於自身,則\(((w^1)^TSw^2)^T=(w^2)^TS^Tw^1=(w^2)^TSw^1\),那么
\((w^1)^TSw^2-\alpha (w^1)^T w^2-\beta (w^1)^T w^1=0\)
\(((w^1)^TSw^2)^T -\alpha \times0-\beta\times1=0\)
\((w^2)^TSw^1-\beta=0\)
我們知道\(Sw^1=\lambda_1w^1\)(計算特征值的公式),那么
\((w^1)^TSw^2-\alpha (w^1)^T w^2-\beta (w^1)^T w^1=0\)
\(((w^1)^TSw^2)^T -\alpha \times0-\beta\times1=0\)
\((w^2)^TSw^1-\beta=0\)
\((w^2)^T\lambda_1w^1=\beta=0\)
我們得到的結論是\(\beta=0\),那么原式變為\(Sw^2-\alpha w^2=0\),即\(Sw^2=\alpha w^2\)。所以知道\(w^2\)又是一個特征向量。
\((w^2)^TSw^2=(w^2)^T\alpha w^2=\alpha\),那么\((w^2)^TSw^2\)就等於特征值,是第二大的特征值,因為\(w^1\)已經對應了最大的特征值。因為\(S\)是對稱的,那么不同特征值對應的特征向量是正交的。
\(z\)的協方差矩陣是對角矩陣,也就是說如果做PCA,原來的數據分布可能是上圖右上方左邊的圖,做完PCA后,會做去相關性,讓不同的維度間的協方差為0,也就是說\(z\)是對角矩陣。
去相關性讓\(z\)為對角矩陣有什么用?
假設\(z\)是PCA后得到的新特征,使用新特征訓練model,假設model是一個生成模型,用高斯來描述某一個類別的分布,而使用高斯,就已經假設了輸入數據的協方差矩陣是對角矩陣(假設不同維度之間沒有相關性),這樣可以減少參數量。使用維度不相關的數據來訓練生成模型,那么就可以用簡單的模型,防止過擬合的問題。
為什么\(z\)的協方差矩陣是對角矩陣?
\(z\)的協方差計算公式如上圖所示,\(S\)是\(x\)的協方差矩陣,\(W^T\)的第一列為\(w^1\)。
\(w^1\)是\(S\)的特征向量,所以\(Sw^1=\lambda_1 w^1,Sw^k=\lambda_k w^k\),\(\lambda\)是特征值。
\(w^1\)是\(W\)的第一行,而\(W\)是一個正交矩陣,所以\(W \cdot w^1=\begin{bmatrix} w^1 \\ w^2 \\ \vdots \\ w^k\end{bmatrix}\begin{bmatrix} w^1 \end{bmatrix}=\begin{bmatrix} 1 \\0 \\ \vdots \\0 \end{bmatrix}\),是第一個維度為1,其余維度為0的向量\(e_1\)。\(W \cdot w^k=e_k\),\(e_k\)的第k維是1,其余都是0。
PCA-另外一個角度
假設現在考慮手寫數字識別,我們知道手寫數字其實是由一些基本成分組成的,這些基本成分可能是筆畫。例如斜的直線,橫的直線,比較長的直線,小圈、大圈等等,這些基本成分加起來以后得到一個數字。
基本成分我們寫作\(u^1,u^2,u^3...\),這些基本的成分其實就是一個一個的向量。考慮MNIST數據集,一張圖像是28 * 28像素,就是28*28維的向量。基本成分其實也是28 * 28維的向量,把這些基本成分向量加起來,得到的向量就代表了一個數字。
如果寫成公式的話,就如上圖最下方所示的公式。\(x\)代表某一張圖像的像素,用向量表示。\(x\)會等於\(u_1\)這個成分乘上\(c_1\),加上\(u_2\)這個成分乘上\(c_2\),一直加到\(u_k\)這個成分乘上\(c_K\),再加上\(\bar{x}\)(\(\bar{x}\)是所有圖像的平均)。所以每一張圖像,就是一堆成分的線性組合加上所有圖像的平均所組成的。
例如7是\(u^1,u^3,u^5\)加起來的結果,那么對7來說,公式里的\(c_1=1,c_2=0,c_3=1 ...\),所以可以用\(c_1,c_2,...,c_K\)來表示一張圖像,如果成分遠比像素維度小的話,那么用\(\begin{bmatrix} c_1\\c_2\\ \vdots \\c_K \end{bmatrix}\)表示一張圖片是會比較有效的。比如7可以由向量\(\begin{bmatrix} 1 \\0\\1\\0\\1 \\ \vdots \end{bmatrix}\)描述。
我們把公式里的\(\bar x\)移到左邊,\(x\)減\(\bar x\)等於一堆成分的線性組合,寫作\(\hat x\) 。
如果我們不知道\(K\)個\(u\)(成分)是什么,那怎么找出這\(K\)個向量?
找\(K\)個\(u\),讓\(x-\bar x\)和\(\hat x\)越接近越好,\(||(x-\bar x)-\hat x||_2\)稱為重構誤差,代表沒辦法用成分描述的部分。接下來,最小化\(||(x-\bar x)-\hat x||_2\),損失函數如上圖\(L\)。
回憶下PCA,\(w_1,w_2,...,w_K\)是\(x\)協方差矩陣的特征向量,事實上\(L\)的解就是PCA的\(w_1,...,w_K\)。
證明\(L\)的解就是PCA的\(w_1,...,w_K\)
現在有數據集\(x\),\(x^1-\bar x \approx c_1^1u^1+c_2^1u^2+...\)。\(x^1-\bar{x}\)是一個向量,\(u^1,u^2...,u^K\)是一排的向量,\(c_1^1,c_2^1...\)也排成一列,最后矩陣形式如上圖最下方所示。
左邊矩陣\(X\)的列數就是數據數量,有1萬筆數據就有一萬個列。
目標是最小化左邊矩陣\(X\)和右邊相乘得到的矩陣之間的誤差。
怎么求解這個最小化問題?
在線性代數里,任何矩陣都可以做奇異值分解,如上圖最下方所示。\(K\)就是成分的個數。把\(X\)分解成\(U,\Sigma,V\) ,\(U\)就是上圖的最上方的\(u^1,u^2,...\),\(\Sigma V\)就是關於\(c\)的部分。
用奇異值分解的矩陣拆解方法,拆出來的3個矩陣相乘,跟左邊矩陣\(X\)是最接近的。\(U\)的K個列是正交的,是\(XX^T\)最大的K個特征值對應的特征向量, 這里的\(XX^T\)就是\(\begin{bmatrix} x^1-\bar x & x^2-\bar x&...&x^K-\bar x \end{bmatrix} \cdot \begin{bmatrix} x^1-\bar x\\x^2-\bar x\\ \vdots \\ x^K-\bar x \end{bmatrix}\),是\(X,X\)的協方差矩陣。
PCA找出來的\(w\)是\(x\)協方差矩陣的特征向量,SVD里\(U\)的每一列都是\(x\)協方差矩陣的特征向量,其實SVD的\(U\)就是PCA的解。PCA找出來的\(W\)就是在最小化\(X\)和\(U\Sigma V\)的差異,PCA投影得到的其實就是\(\Sigma V\)(也就是上圖最上方\(c\)的向量) ,\(W\)就是基本成分。
Autoencoder
我們已經知道從PCA 找出來的\(w^1,w^2,...,w^K\)就是K個成分\(u^1,u^2,...,u^K\)。
我們有個成分線性組合叫做\(\hat x\) ,\(\large \hat x=\sum\limits_{k=1}^kc_kw^k\),我們希望的是\(\hat {x}\)和\(x-\bar x\)的重構誤差越小越好。
現在用SVD得到\(W\),那\(c_k\)的值是多少?
每一個樣本(如果是圖像識別的話,就是每一個圖像)都有一組自己的\(c_k\)(\(c_1^1,c_2^1,...\),\(c_1^2,c_2^2,...\)),那么\(c_k\)就各自找就好了。
這個問題其實是問,如果有K個向量(\(w^1,w^2,...,w^K\)),做span以后得到一個空間,這K個向量如何做線性組合,才能使\(\hat x\)最接近於\(x-\bar x\) 。因為K個向量是正交的,所以最好的\(c_k\) 可以直接求解,為\(c_k=(x-\bar x)\cdot w^k\)。
\(w^1,w^2,...,w^K\)做線性組合可以想成是做神經網絡。假設\(x-\bar x\)是一個向量,例如上圖最下方是一個三維的向量,如果\(K=2\)(兩個成分,即向量\(w^1,w^2\))。那么計算\(c_1=(x-\bar x)\cdot w^1\)就好像是計算一個神經元一樣,\(x-\bar x\)是input,\(w_1^1,w_2^1,w_3^1\)是權重,\(c_1\)是線性的神經元,沒有激活函數。
\(c_2\)也一樣
\(c_1\)乘上\(w_1^1\)(\(w_1\)的第一維)得到一個值\(\hat{x_1}\),乘上\(w_2^1\)得到\(\hat {x_2}\),乘上\(w_3^1\)得到\(\hat {x_3}\)
接下來再算\(c_2\)的,乘上\(w_1^2,w_2^2,w_3^2\)得到\(c_2\),再乘以\(w_1^2,w_2^2,w_3^2\)得到三個元素,加到\(c_1\)得到的三個元素上,就是最后的output \(\hat x\)。
我們訓練的標准是最小化\(\hat x\)和\(x-\bar x\)的差別,即希望神經網絡的output 跟\(x-\bar x\)越接近越好。
那么PCA可以表示成一個神經網絡,只有一個激活函數為線性的隱藏層,訓練的目標是讓output和input越接近越好,這個東西叫做autoencoder(自動編碼器)
這里會有一個問題,如果權重\(\{w^1,w^2,...,w^K\}\)不是用PCA的方式(找特征向量的方式),而是使用一個神經網絡,最小化error然后使用梯度下降求解,最后得到的結果會跟PCA解出來的\(w\)一樣嗎?
結果會不一樣,PCA解出來的\(w\)是正交的,而使用神經網絡得到的\(w\),不能保證一定是正交的。在SVD里面證明過,PCA得到的這組\(w^1,...,w^K\)可以讓重構誤差最小,但是用神經網絡不一定能找出來,不可能讓重構誤差比PCA找到的還要小。在線性情況下,使用PCA找\(w\)比較快,使用神經網絡則比較麻煩。
但是使用神經網絡的好處是,可以deep,可以改成有很多個隱藏層,這個就是deep autoencoder。
PCA的缺點
因為PCA是非監督學習,如果有一個未標注數據集,PCA把它們投影到一維上,會找一個讓投影數據方差最大的維度,比如上圖左上方的case里面,可能維度是斜下方紅線這一維。但是可能實際上,這是兩組數據集,分別代表了兩個類別,使用PCA會導致橙色點和藍色點結合在一起,投影數據就混合在一起沒辦法區別。那這時候就要引入標注數據,LDA就是考慮標注數據的降維方法。
另外一個缺點是,PCA是線性的,舉的例子會說有一個S型的流形曲面,我們希望做降維后,可以把它拉直,但PCA做不到這件事情。因為把曲面拉直是一個非線性變換,PCA能做的就是把它打扁,如上圖右下方所示,從上往下拍扁了,而不是拉開。
PCA實例
寶可夢
有800種寶可夢,每種寶可夢可以用6個特征來表示。所以每個寶可夢就是6維的數據點,6維向量。
現在用PCA來分析,PCA里常有的問題是到底需要幾個成分,即到底要把數據降到幾維。這個一般取決於你的目的是什么,比如你想做可視化,分析寶可夢特性之間的關系,6為沒辦法可視化,那就投影到二維。要用幾個主成分就好像是神經網絡需要幾層,每層幾個神經元一樣。
一個常見決定使用幾個主成分的方法是,去計算每個主成分(特征向量)對應的特征值,這個特征值代表在該主成分上投影數據的方差。
現在的例子里寶可夢是6維的,那就有6*6維的協方差矩陣,所以有6個特征值,如上圖計算每個特征值比例,結果是0.45,0.18,0.13,0.12,0.07,0.04。那第5、6個主成分的作用比較小,意味着投影數據的方差很小,寶可夢的特性在這兩個主成分上信息很少。那么分析寶可夢特性只需要前4個主成分。
PCA后選擇4個主成分,每個主成分是一個6維向量(因為原來每個特征都要投影,那就有6種投影數據)。
每個寶可夢可以想成是4主成分向量做線性組合的結果,且每只寶可夢組合的權重不同。
看第一個主成分PC1,數值都是正的,如果給它的權重大,意味着寶可夢6維都是強的,給它的權重小,意味着寶可夢6維都是弱的,所以第一個主成分,代表了這只寶可夢的強度。
看第二個主成分PC2,Def防御力是正值,速度是負值,那么增加權重的時候,會增加防御力並減小速度。
把第一個和第二個主成分畫出來如上圖最下方,圖上有800個點,每個點代表一只寶可夢。
第三個主成分PC3,特殊防御力是正的,攻擊力和HP都是負的,也就是說這是用攻擊力和HP來換取特殊防御力的寶可夢。
第四個主成分PC4,HP是正的,攻擊力和防御力是負的,這是用攻擊力和防御力換取生命值的寶可夢。
把第三、第四主成分畫出來如上圖最下方,維度是去相關的。
手寫數字識別
可以把每一張數字圖像拆成成分的線性組合,每一個成分也是一張圖像(28 *28 維的向量),所以可以把成分畫在圖上變成一張圖像。
通過PCA畫出前30個成分如上圖所示,白色的地方代表有筆畫。用這些成分做線性組合,就可以得到0-9的數字,所以這些成分叫做Eigen-digit。Eigen(本征)是說,這些成分都是協方差矩陣的特征向量。
人臉識別
上圖右上方有一大堆人臉,找它們前30個主成分。找出來就如上圖最下方所示,每張圖像都是哀怨的臉,叫做Eigen-face。把這些臉做線性組合,就可以得到所有的臉。
但這邊有沒有覺得有問題,因為主成分找出來的是成分,但是現在找出來的幾乎都是完整的臉,也不像是成分啊?像前面的數字識別,成分看起來也像是瑪雅文字,而不是筆畫,看起來也不是成分啊?
仔細想想PCA的特性,\(\alpha_1,\alpha_2\)這種權重可以是任何值,可以是正的,也可以是負的。所以當我們用這些主成分組成一張圖像的時候,可以把這些成分相加,也可以把這些成分相減,這就會導致你找出的東西不見得是一個圖的基本的結構。
比如我畫一個9,那可以先畫一個8,然后把下面的圈圈減掉,再把一缸加上去。我們不一定是把成分加起來,也可以相減,所以說就可以先畫一個很復雜的圖,然后再把多余的東西減掉。這些成分不見得就是類似筆畫的這種東西。
如果要得到類似筆畫的東西,就要用另一個技術NMF(非負矩陣分解)。PCA可以看成是對矩陣\(X\)做SVD,SVD就是一種矩陣分解的技術。如果使用NMF,就會強迫所有成分的權重都是正的,正的好處就是一張圖像必須由成分疊加得到,不能說先畫一個復雜的東西再去掉一部分,再來就是所有成分的每個維度都必須是正的。
所以在同樣的任務上,例如手寫數字的測試上,使用NMF時,找出來的主成分會如上圖所示。
你會發現,白色圖案類似於筆畫,找出來的主成分就成了筆畫了。
看臉的話,會發現如上圖所示。比較像臉的一部分,比如人中、眉毛、嘴唇、下巴。
矩陣分解-推薦系統
有時候,你會有兩種東西,兩種對象,它們之間受到某種共通的潛在因素操控。
假設現在做一個調查,調查每個人手上買的公仔的數目,A,B,C,D,E代表5個人,公仔人物是涼宮春日、御坂美琴、小野寺、小唯,調查結果如上圖。
你會發現在上面矩陣里的數值不是隨機出現的,買涼宮春日的人,比較有可能有御坂美琴;買小野寺的人,也比較有可能買小唯。這說明人和公仔有一些共同的特性,有共同的factor在操控這些事情發生。
動漫宅獲取可以分成兩種,一種是萌傲嬌的,一種萌天然呆的。每個人都是萌傲嬌和萌天然呆平面上的一個點,可以用一個向量表示,那么看上圖,A是偏萌傲嬌。每一個公仔角色,可能有傲嬌屬性或者天然呆屬性,所以每一個角色,也是平面上一個點,可以用一個向量描述。
如果某個人的屬性和角色的屬性匹配的話,他們背后的向量就很像(比如做內積的時候值很大),那么A就會買很多的涼宮春日。他們匹配的程度取決於潛在因素是不是匹配的。
所以ABC的屬性如上圖最左邊所示,A、B是萌傲嬌的,B稍微沒有那么傲嬌,C是萌天然呆。每個動漫角色后面也有傲嬌、天然呆這兩種屬性,如果人物屬性和角色屬性匹配的話,人買角色的可能性就很大。
但是傲嬌還是天然呆是潛在因素,沒有辦法直接被觀察。沒有人在意一個阿宅心里在想什么。也沒有辦法直接知道每一個動漫角色背后的屬性是什么。
我們知道的只有人買的角色的數目,然后憑着這種關系去推論每個人和每個動漫人物背后的潛在因素。每個人背后都有一個向量,代表萌傲嬌或者萌天然呆的程度。每個角色后面也有一個序列,代表是傲嬌或天然呆的屬性。
我們可以把購買的公仔數量合起來看做是一個矩陣\(X\) ,行數是人的數量,列數是公仔角色的數量。
現在有一個假設,矩陣\(X\)里的每個元素都來自於兩個向量的內積。為什么A會有5個涼宮春日的公仔,是因為\(r^A\cdot r^1\)的內積很大,約等於5。這件事情用數學公式表達的話,可以把\(r^A\)到\(r^M\)按列排起來,把\(r^1\)到\(r^4\)按行排起來,K是潛在因素的個數,一般沒辦法知道,需要自己測試出來。
上圖中右下方矩陣公式中,右邊兩個矩陣的N應該是M,代表M個人。
矩陣\(X\)的每個維度是什么?
比如最上角維度\(n_{A1}\)就是\(r^A \cdot r^1\),那么就是公仔數目的矩陣。
我們要做的事情就是找一組\(r^A\)到\(r^E\),找一組\(r^1\)到\(r^4\) ,讓兩個矩陣相乘后和矩陣\(X\)越接近越好,就是最小化重構誤差。這個就可以用SVD來解,把\(\Sigma\)並到左邊或右邊變成兩個矩陣就可以了。
有時候有些信息是缺失的,比如上圖所示的,你不知道ABC手上有沒有小野寺,可能在那個地區沒有發行,所以不知道發行的話到底會不會買。那用SVD就很怪,也可以把缺失值用0代替,但也很奇怪。
那有缺失值怎么辦呢?
可以用梯度下降的方法來做,寫一個損失函數,讓\(r^i\)(每個人背后的潛在因素)和\(r^j\)(角色背后的潛在因素)的內積和角色購買數量越接近越好。現在重點是,在summation over 元素的時候,可以避開缺失的數據,如果值是缺失的,就不計算。有了損失函數后,就可以使用梯度下降了。
根據剛才的方法實際計算一下,假設潛在因素的數量是2。那么\(A\)到\(E\)都是二維的向量,每個角色也是二維的向量。
數值代表了屬性的程度,把大的用紅色框框圈出來,會發現\(A、B\)萌同一組屬性,\(C、D、E\)萌同一種屬性,1,2有同樣的屬性,3,4有同樣的屬性。沒有辦法知道每個屬性代表什么,要先找出這些潛在因素,再去分析它的結果。有了這些潛在因素數據,就可以用來預測缺失值。已經知道了\(r^A\)和\(r^3\),那只要\(r^A\)和\(r^3\)做內積就可以了。
之前的model可以做得更精致一點,剛才說\(A\)背后的潛在因素乘上1背后的潛在因素,得到的結果就是矩陣里的數值。但是事實上,可能還會有其他因素操控這些數值。那么更精確的寫法就可以寫成\(r^A \cdot r^1+b_A+b_1 \approx 5\)。\(b_A\)是跟\(A\)有關的標量,代表了\(A\)有多喜歡買公仔,有的人就是喜歡買公仔,也不是喜歡某個角色。\(b_1\)是跟1有關的標量,代表了角色有多想讓人購買,這個事情是跟屬性無關的,本來人就會買這個角色。
然后修改損失函數如上圖所示,使用梯度下降求解即可。
矩陣分解-其他應用
矩陣分解還有其他的應用,比如可以用在主題分析上,把矩陣分解用在主題分析上,叫做LSA。技術是一樣的,把動漫角色換成文章,把人換成詞匯即可,table里的值就是詞頻。比如投資這個詞匯在Doc1里出現5次。有時候不只是用詞頻,會把詞頻乘上一個權重,代表詞本身有多重要,乘一個大的權重,就會更考慮這個詞,讓這個詞的重構誤差變得更小。
那怎么評估一個詞重不重要?
有很多方法,常用的有inverse document frequency(反文檔頻率)IDF。