← 返回首页
标准化数据
发表时间:2024-04-07 14:43:17
标准化数据

标准化数据

1.标准化

当数据(x)按均值(μ)中⼼化后,再按标准差(σ)缩放,数据就变成满⾜均值为0,⽅差为1的分布,⽽这个过程,就叫做数据标准化(Standardization,⼜称Z-score normalization)。公式一般为:(X-mean)/std,其中mean是平均值,std是标准差。

从公式我们可以看出,标准化操作(standardization)是将数据按其属性(按列)减去平均值,然后再除以标准差。这个过程从几何上理解就是,先将坐标轴零轴平移到均值这条线上,然后再进行一个缩放,涉及到的就是平移和缩放两个动作。这样处理以后的结果就是,对于每个属性(每列)来说,所有数据都聚集在0附近,标准差为1。计算时对每个属性/每列分别进行。

2.标准化的三种方式

有以下三种方式:

3.归一化和标准化

当数据(x)按照最⼩值中⼼化后,再按极差(最⼤值 - 最⼩值)缩放,数据移动了最⼩值个单位,并且会被收敛到[0,1]之间,⽽这个过程,就叫做数据归⼀化(Normalization,⼜称Min-Max Scaling)。

标准化:将数据所防伪均值是0,方差为1的状态,公式如下:

归一化和标准化的具体区别:

  1. 归一化是将样本的特征值转换到同一量纲下把数据映射到[0,1]或者[-1, 1]区间内,仅由变量的极值决定,因区间放缩法是归一化的一种。而标准化是依照特征矩阵的列处理数据,其通过求z-score的方法,转换为标准正态分布,和整体样本分布相关,每个样本点都能对标准化产生影响。
  2. 从输出范围角度来看, 归一化的输出结果必须在 0-1 间。而标准化的输出范围不受限制。通常情况下在机器学习中,标准化是更常用的手段,归一化的应用场景是有限的。标准化更好保持了样本间距,且更符合统计学假设。

实例:

sklearn实现标准化。


#sklearn实现标准化
from sklearn.preprocessing import StandardScaler

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = StandardScaler()  # 实例化
scaler.fit(data)  # fit,本质是⽣成均值和⽅差

print("均值的属性mean_",scaler.mean_)  # 查看均值的属性mean_
print("⽅差的属性var_",scaler.var_)  # 查看⽅差的属性var_

x_std = scaler.transform(data)  # 通过接⼝导出结果

print("⽤mean()查看均值:",x_std.mean())
print("⽤std()查看⽅差:",x_std.std())
print("使⽤fit_transform(data)⼀步达成结果")
print(scaler.fit_transform(data))
print("使⽤inverse_transform逆转标准化")
print(scaler.inverse_transform(x_std))

实现归一化的三种方式。

# 使用numpy实现归一化
import numpy as np

print("使用numpy实现归一化")
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
x = np.array(data)
#print(x)
print("最小值:",x.min(axis=0))
print("最大值:",x.max(axis=0))

x_nor = (x - x.min(axis=0)) / (x.max(axis=0) - x.min(axis=0))
print(x_nor)
print("----------逆转归一化----------")
x_return = x_nor * (x.max(axis=0) - x.min(axis=0)) + x.min(axis=0)  # 逆转归一化
print(x_return)

# 使用pandas实现归一化
import pandas as pd

print("使用pandas实现归一化")
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
x = pd.DataFrame(data)
x_nor = (x - x.min()) / (x.max() - x.min())
print(x_nor)
print("----------逆转归一化----------")
x_return = x_nor * (x.max() - x.min()) + x.min()  # 逆转归一化
print(x_return)

from sklearn.preprocessing import MinMaxScaler
print("klearn完成归一化")

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]

# 实现归⼀化
scaler = MinMaxScaler()  # 实例化
scaler = scaler.fit(data)  # fit,在这⾥本质是⽣成min(x)和max(x)
result = scaler.transform(data)  # 通过接⼝导出结果
# print(result)

result_ = scaler.fit_transform(data)  # 训练和导出结果⼀步达成
print(result)
print("----------逆转归一化----------")
print(scaler.inverse_transform(result))

# 使⽤MinMaxScaler的参数feature_range实现将数据归⼀化到[0,1]以外的范围中
data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]]
scaler = MinMaxScaler(feature_range=(5, 10))  # 依然实例化
result = scaler.fit_transform(data)  # fit_transform⼀步导出结果
print(result)
# 当X中的特征数量⾮常多的时候,fit会报错并表示,数据量太⼤了我计算不了
# 此时使⽤partial_fit作为训练接⼝
# scaler = scaler.partial_fit(data)