深度学习数据预处理方法及示例


数据预处理在构建网络模型时是非常重要的,往往能够决定训练结果。当然对于不同的数据集,预处理的方法都会有或多或少的特殊性和局限性。在这里介绍三种当前最为普遍被广泛使用的预处理方法。

一、中心化/零均值化

零均值化就是将每一维原始数据减去每一维数据的平均值,将结果代替原始数据。
利用python具体实现如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)     #随机生成一个50*2(50个样本,2维)的实数矩阵
# print(x)
plt.scatter(x[:,1],x[:,0],color="red")  #以x的第二列为各点的横坐标,第一列为纵坐标
new_ticks = np.linspace(-1, 1, 5)		#固定坐标轴在-1到1之间,共5个值
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

#***************零值化******************#
x -= np.mean(x,axis = 0)  #去均值
#print(x)
plt.scatter(x[:,1],x[:,0],color="black")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
零值化后:
在这里插入图片描述
可以看到,同一坐标轴下,数据中心化了。

二、归一化

归一化就是将原始数据归一到相同尺度,通常有两种方法来实现归一化:

  • 原始数据除以数据绝对值的最大值,以保证所有的数据归一化后都在-1到1之间。
  • 原始数据零均值后,再将每一维的数据除以每一维数据的标准差。
    这里利用python实现第二种:
import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)    
# print(x)
plt.scatter(x[:,1],x[:,0],color="red") 
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.xticks(new_ticks)
plt.show()

#***************归一化******************#
x -= np.mean(x,axis = 0)  #去均值
x /= np.std(x)   #归一化
#print(x)
plt.scatter(x[:,1],x[:,0],color="red")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
归一化后:
在这里插入图片描述
可以看到,数据分布更均匀了。

三、PCA和白化

PCA:主成成分分析,首先将数据变成0均值的,然后计算数据的协方差矩阵来得到数据不同维度之间的相关性,协方差矩阵的第(i,j)个元素表示数据第i维和第j维特征的相关性,特别地,对角线上的元素表示方差。另外,协方差矩阵是对称并且半正定的。可以对该协方差矩阵进行SVD分解,其中U矩阵的列为特征向量,S对角线上的元素是奇异值(等同于特征值的平方)。为了对数据去相关,首先将数据(0均值后的)投影到特征向量上,注意,U的列是相互正交的向量,也因此它们可以被看成基向量。这种投影相当于将数据X旋转、投影到新的基向量轴上。如果再去计算Xrot的协方差矩阵的话,就会发现它是一个对角阵,说明不同维度之间不再相关。np.linalg.svd的一个很好的特性在于返回的U是按照其特征值的大小排序的,排在前面的就是主方向,因此可以通过选取前几个特征向量来减少数据的维度。
白化:把各个特征轴上的数据除以对应特征值,从而达到在每个特征轴上都归一化幅度的结果。也就是在PCA的基础上再除以每一个特征的标准差,以使其归一化,其标准差就是奇异值的平方根。

具体python实现如下:

import numpy as np
import matplotlib.pyplot as plt
from numpy import random

x = random.rand(50,2)    
# print(x)
plt.scatter(x[:,1],x[:,0],color="red")  
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

#***************PCA和白化***************#
x -= np.mean(x) # 去均值
cov = np.dot(x.T, x) / x.shape[0]   # 计算协方差矩阵得到相关性
U,S,V = np.linalg.svd(cov)			# 协方差矩阵奇异值分解
Xrot = np.dot(x, U)					# 去相关
Xrot_reduced = np.dot(x,U[:,:100])	# 降维
plt.scatter(Xrot_reduced[:,1],Xrot_reduced[:,0], color = "green")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()
#白化数据
Xwhite = Xrot / np.sqrt(S + 1e-5)
plt.scatter(Xwhite[:,1],Xwhite[:,0], color = "purple")
new_ticks = np.linspace(-1, 1, 5)
plt.xticks(new_ticks)
plt.yticks(new_ticks)
plt.show()

随机初始化:
在这里插入图片描述
PCA处理后:
在这里插入图片描述
白化处理后:
在这里插入图片描述
注意:在进行数据的预处理时,只能在训练数据上进行,然后应用到验证/测试数据上。

  • 3
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值