数据预处理的几个方法:白化、去均值、归一化、PCA

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述

以上转载自:http://ufldl.stanford.edu/wiki/index.php/%E7%99%BD%E5%8C%96
假定数据表示成矩阵为X,其中我们假定X是[N*D]维矩阵(N是样本数据量,D为单张图片的数据向量长度)。
去均值,这是最常见的图片数据预处理,简单说来,它做的事情就是,对待训练的每一张图片的特征,都减去全部训练集图片的特征均值,这么做的直观意义就是,我们把输入数据各个维度的数据都中心化到0了。这么做的目的是减小计算量,把数据从原先的标准坐标系下的一个个向量组成的矩阵,变成以这些向量的均值为原点建立的坐标系,使用python的numpy工具包,这一步可以用X -= np.mean(X, axis = 0)轻松实现。
归一化,归一化的直观理解含义是,我们做一些工作去保证所有的维度上数据都在一个变化幅度上。通常我们有两种方法来实现归一化。一个是在数据都去均值之后,每个维度上的数据都除以这个维度上数据的标准差(X /= np.std(X, axis = 0))。 另外一种方式是我们除以数据绝对值最大值,以保证所有的数据归一化后都在-1到1之间。多说一句,其实在任何你觉得各维度幅度变化非常大的数据集上,你都 可以考虑归一化处理。不过对于图像而言,其实这一步反倒可做可不做,像素的值变化区间都在[0,255]之间,所以其实图像输入数据天生幅度就是一致的。

PCA和白化/whitening,这是另外一种形式的数据预处理。在经过去均值操作之后,我们可以计算数据的协方差矩阵,从而可以知道数据各个维度之间的相关性,简单示例代码如下:
假定输入数据矩阵X是[ND]维的
X -= np.mean(X, axis = 0) # 去均值
cov = np.dot(X.T, X) / X.shape[0] # 计算协方差
得到的结果矩阵中元素(i,j)表示原始数据中,第i维和第j维的相关性。有意思的是,其实协方差矩阵的对角线包含了每个维度的变化幅度。另外,我们都知道协方差矩阵是对称的,我们可以在其上做矩阵奇异值分解(SVD factorization):
U,S,V = np.linalg.svd(cov)
其中U为特征向量,我们如果相对原始数据(去均值之后)去做相关操作,只需要进行如下运算:
Xrot = np.dot(X, U)
这么理解一下可能更好,U是一组正交基向量。所以我们可以看做把原始数据X投射到这组维度保持不变的正交基底上,从而也就完成了对原始数据的去相关。如果去相关之后你再求一下Xrot的协方差矩阵,你会发现这时候的协方差矩阵是一个对角矩阵了。而numpy中的np.linalg.svd更好的一个特性是,它返回的U是对特征值排序过的,这也就意味着,我们可以用它进行降维操作。我们可以只取top的一些特征向量,然后做和原始数据做矩阵乘法,这个时候既降维减少了计算量,同时又保存下了绝大多数的原始数据信息,这就是所谓的主成分分析/PCA:
Xrot_reduced = np.dot(X, U[:,:100])
这个操作之后,我们把原始数据集矩阵从[N
D]降维到[N*100],保存了前100个能包含绝大多数数据信息的维度。实际应用中,你在PCA降维之后的数据集上,做各种机器学习的训练,在节省空间和时间的前提下,依旧能有很好的训练准确度。

最后再提一下whitening操作。所谓whitening,就是把各个特征轴上的数据除以对应特征值, 从而达到在每个特征轴上都归一化幅度的结果。whitening变换的几何意义和理解是,如果输入的数据是多变量高斯,那whitening之后的 数据是一个均值为0而不同方差的高斯矩阵。这一步简单代码实现如下:
白化数据
Xwhite = Xrot / np.sqrt(S + 1e-5)
提个醒:whitening操作会有严重化噪声的可能。注意到我们在上述代码中,分母的部分加入了一个很小的数1e-5,以防止出现除以0的情况。 但是数据中的噪声部分可能会因whitening操作而变大,因为whitening操作的本质是把输入的每个维度都拉到差不多的幅度,那么本不相关的有微弱幅度变化的 噪声维度,也被拉到了和其他维度同样的幅度。当然,我们适当提高分母中的安全因子(1e-5)可以在一定程度上缓解这个问题。
下面给出图示:
这里写图片描述

图像预处理之减去RGB均值

减去RGB均值(实例以DIV2K数据集为例)
在计算机视觉领域中,一定免不了的就是图像预处理中的 逐个样本减去mean值的过程,那么为什么一定要做这一步呢?

为什么每张图片都要减去数据集均值呢?

原因:为了进行数据特征标准化,即像机器学习中的特征预处理那样对输入特征向量各维去均值再除以标准差,但由于自然图像各点像素值的范围都在0-255之间,方差大致一样,只要做去均值(减去整个图像数据集的均值或各通道关于图像数据集的均值)处理即可。

主要原理:我们默认自然图像是一类平稳的数据分布(即数据每一维的统计都服从相同分布),此时,在每个样本上减去数据的统计平均值可以移除共同的部分,凸显个体差异。

其效果如下所示:
在这里插入图片描述
可以看到天空的纹理被移除了,凸显了汽车和高楼等主要特征。

最值得注意的一点是,在计算均值之前就要预先划分好训练集验证集和测试集,然后只针对训练集计算均值,否则就违背了深度学习的原则:模型训练过程仅能从训练模型中获取信息。得到训练集的均值后,对训练集验证集和测试集分别减去该均值。

  • 13
    点赞
  • 90
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
白化是一种常用的数据预处理方法,它旨在将数据在各自特征轴上进行缩放和转换,使得各个特征之间的相关性更小,以便更好地进行后续数据分析和建模。 下面是一个简单的Python实现预白化的示例代码: ```python import numpy as np # 生成样本数据 X = np.random.rand(10, 5) # 计算特征均值和标准差 mean = np.mean(X, axis=0) std = np.std(X, axis=0) # 标准化样本数据 X_std = (X - mean) / std # 计算样本的协方差矩阵 cov_matrix = np.cov(X_std.T) # 对协方差矩阵进行特征值分解 eigenvalues, eigenvectors = np.linalg.eig(cov_matrix) # 计算变换矩阵W W = (eigenvectors / np.sqrt(eigenvalues)).T # 对样本数据进行预白化 X_pca = np.dot(X_std, W.T) # 输出预白化后的数据 print('预白化后的数据:\n', X_pca) ``` 在这个示例代码中,首先我们生成了一个10x5的样本数据矩阵X。然后我们计算了X在每个特征轴上的均值和标准差,并将其标准化得到X_std。接着,我们计算了X_std的协方差矩阵cov_matrix,并对其进行特征值分解,得到了协方差矩阵的特征向量和特征值。根据预白化的原理,我们可以将协方差矩阵的特征向量除以其对应的特征值的平方根,得到变换矩阵W。最后,我们将样本数据矩阵X_std和变换矩阵W相乘,得到了预白化后的数据矩阵X_pca。 值得注意的是,预白化通常是PCA降维方法的第一步,用于将数据在各自的特征轴上进行缩放和转换,使得各个特征之间的相关性更小,以便更好地进行后续数据分析和建模。因此,在实际使用中,预白化通常需要结合PCA降维方法一起使用,以便达到更好的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值