当前位置:   article > 正文

数据归一化(详解,含代码实现)_归一化代码

归一化代码

数据归一化


  对于初学的朋友,不知道有没有这样的疑惑,数据归一化是什么?我们为什么要对数据进行归一化处理?
  不急,让我们从接下来的例子,发现数据归一化的真面目。

肿瘤大小(厘米)发现时间(天)
样本一1200
样本二5100

  不难计算,此时样本间的距离被发现时间所主导。

  那如果此时我们将发现时间使用年做单位又会有怎样的结果呢?

肿瘤大小(厘米)发现时间(年)
样本一10.55
样本二50.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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

 均值方差归一化

    针对于最值归一化的不足,我们可以采用均值归一化的方法来进行改进。均值方差归一化即将所有数据归一到均值为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)

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34

这一部分就介绍到这里了,欢迎大家一起交流学习。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/174543
推荐阅读
相关标签
  

闽ICP备14008679号