数据归一化(详解,含代码实现)
2020-03-15 18:22
1056 查看
数据归一化
对于初学的朋友,不知道有没有这样的疑惑,数据归一化是什么?我们为什么要对数据进行归一化处理?
不急,让我们从接下来的例子,发现数据归一化的真面目。
肿瘤大小(厘米) | 发现时间(天) | |
---|---|---|
样本一 | 1 | 200 |
样本二 | 5 | 100 |
不难计算,此时样本间的距离被发现时间所主导。
那如果此时我们将发现时间使用年做单位又会有怎样的结果呢?
肿瘤大小(厘米) | 发现时间(年) | |
---|---|---|
样本一 | 1 | 0.55 |
样本二 | 5 | 0.27 |
不难想象,此时样本间的距离又被肿瘤大小所主导。
这两种方式都
不能很好的同时反应样本中每个特征的重要程度,正是如此,我们需要对数据进行归一化处理。所谓的归一化处理就是
将所有的数据映射到同一尺度。接下来,我将介绍两种归一化的方式。
最值归一化
最值归一化即将所有的数据映射到0-1之间,映射的方式为:
其中X_max表示特征中的最大值,X_min表示特征中的最小值
这相当于把整个数据先映射到了从0到X_max - X_min这个范围中,然后,再找出对于这个X而言,相比于整个范围的所占的比例是多少,这样就将整个长度映射到了0-1之间。
那么最值归一化适用于什么情况呢?又有什么缺点呢?我们继续探讨。
假设,我们以工资作为数据,此时有100个人,其中99个人工资为1万块,1个人工资为100万块,那么这种情况下还适用于最值归一化吗?
显然,这样做是不合适的,此时1万块将会被映射到0的附近,100万块将会被映射到1,这时候映射的效果是不好的。
因此,由于
最值归一化其受outlier影响比较大,它更适用于有明显边界的情况。
百看不如一练,以下是对iris数据集采用MinMaxScaler的方法进行归一化。
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split class MinMaxScaler: def __init__(self): self.min_ = None self.max_ = None def fit(self,X): '''根据训练数据集X获得数据的最小值和最大值''' self.min_ = np.array([np.min(X[:,i]) for i in range(X.shape[1])]) self.max_ = np.array([np.max(X[:,i]) for i in range(X.shape[1])]) return self def transform(self,X): '''将X根据MinMaxScaler进行最值归一化处理''' resX = np.empty(shape=X.shape,dtype=float) for col in range(X.shape[1]): resX[:,col] = (X[:,col]-self.min_[col]) / (self.max_[col]-self.min_[col]) return resX iris = datasets.load_iris() #下载数据集 X = iris.data #获取特征值 y = iris.target #获取标签值 X_train,X_test,y_train,y_test = train_test_split(X,y)#对数据集进行划分 MinMaxScaler = MinMaxScaler() MinMaxScaler.fit(X_train) X_train = MinMaxScaler.transform(X_train) X_test = MinMaxScaler.transform(X_test) print("训练集归一化后数据") print(X_train) print("测试集归一化后数据") print(X_test)
均值方差归一化
针对于最值归一化的不足,我们可以采用均值归一化的方法来进行改进。均值方差归一化即将所有数据归一到均值为0方差为1的分布中,映射的方式为:
其中X_mean表示特征值对应的均值,S表示特征值对应的方差
这种归一化的方式,
适用于数据分布没有明显的边界,存在极端数据值的情况。
以下是其实现的代码:
import numpy as np from sklearn import datasets from sklearn.model_selection import train_test_split class StandardScaler: def __init__(self): self.mean_ = None self.scale_ = None def fit(self,X): '''根据训练数据集X获得数据的均值和方差''' self.mean_ = np.array([np.mean(X[:,i]) for i in range(X.shape[1])]) self.scale_ = np.array([np.std(X[:,i]) for i in range(X.shape[1])]) return self def transform(self,X): '''将X根据Standardcaler进行均值方差归一化处理''' resX = np.empty(shape=X.shape,dtype=float) for col in range(X.shape[1]): resX[:,col] = (X[:,col]-self.mean_[col]) / (self.scale_[col]) return resX iris = datasets.load_iris() #下载数据集 X = iris.data #获取特征值 y = iris.target #获取标签值 X_train,X_test,y_train,y_test = train_test_split(X,y) StandardScaler = StandardScaler() StandardScaler.fit(X_train) X_train = StandardScaler.transform(X_train) X_test = StandardScaler.transform(X_test) print("训练集归一化后数据") print(X_train) print("测试集归一化后数据") print(X_test)
这一部分就介绍到这里了,欢迎大家一起交流学习。
- 点赞 2
- 收藏
- 分享
- 文章举报
相关文章推荐
- Java语言实现数据结构栈代码详解
- Appium+python自动化(三十)- 实现代码与数据分离 - 数据配置-yaml(超详解)
- 数据挖掘之Apriori算法详解和Python实现代码分享
- 数据机构 C语言实现队列(含代码详解 易懂)
- 数据挖掘之Apriori算法详解和Python实现代码分享_python
- 【hbase】HBase基本数据操作代码实现详解
- 利用Python代码实现数据可视化的5种方法详解
- 数据挖掘之Apriori算法详解和Python实现代码分享
- 详解python实现数据归一化处理的方式:(0,1)标准化
- newxy+struts实现零java代码或极少java代码开发以数据为中心的web运用系统 作者:胡立新
- GridView控件删除行的操作提示及自定义数据行的代码实现
- 人机博弈之(六)------代码实现(1)常量数据
- DataList嵌套DataList 子DataList访问父DataList数据(1. 页面绑定后台代码实现 纯代码)
- PHP写MySQL数据 实现代码
- 数据加载等待页面的VB.NET代码实现
- AjaxPanel自定义控件实现页面无刷新数据交互(做了个示例程序, 效果确实比较Cool, 用法非常简单! )(示例代码下载)
- Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)
- Ajax 实现在WebForm中拖动控件并即时在服务端保存状态数据 (Asp.net 2.0)(示例代码下载)
- 手机电子书UMD数据格式实现代码(C#版)
- js 方法实现返回多个数据的代码