郑州机械网站建设导航滑动整屏网站
news/
2025/10/4 10:17:01/
文章来源:
郑州机械网站建设,导航滑动整屏网站,毕业设计做网站做什么好,wordpress免邮箱 注册一、为什么要进行数据归一化
定义#xff1a;把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则#xff1a;样本的所有特征#xff0c;在特征空间中#xff0c;对样本的距离产生的影响是同级的#xff1b;问题#xff1a;特征数字化后#xff0c;由于取值…一、为什么要进行数据归一化
定义把所有数据的特征都归到 [0,1] 之间 或 均值0方差1 的过程。原则样本的所有特征在特征空间中对样本的距离产生的影响是同级的问题特征数字化后由于取值大小不同造成特征空间中样本点的距离会被个别特征值所主导而受其它特征的影响比较小例特征1 [1, 3, 2, 6, 5, 7, 9]特征2 [1000, 3000, 5000, 2000, 4000, 8000, 3000]计算两个样本在特征空间的距离时主要被特征2所决定定义将所有的数据具体操作时对每一组特征数据进行分别处理映射到同一个尺度中归一化的过程是算法的一部分二、数据归一化的方法
1.最值归一化MinMaxScalernormalization
将特征缩放至特定区间,将特征缩放到给定的最小值和最大值之间或者也可以将每个特征的最大绝对值转换至单位大小。这种方法是对原始数据的线性变换将数据归一到[0,1]中间。
转换函数为
其中x为数据集中每一种特征的值将数据集中的每一种特征都做映射 特点
1.多适用于分布有明显边界的情况如考试成绩、人的身高、颜色的分布等都有范围而不是些没有范围约定或者范围非常大的数据。
2.这种方法对于outlier非常敏感因为outlier影响了max或min值且被考虑在计算中了。
3.这种方法有个缺陷就是当有新数据加入时可能导致max和min的变化需要重新定义。 2. Z-scoreStandardScaler0均值归一化
标准化数据通过减去均值然后除以方差或标准差这种数据标准化方法经过处理后数据符合标准正态分布即均值为0标准差为1转化函数为 其中
μ每组特征的均值σ每组特征值的标准差X每一个特征值Xnorm归一化后的特征值 特点
1. 适用于 数据的分布本身就服从正态分布的情况。
2. 通常这种方法基本可用于有outlier的情况但是在计算方差和均值的时候outliers仍然会影响计算。所以在出现outliers的情况下可能会出现转换后的数的不同feature分布完全不同的情况。
3. 使用于数据分布没有明显的边界有可能存在极端的数据值。
4. 归一化后数据集中的每一种特征的均值为0方差为1。
5. 相对于最值归一化的优点是即使原数据集中有极端值归一化后依然满足均值为0方差为1不会形成一个有偏的数据。
6. 在分类、聚类算法中需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候这种方法(Z-score standardization)表现更好。
3. RobustScaler
如果你的数据包含许多异常值使用均值和方差缩放可能并不是一个很好的选择。这种情况下你可以使用 robust_scale 以及 RobustScaler 作为替代品。它们对你的数据的中心和范围使用更有鲁棒性的估计。 This Scaler removes the median中位数 and scales the data according to the quantile range(四分位距离也就是说排除了outliers) 三、其他细节及说明
1.归一化范围选择[0, 1] 还是 [-1, 1] ?
[-1,1]指存在负数但是不一定所有数据都在这个范围内例如下面的实战的截图
假设我们有一个只有一个hidden layer的多层感知机MLP的分类问题。每个hidden unit表示一个超平面每个超平面是一个分类边界。参数wweight决定超平面的方向参数bbias决定超平面离原点的距离。如果b是一些小的随机参数事实上b确实被初始化为很小的随机参数那么所有的超平面都几乎穿过原点。所以如果data没有中心化在原点周围那么这个超平面可能没有穿过这些data也就是说这些data都在超平面的一侧。这样的话局部极小点local minima很有可能出现。 所以在这种情况下标准化到[-1, 1]比[0, 1]更好。
1、在分类、聚类算法中需要使用距离来度量相似性的时候、或者使用PCA技术进行降维的时候StandardScaler表现更好。
2、在不涉及距离度量、协方差计算、数据不符合正太分布的时候可以使用MinMaxScaler。比如图像处理中将RGB图像转换为灰度图像后将其值限定在[0 255]的范围。
原因是使用MinMaxScaler其协方差产生了倍数值的缩放因此这种方式无法消除量纲对方差、协方差的影响对PCA分析影响巨大同时由于量纲的存在使用不同的量纲、距离的计算结果会不同。
而在StandardScaler中新的数据由于对方差进行了归一化这时候每个维度的量纲其实已经等价了每个维度都服从均值为0、方差1的正态分布在计算距离的时候每个维度都是去量纲化的避免了不同量纲的选取对距离计算产生的巨大影响。 2. 关于测试数据集的处理 1问题
训练数据集归一化很好理解用于训练模型那对于测试数据集如何归一化2方案
不能直接对测试数据集按公式进行归一化而是要使用训练数据集的均值和方差对测试数据集归一化3原因
原因1真实的环境中数据会源源不断输出进模型无法求取均值和方差的原因2训练数据集是模拟真实环境中的数据不能直接使用自身的均值和方差原因3真实环境中无法对单个数据进行归一化
对数据的归一化也是算法的一部分 4方式
(X_test - mean_train) / std_train
X_test测试集mean_train训练集的均值std_train训练集的标准差四、实战代码解析 1.自己实现前两种归一化
import numpy as np
x np.random.randint(0, 100, size 100) # 范围[0,100)注意左闭右开
x np.array(x, dtypefloat)x (x - np.min(x)) / (np.max(x) - np.min(x)) # 这样的操作是合法的xx np.random.randint(0, 100, size (50,2) )
xx xx.astype(float32)xx[:,0] (xx[:,0]-np.mean(xx[:,0]))/np.std(xx[:,0])
xx[:,1] (xx[:,1]-np.mean(xx[:,1]))/np.std(xx[:,1])
得到 可以发现最值归一化时操作后的数据中一定会有0和1且都是非负数。
0均值归一化时数据有正有负且不一定在[-1,1]范围内。 2.学习使用scikit-learn中的Scaler类
假设numpy数据的行数为数据样本个数列数为特征数。
方法1使用 sklearn.preprocessing.scale from sklearn import preprocessingimport numpy as npX_train np.array([[ 1., -1., 2.],
... [ 2., 0., 0.],
... [ 0., 1., -1.]])X_scaled preprocessing.scale(X_train) X_scaled
array([[ 0. ..., -1.22..., 1.33...],[ 1.22..., 0. ..., -0.26...],[-1.22..., 1.22..., -1.06...]])
sklearn.preprocessing.scale可以沿着特定的坐标轴对数据集进行归一化在均值附近集中化数据并缩放至单位方差.
参数包括sklearn.preprocessing.scaleX, axis 0, with_meanTrue, with_stdTrue, copyTrue
X需要进行集中化和缩放的数据类似于数组稀疏矩阵
axis整数默认是 0 用来计算均值和标准差的轴. 当 axis0 时对各个特征进行标准化当 axis1 时会对每个样本进行标准化
with_meanboolean布尔型默认是 True即在缩放之前对数据进行集中化
with_stdboolean布尔型默认是 True即缩放数据至单位方差 或单位标准差
copyboolean布尔型默认是 True可选填. 设置为 False 的时候即在原数据行上进行标准化并禁止复制 如果输入是 numpy 数组或是 scipy.sparse CSC 矩阵并且 axis 1 方法2使用 sklearn.preprocessing.StandardScaler scikit-learn中将训练数据集的均值和方差封装在了类Scalar中其中fit根据训练数据集获取均值和方差scikit-learn中返回一个Scalar对象 transform对训练数据集、测试数据集进行归一化
实例化StandardScaler()时不需要传入参数归一化并没有改变数据集而是又生成一个新的矩阵一般不要改变原数据
实战代码的具体步骤
数据分割——导入并实例化归一化模块——fit得到均值和方差——transform得到归一化后的数据集 ——继续后续操作
import numpy as np
from sklearn import datasetsiris datasets.load_iris()
X iris.data
y iris.target# 1归一化前将原始数据分割
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test train_test_split(X, y, test_size0.2,stratifyy, # 按照标签来分层采样shuffleTrue, # 是否先打乱数据的顺序再划分random_state1) # 控制将样本随机打乱# 2导入均值方差归一化模块StandardScaler
from sklearn.preprocessing import StandardScaler# 实例化不需要传入参数
standardScaler StandardScaler()# 3fit过程返回StandardScaler对象对象内包含训练数据集的均值和方差
# fit过程传入训练数据集
standardScaler.fit(X_train)
# 输出StandardScaler(copyTrue, with_meanTrue, with_stdTrue)# fit后可通过standardScaler查看均值和标准差
# standardScaler.mean_查看均值
# standardScaler.scale_查看标准差# 4transform对训练数据集和测试数据集进行归一化,分别传入对应的数据集
# 归一化并没有改变训练数据集而是又生成一个新的矩阵除非将新生成的数据集赋给原数据集,一般不改变原数据
X_train_standard standardScaler.transform(X_train)np.mean(X_train_standard[:,0])
np.var(X_train_standard[:,0])
X_test_standard standardScaler.transform(X_test)# 接下来就是使用归一化后的数据集训练并测试模型 4. scikit-learn的StandardScaler类中的内部逻辑
import numpy as npclass StandardScaler:def __init__(self):self.mean_ Noneself.scale_ Nonedef fit(self, X):根据训练数据集获取均值和标准差assert X.ndim 2,the dimension of X must be 2self.mean_ np.array([np.mean(X[:,i]) for i in range(0,X.shape[1])])self.scale_ np.array([np.std(X[:,i]) for i in range(0,X.shape[1])])return selfdef transform(self, X):将X根据这个StandardScaler进行均值方差归一化处理assert X_train.ndim 2, the dimension of X_train must be 2assert self.mean_ is not None and self.scale_ is not None,\must fit before transformassert X.shape[1] len(self.mean_),\the feature number of X must be equal to mean_ and std_reasX np.empty(shapeX.shape, dtypefloat)for col in range(X.shape[1]):resX[:,col] (X[:,col] - self.mean_[col]) / self.scale_[col]return resX
参考资料
1. https://www.cnblogs.com/volcao/p/9089716.html
2. https://www.cnblogs.com/bjwu/p/8977141.html
3. https://blog.csdn.net/wjplearning/article/details/81592304
4. https://blog.csdn.net/weixin_38002569/article/details/81910661 正则化相关内容
https://www.cnblogs.com/chaosimple/p/4153167.html
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/927009.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!