实现主成分分析与白化

news/2024/7/7 1:29:02

在这一节里,我们将总结PCA,ZCA白化算法,并描述如何使用高效的线性代数库来实现它们。

首先,我们需要确保数据的均值(近似)为零。对于自然图像,我们通过减去每个图像块(patch)的均值(近似地)来达到这一目标。为此,我们计算每个图像块的均值,并从每个图像块中减去它的均值。Matlab实现如下:

avg = mean(x, 1);     % 分别为每个图像块计算像素强度的均值。 
x = x - repmat(avg, size(x, 1), 1);

下面,我们要计算 \textstyle \Sigma = \frac{1}{m} \sum_{i=1}^m (x^{(i)})(x^{(i)})^T ,如果你在Matlab中实现(或者在C++, Java等中实现,但可以使用高效的线性代数库),直接求和效率很低。不过,我们可以这样一气呵成。

 

sigma = x * x' / size(x, 2);

这里,我们假设x为一个数据结构,其中每列表示一个训练样本(所以x是一个n×m的矩阵)。

接下来,PCA计算Σ 的特征向量。你可以使用Matlab的 eig函数来计算。但是由于 Σ 是对称半正定的矩阵,用 svd 函数在数值计算上更加稳定

 具体来说,如果你使用

[U,S,V] = svd(sigma);

那矩阵 U 将包含 Sigma 的特征向量(一个特征向量一列,从主向量开始排序),矩阵S 对角线上的元素将包含对应的特征值(同样降序排列)。矩阵 \textstyle V 等于 \textstyle U 的转置,可以忽略。

 (注意svd函数实际上计算的是一个矩阵的奇异值和奇异向量,就对称半正定矩阵的特殊情况来说,它们对应于特征值和特征向量,这里我们也只关心这一特例。)

 最后,我们可以这样计算\textstyle x_{\rm rot} 和 \textstyle \tilde{x} :

xRot = U' * x;          % 数据旋转后的结果。 
\textstyle \tilde{x} = U(:, 1 :k) ' * x; % 数据降维后的结果,这里k希望保留的特征向量的数目。

这以 \textstyle \tilde{x} \in \Re^k 的形式给出了数据的PCA表示。顺便说一下,如果 x 是一个包括所有训练数据的 \textstyle n×\textstyle m 矩阵,这也是一种向量化的实现方式,上面的式子可以让你一次对所有的训练样本计算出 xrot 和 \tilde{x} 。得到的 xrot 和 \tilde{x} 中,每列对应一个训练样本。

 为计算PCA白化后的数据\textstyle x_{\rm PCAwhite} ,可以用

xPCAwhite = diag(1./sqrt(diag(S) + epsilon)) * U' * x;

因为s的对角线包括了特征值 \textstyle \lambda_i ,这其实就是同时为所有计算样本i计算\textstyle x_{​{\rm PCAwhite},i} = \frac{x_{​{\rm rot},i} }{\sqrt{\lambda_i}} 的简洁表达。

最后,你也可以这样计算ZCA白化后的数据\textstyle x_{\rm ZCAwhite}:

xZCAwhite = U * diag(1./sqrt(diag(S) + epsilon)) * U' * x;

 

 

 

 

 

 

 

 

 

 

 

 

转载于:https://www.cnblogs.com/rong86/p/3559427.html


http://www.niftyadmin.cn/n/3641951.html

相关文章

实战 Groovy: Groovy:Java 程序员的 DSL

实战 Groovy: Groovy:Java 程序员的 DSL 用 Groovy 编写更少的代码,完成更多的工作Scott Davis, 创始人, ThirstyHead.comScott Davis 是国际知名作家、演讲家、软件开发人员。他是 ThirstyHead.com 的创始人,这是一家 Groovy 和 Grails 培训…

【Leetcode】1106. Parsing A Boolean Expression

题目地址: https://leetcode.com/problems/parsing-a-boolean-expression/ 给定一个表达式,该表达式是个类似于前缀表达式的布尔表达式,其中t代表true,f代表false,其定义是递归的: 1、单个t或者f是个表达…

通过与Java的比较,迅速掌握Groovy

Groovy轻松入门——通过与Java的比较,迅速掌握Groovy (更新于2008.10.18) 在前几篇文章中,我已经向大家介绍了Groovy是什么,学习Groovy的重要性等内容,还不了解Groovy的朋友不妨去看看我Blog中的 Groovy分类…

Test Manager之添加需求类型工作项

Test Manager 在创建套件的时候,会添加要求,这个地方只能添加需求。有时我们的工作项可能不叫需求,那么此时直接添加是无法添加的。我们可以通过配置进行实现。 1、进入服务器 2、允许输入cmd 3、 64位进入,cd C:\Program Files (…

【Leetcode】1323. Maximum 69 Number

题目地址: https://leetcode.com/problems/maximum-69-number/ 给定一个只含666和999的十进制数nnn,最多允许将其中一个666改为999(允许不改),问能得到的最大数是几。 显然要改最高的666,如果全是999则不…

基于金山快盘的Git服务器、快盘+ Git GUI 实现代码版本管理

Git,这货堪称神器,用了它就再也不想用其他VCS了,就像上了高速就不想再走国道一样。 Git的强大之处在于,你可以在局域网内的任何一个共享路径下创建仓库,而不需要运行任何服务。所有的操作都是基于本地的。这也不难理解…

【Leetcode】1309. Decrypt String from Alphabet to Integer Mapping

题目地址: https://leetcode.com/problems/decrypt-string-from-alphabet-to-integer-mapping/ 给定一个长nnn的加密过的字符串,其原文是个只含小写英文字母的串,加密方式是,将a变为1,b变为2,等等&#x…

我们需要不断进步,工作需要不断重构

我们需要不断进步进入新的公司已经快4个月了,从一开始就感觉这里的人都不错,比较和善,也比较喜欢技术,用一句话说“这是一个程序员的团队”。当时顶着很大的压力,拒绝了一个据说平均年薪20W的公司,选择呆在…