歸一化:
1、把數變為(0,1)之間的小數
主要是為了數據處理方便提出來的,把數據映射到0~1范圍之內處理,更加便捷快速。
2、把有量綱表達式變為無量綱表達式
歸一化是一種簡化計算的方式,即將有量綱的表達式,經過變換,化為無量綱的表達式,成為純量。
歸一化算法有:
1.線性轉換
y=(x-MinValue)/(MaxValue-MinValue)
2.對數函數轉換:
y=log10(x)
3.反余切函數轉換
y=atan(x)*2/PI
4.線性也與對數函數結合
式(1)將輸入值換算為[-1,1]區間的值,
在輸出層用式(2)換算回初始值,其中和分別表示訓練樣本集中負荷的最大值和最小值。
標准化/規范化:
數據的標准化是將數據按比例縮放,使之落入一個小的特定區間。由於信用指標體系的各個指標度量單位是不同的,為了能夠將指標參與評價計算,需要對指標進行規范化處理,通過函數變換將其數值映射到某個數值區間。
標准化算法有:
1.z-score標准化(或零-均值標准化)(常用)
y=(x-X的平均值)/X的標准差=(x-mean)/std
優點:當X的最大值和最小值未知,或孤立點左右了最大-最小規范化時,該方法有用
2.最小-最大規范化(線性變換)
y=( (x-MinValue) / (MaxValue-MinValue) )(new_MaxValue-new_MinValue)+new_minValue
3.小數定標規范化:通過移動X的小數位置來進行規范化
y= x/10的j次方 (其中,j使得Max(|y|) <1的最小整數
4.對數Logistic模式:
新數據=1/(1+e^(-原數據))
5.模糊量化模式:
新數據=1/2+1/2sin[派3.1415/(極大值-極小值)*(X-(極大值-極小值)/2) ] X為原數據
用sklearn實現:
1.z-score:
公式為:(X-mean)/std 計算時對每個屬性/每列分別進行。
將數據按期屬性(按列進行)減去其均值,並處以其方差。得到的結果是,對於每個屬性/每列來說所有數據都聚集在0附近,方差為1。
實現時,有兩種不同的方式:
-
使用sklearn.preprocessing.scale()函數,可以直接將給定數據進行標准化。
import numpy as np from sklearn.preprocessing import scale X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) X_scaled = scale(X) print X_scaled #[[ 0. -1.22474487 1.33630621] # [ 1.22474487 0. -0.26726124] # [-1.22474487 1.22474487 -1.06904497]] print X_scaled.mean(axis = 0) #[ 0. 0. 0.] print X_scaled.std(axis = 0) #[ 1. 1. 1.]
-
使用sklearn.preprocessing.StandardScaler類,使用該類的好處在於可以保存訓練集中的參數(均值、方差)直接使用其對象轉換測試集數據。
import numpy as np from sklearn.preprocessing import StandardScaler X = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) scaler = StandardScaler().fit(X) print scaler #StandardScaler(copy=True, with_mean=True, with_std=True) print scaler.mean_ #[ 1. 0. 0.33333333] print scaler.std_ #[ 0.81649658 0.81649658 1.24721913] print scaler.transform(X) #[[ 0. -1.22474487 1.33630621] # [ 1.22474487 0. -0.26726124] # [-1.22474487 1.22474487 -1.06904497]]
2.最小-最大規范化
將屬性縮放到一個指定的最小和最大值(通常是0-1)之間,這可以通過preprocessing.MinMaxScaler類實現。
使用這種方法的目的包括:
1、對於方差非常小的屬性可以增強其穩定性。
2、維持稀疏矩陣中為0的條目。
import numpy as np from sklearn.preprocessing import MinMaxScaler X_train = np.array([[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]) min_max_scaler = MinMaxScaler() print min_max_scaler #MinMaxScaler(copy=True, feature_range=(0, 1)) X_train_minmax = min_max_scaler.fit_transform(X_train) print X_train_minmax #[[ 0.5 0. 1. ] # [ 1. 0.5 0.33333333] # [ 0. 1. 0. ]] #將相同的縮放應用到測試集數據中 X_test = np.array([-3., -1., 4.]) X_test_minmax = min_max_scaler.transform(X_test) print X_test_minmax #[-1.5 0. 1.66666667] #縮放因子等屬性 print min_max_scaler.scale_ #[ 0.5 0.5 0.33333333] print min_max_scaler.min_ #[ 0. 0.5 0.33333333]
當然,在構造類對象的時候也可以直接指定最小最大值的范圍:feature_range=(min, max),此時應用的公式變為:
X_std=(X-X.min(axis=0))/(X.max(axis=0)-X.min(axis=0))
X_scaled=X_std/(max-min)+min
正則化Normalization:
正則化的過程是將每個樣本縮放到單位范數(每個樣本的范數為1),如果后面要使用如二次型(點積)或者其它核方法計算兩個樣本之間的相似性這個方法會很有用。
Normalization主要思想是對每個樣本計算其p-范數,然后對該樣本中每個元素除以該范數,這樣處理的結果是使得每個處理后樣本的p-范數(l1-norm,l2-norm)等於1。
該方法主要應用於文本分類和聚類中。例如,對於兩個TF-IDF向量的l2-norm進行點積,就可以得到這兩個向量的余弦相似性。
1、可以使用preprocessing.normalize()函數對指定數據進行轉換:
import numpy as np from sklearn.preprocessing import normalize X = [[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]] X_normalized = normalize(X, norm = 'l2')#L2 print X_normalized #[[ 0.40824829 -0.40824829 0.81649658] # [ 1. 0. 0. ] # [ 0. 0.70710678 -0.70710678]]
2、可以使用processing.Normalizer()類實現對訓練集和測試集的擬合和轉換:
import numpy as np from sklearn.preprocessing import Normalizer X = [[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]] normalizer = Normalizer().fit(X) print normalizer #Normalizer(copy=True, norm='l2') print normalizer.transform(X) #[[ 0.40824829 -0.40824829 0.81649658] # [ 1. 0. 0. ] # [ 0. 0.70710678 -0.70710678]] print normalizer.transform([-1., 1., 0.]) #[[-0.70710678 0.70710678 0. ]]
補充: