Stanford UFLDL教程 实现主成分分析和白化
實現主成分分析和白化
在這一節里,我們將總結PCA, PCA白化和ZCA白化算法,并描述如何使用高效的線性代數庫來實現它們。
首先,我們需要確保數據的均值(近似)為零。對于自然圖像,我們通過減去每個圖像塊(patch)的均值(近似地)來達到這一目標。為此,我們計算每個圖像塊的均值,并從每個圖像塊中減去它的均值。(譯注:參見PCA一章中“對圖像數據應用PCA算法”一節)。Matlab實現如下:
avg = mean(x, 1); ?% 分別為每個圖像塊計算像素強度的均值。 x = x - repmat(avg, size(x, 1), 1);下面,我們要計算 ,如果你在Matlab中實現(或者在C++, Java等中實現,但可以使用高效的線性代數庫),直接求和效率很低。不過,我們可以這樣一氣呵成。
sigma = x * x' / size(x, 2);(自己推導一下看看)這里,我們假設 x 為一數據結構,其中每列表示一個訓練樣本(所以x 是一個 × 的矩陣)。
接下來,PCA計算 Σ 的特征向量。你可以使用Matlab的 eig 函數來計算。但是由于Σ 是對稱半正定的矩陣,用 svd 函數在數值計算上更加穩定。
具體來說,如果你使用
[U,S,V] = svd(sigma);那矩陣 U 將包含 Sigma 的特征向量(一個特征向量一列,從主向量開始排序),矩陣S 對角線上的元素將包含對應的特征值(同樣降序排列)。矩陣 等于 的轉置,可以忽略。
(注意 svd 函數實際上計算的是一個矩陣的奇異值和奇異向量,就對稱半正定矩陣的特殊情況來說,它們對應于特征值和特征向量,這里我們也只關心這一特例。關于奇異向量和特征向量的詳細討論超出了本文范圍。)
最后,我們可以這樣計 算 和 :
xRot = U' * x; ?% 數據旋轉后的結果。 xTilde = U(:,1:k)' * x;?% 數據降維后的結果,這里k希望保留的特征向量的數目。這以 的形式給出了數據的PCA表示。順便說一下,如果x 是一個包括所有訓練數據的 × 矩陣,這也是一種向量化的實現方式,上面的式子可以讓你一次對所有的訓練樣本計算出 xrot 和 。得到的xrot 和 中,每列對應一個訓練樣本。
為計算PCA白化后的數據 ,可以用
xPCAwhite = diag(1./sqrt(diag(S) + epsilon)) * U' * x;因為 S 的對角線包括了特征值 ,這其實就是同時為所有樣本計算 的簡潔表達。
最后,你也可以這樣計算ZCA白化后的數據:
xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x;
中英文對照
對角線 diagonal
總結
以上是生活随笔為你收集整理的Stanford UFLDL教程 实现主成分分析和白化的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Stanford UFLDL教程 白化
- 下一篇: Stanford UFLDL教程 Sof