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