# Author:Nimo_Ding
'''
数据规范化的三种方法:
1、Mix-max规范化
将数据归到[0,1]区间
2、Z-Score规范化
将数据规范到0均值,1方差的标准正态分布上,减少我们说的百分制80分,500分制80分的数据值差异问题
3、小数定标规范化
将数据转化为[-1,1]区间内。
'''
# Python的SciKit-Learn库的使用
# 使用SciKit-Learn进行数据规范化
print('\n# 1、Min-max规范化')
'''
让原始数据投射到指定的空间[min,max],在SciKit-Learn里有一个函数MinMaxScaler是专门做这个的。
默认情况范围是[0,1],会将原始数据投放到[0,1]范围中。
'''
from sklearn import preprocessing
import numpy as np
# 初始化数据,每一行表示一个样本,每一列表示一个特征。
x=np.array([[0.,-3.,1.],
[3.,1.,2.],
[0.,1.,-1.]])
# 将数据进行[1,2]规范化
min_max_scaler = preprocessing.MinMaxScaler([1,2])
minmax_x = min_max_scaler.fit_transform(x)
print(minmax_x)
'''
[[1. 1. 1.66666667]
[2. 2. 2. ]
[1. 2. 1. ]]
'''
print('\n# 2、Z-Score规范化')
# preprocessing.scale(x)可以直接将给定的数据进行Z-Score规范化。
# 结果是将每行每列的值减去了平均值,再除以方差的结果,
# Z-Score将数据及进行规范化之后,数值都符合均值为0,方差为1的正态分布。
from sklearn import preprocessing
import numpy as np
x=np.array([[0.,-3.,1.],
[3.,1.,2.],
[0.,1.,-1.]])
scaled_x=preprocessing.scale(x)
print(scaled_x)
'''
[[-0.70710678 -1.41421356 0.26726124]
[ 1.41421356 0.70710678 1.06904497]
[-0.70710678 0.70710678 -1.33630621]]
'''
print('\n# 3、小数定标规范化')
from sklearn import preprocessing
import numpy as np
x=np.array([[0.,-3.,1.],
[3.,1.,2.],
[0.,1.,-1.]])
j=np.ceil(np.log10(np.max(abs(x))))
scaled_x=x/(10**j)
print(scaled_x)
'''
[[ 0. -0.3 0.1]
[ 0.3 0.1 0.2]
[ 0. 0.1 -0.1]]
'''
# 数据挖掘中数据变换比算法选择更重要。
# 在考试成绩中,我们都需要让数据满足一定的规律,达到规范性的要求,便于进行挖掘。
# 这就是数据变换的作用。如果不进行变换的话,要不就是维数过多,增加了计算的成本,要不就是数据过于集中,
# 很难找到数据之间的特征。
print('''\n
作业:
假设属性income的最小值和最大值分别是5000元和58000元,利用Min-Max规范化的方法将属性的值
映射到0至1的范围内,那么属性income的16000元将被转换为多少?
''')
from sklearn import preprocessing
import numpy as np
a=np.array([[5000],
[16000],
[58000]])
print(a)
min_max_scaler = preprocessing.MinMaxScaler([0,1])
min_max_a=min_max_scaler.fit_transform(a)
print(min_max_a)
'''
[[0. ]
[0.20754717]
[1. ]]
'''