摘要
- python3.65
- 名词替换:每一个样本为每一行;每一个特征为每一列。
- 归一化,标准化,标准化代码实现都在代码片中。
前言
- 问:数据为什么要归一化或者标准化?
- 答:当一组数据中,所有特征对数据分析的作用都是一样,但是数值大小却差别很大的时候,就需要用到归一化或者标准化。
归一化
- 特点:通过对原数据的处理,转换数据范围在0-1之间
- 实现公式:
- 公式介绍:x2:最终值;x:每个特征的每个数据;max:该特征最大值;min:该特征最小值;mx:生成数据范围最大值;mi:生成数据最小值。mi,mx=0,1 (默认)
- 作用域:每一个特征(也就是每一列)
- 缺点:异常值对最大值和最小值影响很大,它对异常点处理不好,鲁棒性差。
- 适用场景:适合传统精确小数据场景(场景较少)
标准化
- 特点:通过对原始数据进行变换,把数据变为均值为0,方差为1的范围
- 实现公式:
- 公式介绍:x1:最终值;x:每个特征的每个数据;mean:该特征的平均值;:每个特征的标准差。
- 作用域:每一个特征(也就是每一列)
- 补充:如果出现异常点的话,由于具有一定的数据量,少量的异常点对平均值的影响不大,方差改变较小,进而x1的值影响较小。
代码片
#!/usr/local/bin/python3
# -*- coding: utf-8 -*-
# Author : rusi_
from sklearn.preprocessing import MinMaxScaler, StandardScaler # 归一化预处理
import numpy as np
def be_one():
"""
归一化处理
:return: None
"""
test_list = [[-1, -1, 2], [2, 4, 2],[6, 6, -1]]
mm = MinMaxScaler(feature_range=(2, 3)) # 默认为0,1的范围
data = mm.fit_transform(test_list)
print(data)
return None
def stand():
"""
标准化处理
:return: None
"""
std = StandardScaler()
data = std.fit_transform([[-1, -1, 2],
[2, 4, 2],
[6, 6, -1]])
print(data)
return None
def transform(dem_array):
"""
标准化算法实现
:param dem_array: array数组
:return: 标准化后的arry数组
"""
# 计算每列的均值以及标准差
mean = np.array([np.mean(dem_array[:, i]) for i in range(dem_array.shape[1])])
scale = np.array([np.std(dem_array[:, i]) for i in range(dem_array.shape[1])])
res_array = np.empty(shape=dem_array.shape, dtype=float)
for col in range(dem_array.shape[1]):
res_array[:, col] = (dem_array[:, col] - mean[col]) / scale[col]
return res_array
if __name__ == '__main__':
# be_one()
# stand()
print(transform(np.array([[-1, -1, 2],
[2, 4, 2],
[6, 6, -1]])))
来源:CSDN
作者:如厮__
链接:https://blog.csdn.net/rusi__/article/details/103687780