本文主要是介绍数据白化预处理,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
欢迎关注公众号,更多知识分享,多谢
数据白化预处理
随机向量的“零均值化”和“空间解相关”是最常用的两个预处理过程,其中“零均值化”比较简单,而“空间解相关”涉及一些矩阵的知识。
设有均值为零的随机信号向量 ,其自相关矩阵为
很明显, 是对称矩阵,且是非负定的(所有特征值都大于或等于0)。
现在,寻找一个线性变换 对 进行变换,即 ,使得
上式的含义是:y的各分量是不相关的,即 。通常将这个过程称为“空间解相关”、“空间白化”或“球化”。 称为空间解相关矩阵(空间白化矩阵、球化矩阵)。
由 的性质可知,其存在特征值分解:
是正交矩阵, 是对角矩阵,其对角元素是 特征值。
令
\begin{equation}\label{eq:B}B=\Sigma^{-1/2} Q^T\end{equation}
则有
因此,通过矩阵 线性变换后, 的各个分量变得不相关了。
对于 来说,特征值分解和奇异值分解是等价的,而奇异值分解的数值算法比特征值分解的数值算法具有更好的稳定性,因此一般都用奇异值分解来构造空间解相关矩阵 。
应该注意到,“空间解相关”不能保证各分量信号之间的“独立性”,但它能够简化盲分离算法或改善分离算法的性能。
注:以上来自戴老师《盲信号处理》的课件。
最为熟知的例子是白噪声。元素 可以是一个时间序列在相继时间点 的值,且在噪声序列中没有时间上得相关性。术语“白”来自于白噪声的能谱在所有频率上是一个常数这一事实,就像含有各种颜色的白光谱一样。白化的本质就是去相关加缩放。
式\eqref{eq:B}的解相关矩阵 肯定不是唯一的白化矩阵。容易看到,任何矩阵 ( 为正交矩阵)也是白化矩阵。这是因为对 ,下式成立:
一个重要的例子是矩阵 。这也是一个白化矩阵,因为它是用正交矩阵 左乘式\eqref{eq:B}的 得到的。这个矩阵称为 的逆均方根,并用 表示,因为它来自于均方根概念向矩阵的标准推广。
注:以上来自《Independent Component Analysis》
关于白化代码的实现,其实很简单,下面给一个
function [z_w varargout] = myWhiten(z)
%--------------------------------------------------------------------------
% 语法:z_w = myWhiten(z);
% [z_w T] = myWhiten(z);
% 输入:z是一个mxn的矩阵,包含m维随机变量的各n个采样点。
% 输出:z_w是白化版本的z。T是mxm的白化变换矩阵。
%--------------------------------------------------------------------------
%% 计算样本协方差
R = cov(z'); % 1表示除以N来计算协方差
%% 白化z
[U D ~] = svd(R, 'econ'); % 用eig也行,[U, D] = eig(R);
%% 下面求白化矩阵
T = U * inv (sqrt(D)) * U'; % 称为协方差矩阵的逆均方根,inv计算不会太耗时间,因为D为对角阵。inv(sqrt(D))*U'也是一个可行白化矩阵
%% 乘以白化矩阵实现白化
z_w = T * z;
if (nargout == 2)
varargout{1} = T;
end
另外可以直接利用FastICA的白化函数whitenv,它要配合其提供的PCA函数pcamat.m完成白化,其提供的例子中有提示如下
% EXAMPLE
% [E, D] = pcamat(vectors);
% [nv, wm, dwm] = whitenv(vectors, E, D);
之前写过关于FastICA工具箱的使用,再把使用白化的例子给出来吧:
% 测试whitenv函数
clc
clear
close all
% 加载matlab自带的数据
load cities
stdr = std(ratings);
sr = ratings./repmat(stdr,329,1);
sr = sr';
figure
boxplot(sr','orientation','horizontal','labels',categories)
% 测试
firstEig = 1;
lastEig = 9;
s_interactive = 'off';
sr = remmean(sr); % 下面的pcamat和whitenv都没有去均值,这里先做取均值处理
[E, D] = pcamat(sr, firstEig, lastEig, s_interactive);
[nv, wm, dwm] = whitenv(sr, E, D);
figure
boxplot(nv','orientation','horizontal','labels',categories)
结果如下
PCA: PCA的具有2个功能,一是维数约简(可以加快算法的训练速度,减小内存消耗等),一是数据的可视化。 PCA并不是线性回归,因为线性回归是保证得到的函数是y值方面误差最小,而PCA是保证得到的函数到所降的维度上的误差最小。另外线性回归是通过x值来预测y值,而PCA中是将所有的x样本都同等对待。 在使用PCA前需要对数据进行预处理,首先是均值化,即对每个特征维,都减掉该维的平均值,然后就是将不同维的数据范围归一化到同一范围,方法一般都是除以最大值。但是比较奇怪的是,在对自然图像进行均值处理时并不是不是减去该维的平均值,而是减去这张图片本身的平均值。因为PCA的预处理是按照不同应用场合来定的。 自然图像指的是人眼经常看见的图像,其符合某些统计特征。一般实际过程中,只要是拿正常相机拍的,没有加入很多人工创作进去的图片都可以叫做是自然图片,因为很多算法对这些图片的输入类型还是比较鲁棒的。在对自然图像进行学习时,其实不需要太关注对图像做方差归一化,因为自然图像每一部分的统计特征都相似,只需做均值为0化就ok了。不过对其它的图片进行训练时,比如首先字识别等,就需要进行方差归一化了。 PCA的计算过程主要是要求2个东西,一个是降维后的各个向量的方向,另一个是原先的样本在新的方向上投影后的值。 首先需求出训练样本的协方差矩阵,如公式所示(输入数据已经均值化过): 求出训练样本的协方差矩阵后,将其进行SVD分解,得出的U向量中的每一列就是这些数据样本的新的方向向量了,排在前面的向量代表的是主方向,依次类推。用U’*X得到的就是降维后的样本值z了,即: (其实这个z值的几何意义是原先点到该方向上的距离值,但是这个距离有正负之分),这样PCA的2个主要计算任务已经完成了。用U*z就可以将原先的数据样本x给还原出来。 在使用有监督学习时,如果要采用PCA降维,那么只需将训练样本的x值抽取出来,计算出主成分矩阵U以及降维后的值z,然后让z和原先样本的y值组合构成新的训练样本来训练分类器。在测试过程中,同样可以用原先的U来对新的测试样本降维,然后输入到训练好的分类器中即可。
有一个观点需要注意,那就是PCA并不能阻止过拟合现象。表明上看PCA是降维了,因为在同样多的训练样本数据下,其特征数变少了,应该是更不容易产生过拟合现象。但是在实际操作过程中,这个方法阻止过拟合现象效果很小,主要还是通过规则项来进行阻止过拟合的。 并不是所有ML算法场合都需要使用PCA来降维,因为只有当原始的训练样本不能满足我们所需要的情况下才使用,比如说模型的训练速度,内存大小,希望可视化等。如果不需要考虑那些情况,则也不一定需要使用PCA算法了。 Whitening: Whitening的目的是去掉数据之间的相关联度,是很多算法进行预处理的步骤。比如说当训练图片数据时,由于图片中相邻像素值有一定的关联,所以很多信息是冗余的。这时候去相关的操作就可以采用白化操作。数据的whitening必须满足两个条件:一是不同特征间相关性最小,接近0;二是所有特征的方差相等(不一定为1)。常见的白化操作有PCA whitening和ZCA whitening。 PCA whitening是指将数据x经过PCA降维为z后,可以看出z中每一维是独立的,满足whitening白化的第一个条件,这是只需要将z中的每一维都除以标准差就得到了每一维的方差为1,也就是说方差相等。公式为: ZCA whitening是指数据x先经过PCA变换为z,但是并不降维,因为这里是把所有的成分都选进去了。这是也同样满足whtienning的第一个条件,特征间相互独立。然后同样进行方差为1的操作,最后将得到的矩阵左乘一个特征向量矩阵U即可。 ZCA whitening公式为
这篇关于数据白化预处理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!