前言
在機器學習的算法訓練數據前,一般要進行數據歸一化,統一量綱。

以上圖為例,樣本間的距離被發現時間所主導,腫瘤大小就被忽略了。

將天換算成年之后,樣本間的距離又被腫瘤大小所主導,發現時間被忽略了。
解決方法就是將所有數據映射到同一尺度。
最值歸一化
將數據映射到0-1之間,適用於數據有明顯邊界的情況,如學生成績,圖片像素點等。

代碼實現
import numpy as np
x = np.random.randint(0, 10, 10)
print(x)
print((x - np.min(x)) / (np.max(x) - np.min(x)))
輸出結果為
[6 5 7 6 3 3 8 5 1 0]
[0.75 0.625 0.875 0.75 0.375 0.375 1. 0.625 0.125 0. ]
都在0-1之間
0均值歸一化
將數據映射到均值為0,標准差為1的分布中
mean表示數據的均值,S表示標准差
代碼實現
import numpy as np
x = np.random.randint(0, 10, 10)
print(x)
x2 = (x - np.mean(x)) / np.std(x)
print(x2)
print(np.mean(x2))
print(np.std(x2))
輸出結果為
[4 1 9 3 7 3 0 1 2 0]
[ 0.35355339 -0.70710678 2.12132034 0. 1.41421356 0.
-1.06066017 -0.70710678 -0.35355339 -1.06066017]
0.0
0.9999999999999999
均值為0,標准差為1
sklearn中的數據歸一化
sklearn是機器學習常用的第三方模塊,封裝了常用的機器學習算法。
import numpy as np
from sklearn.preprocessing import StandardScaler
x = np.random.randint(0, 10, 10)
x = np.array(x, dtype=float).reshape(2, 5)
print(x)
scaler = StandardScaler()
scaler.fit(x)
x = scaler.transform(x)
print(np.mean(x))
print(np.std(x))
StandardScaler就是sklearn提供的進行數據歸一化的工具,內部也是使用0均值歸一化的方法。
