白化whitening
作者:hjimce
一、相關理論
白化這個詞,可能在深度學習領域比較常遇到,挺起來就是高大上的名詞,然而其實白化是一個比PCA稍微高級一點的算法而已,所以如果熟悉PCA,那麼其實會發現這是一個非常簡單的算法。
白化的目的是去除輸入數據的冗餘信息。假設訓練數據是圖像,由於圖像中相鄰像素之間具有很強的相關性,所以用於訓練時輸入是冗餘的;白化的目的就是降低輸入的冗餘性。
輸入數據集X,經過白化處理後,新的數據X'滿足兩個性質:
(1)特徵之間相關性較低;
(2)所有特徵具有相同的方差。
其實我們之前學的PCA算法中,可能PCA給我們的印象是一般用於降維操作。然而其實PCA如果不降維,而是僅僅使用PCA求出特徵向量,然後把數據X映射到新的特徵空間,這樣的一個映射過程,其實就是滿足了我們白化的第一個性質:除去特徵之間的相關性。因此白化算法的實現過程,第一步操作就是PCA,求出新特徵空間中X的新座標,然後再對新的座標進行方差歸一化操作。
二、算法概述
1、首先是PCA預處理
上面圖片,左圖表示原始數據X,然後我們通過協方差矩陣可以求得特徵向量u1、u2,然後把每個數據點,投影到這兩個新的特徵向量,得到進行座標如下:
這就是所謂的pca處理。
2、PCA白化
所謂的pca白化是指對上面的pca的新座標X’,每一維的特徵做一個標準差歸一化處理。因爲從上面我們看到在新的座標空間中,(x1,x2)兩個座標軸方向的數據明顯標準差不同,因此我們接着要對新的每一維座標做一個標註差歸一化處理:
當然你也可以採用下面的公式:
X'爲經過PCA處理的新PCA座標空間,然後λi就是第i維特徵對應的特徵值(前面pca得到的特徵值),ε是爲了避免除數爲0。
3、ZCA白化
ZCA白虎是在PCA白化的基礎上,又進行處理的一個操作。具體的實現是把上面PCA白化的結果,又變換到原來座標系下的座標:
給人的感覺就像是在PCA空間做了處理完後,然後又把它變換到原始的數據空間。
具體源碼實現如下:
def zca_whitening(inputs):
sigma = np.dot(inputs, inputs.T)/inputs.shape[1]
U,S,V = np.linalg.svd(sigma)
ZCAMatrix = np.dot(np.dot(U, np.diag(1.0/np.sqrt(np.diag(S) + epsilon))), U.T)
return np.dot(ZCAMatrix, inputs)
參考文獻: