廢話:
這博客有三個月沒更新了。
三個月!!!尼瑪我真是夠懶了!!
這三個月我復習什么去了呢?
托福…………
也不是說我復習緊張到完全沒時間更新,
事實上我甚至有時間打LOL。
只是說,我一次就只能(只想?)做一件事情。
對我來說,在兩種不同思維之間轉換是十分耗費能量的。
說白了我!就!是!個!廢!柴!……哼……
前言:
PCA與白化,
就是對輸入數據進行預處理,
前者對數據進行降維,后者對數據進行方差處理。
雖說原理挺簡單,但是作用可不小。
之前的師兄做實驗的時候,就是忘了對數據預處理,
結果實驗失敗了。
可見好的PCA對實驗結果影響挺重要。
主成成分分析(PCA):
主要思想(我總結的):
通過拋棄攜帶信息量較少的維度對數據進行降維處理,從而加速機器學習進程。
方法:
一、數據的旋轉(其實我覺着,這個有點像向量正交化的過程)
1、使用的輸入數據集表示為
2、首先計算出協方差矩陣 ,如下所示:
可以證明,數據變化的主方向 就是協方差矩陣
的主特征向量,而 變化的次方向
是次特征向量,以此類推。
(證明略,事實上如果只是想實現算法這個定理不用理解。但我已決定重修線代(By Myself),因為越到后面越發現線性代數的重要性。)
3、我們可以通過matlab或其他線代軟件求解出協方差矩陣的特征向量,並按列排列如下:
是主特征向量(對應最大的特征值),
是次特征向量。以此類推,另記
為相應的特征值(數值遞減)。
4、旋轉數據。向量 構成了一個新基,可以用來表示數據。令
為訓練樣本,那么
就是樣本點 i 在維度 上的投影的長度(幅值)。
至此,以二位空間為例,我們可以把 用
基表達為:
引用UFDL兩張圖
可見變化最大的維度(攜帶信息最多,在我們EE人的眼中,交流能量(方差)可以用來表征信號的信息)被排到了最前。
旋轉前 | 旋轉后 |
![]() |
![]() |
二、數據的取舍
接上,我們用方差來表征一個信號的信息,在旋轉過后的數據中,我們把最后面方差較小的維度舍去。
保留下來的數據與原數據所攜帶的信息比為
一般取
(若向他人介紹PCA算法詳情,告訴他們你選擇的 保留了99%的方差)
總的來說,PCA后,數據的近似表示
即,我們舍去n維向量中的(n-k)維,用k維向量來表示數據,可見數據的維度被縮小了。
如,舍去第二維之后的數據
三、復原
其實一般都不復原,那么辛苦排除了無用信息還復原干蛋。只是說有這么個東西……
矩陣 有正交性,即滿足
,所以若想將旋轉后的向量
還原為原始數據
,將其左乘矩陣
即可:
, 驗算一下:
,即:
白化(Whitening):
主要思想(教程上的):
由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時輸入是冗余的。白化的目的就是降低輸入的冗余性;更正式的說,我們希望通過白化過程使得學習算法的輸入具有如下性質:(i)特征之間相關性較低;(ii)所有特征具有相同的方差。
方法:
在上一步PCA中,旋轉過后的維度間已經不具有相關性(果真正交化?)。因此這里只用將數據的方差化為一即可。
可知協方差矩陣對角元素的值為 ,
……為數據方差,方差歸一:
(對,就這么就完了,當然這只是最最最簡單的東西)
TIPS:
未防止 過於接近零,這樣在縮放步驟時我們除以
將導致除以一個接近0的值;這可能使數據上溢 。因而在實踐中,我們使用少量的正則化實現這個縮放過程,即在取平方根和倒數之前給特征值加上一個很小的常數
:
當 在區間
上時, 一般取值為
。
(教程上是這么說的,但是事實上我認為如果某一維度的過於接近零,這個維度在PCA過程中將會被舍棄。可能教程中針對的是未經過PCA的數據即:ZCAWhite?)
完結:?
基本上把幾個月的深度學習自己過了一遍(雖然有相當一部分是復制粘貼的0)。
后面的池化和卷積就不寫了,能用到的不多。
至於稀疏編碼寫不寫,還要看學不學。
因為在UFLDL里面這方面的內容還未完善,
而且稀疏編碼的激活函數都是可學習的,
不僅理解難度大,實現起來難度也大。
師兄學習的時候跑了兩天………………何況我的I3-M一代。
暫且就這樣吧。
接下來想學習python和theano,
提高應用能力,
然后向自己找點資料搞實驗。(事實上已經找到)
不過需要指導老師,和老師打交道什么的最不懂了。
自學DL后深深感到線性代數知識的匱乏,需要惡補。
同時發現這個是DL因為可並行計算很多,很有硬件加速的前途(FPGA?不過矩陣運算好像還不成熟?)。
要是做成芯片肯定很有前途啊~
管他呢!