為什么要做歸一化或者標准化?
主要是為了調整樣本數據每個維度的量綱,讓每個維度數據量綱相同或接近。 為什么要調整量綱?目的是什么?
1 量綱不一樣的情況是什么?
比如一個2分類任務,預測一批零件是合格品還是殘次品。
這個零件把他假象成是細長細長的棍子,有兩個維度特征, 半徑都是 1 cm左右, 長度都是1000cm左右
合格的零件半徑都在1cm左右差距不大, 長度都在1000cm左右差距不大, 差距稍微大了點 可能就不合格了。 至於差距多少算不合格, 要建立模型自己去學一下。
一個特征1cm左右 一個特征1000cm左右, 這個就叫量綱不一樣。
1cm左右的特征,上差下差 也都是0.幾cm的差距, 1000cm的特征上差下差可能差出10cm多 或者更多, 這就是量綱不一樣!
2 量綱不一樣會造成什么樣的后果?
會誤導誤導我們的模型學習過程!!
比如這個零件合不合格的問題, 用k近鄰算法,或者svm算法,或者什么其他算法,
當算 點到點距離 或者 點到超面距離 的時候,
半徑帶來的差的平方 可能是(0.75 - 1)^2 = 0.25^2 基本連1都不到
長度帶來的差的平方 可能是 (1020-1000)^2 = 400, 它很大, 甚至可能都超過1000這個數量級
再把 半徑的殘差和長度的殘差加和 400.00xx
結果 半徑的殘差 可以忽略不計了!!
模型認為 長度差距帶來的影響巨大!
get不到半徑細小的差距 也是導致合不合格的原因! 可能學不明白到底因為啥合格因為啥不合格!
3 怎么解決這個問題??
把每個維度特征的量綱調整到一樣或者相近!
目前,最常用的兩個方法是:
歸一化
標准化
4 歸一化 和 標准化 是咋回事?干了什么? 怎么做到縮放的量綱?
在這里我只說說最簡單常用的標准化和歸一化, 變形的形式我就不說了,
因為我了解的也不深入!簡單的我都整不明白呢! 整復雜的再整錯了挨揍啥的不好。
對於一個樣本X 是n行*d列 的矩陣, 有n條樣本數據,每個數據占一行, 每條數據有d個的特征
比如剛才內個零件的 X 就是n行*2列的矩陣, 有n個零件的數據 每個零件有2個特征 分別是半徑和長度
用Xi 表示所有n個樣本的第i列特征,
歸一化和標准化他倆分別干啥了呢? 不要急 且聽我繼續胡說八道。
歸一化:
對樣本X的每個列Xi,
Xi = (Xi - min(Xi)) / ( max(Xi) - min(Xi) )
把Xi這列的每個數都減去 這列的最小值 再 除以 這列最大值和最小值的差
結果: 所有列的數據,都縮放到 0到1之間,且最大值是1,最小值是0
這個變換 保留了 這列中每個數 到最小值的差距的比例,
量綱大的給縮小了,量綱小的給擴大了 全都在0到1之間, 量綱嚴格相等
標准化:
對樣本X的每個列 Xi
Xi = (Xi - mean(Xi)) / 方差(Xi)
把這列的每個數都 減去 這列的均值 再 除以這列的方差
結果: 所有列的數據 均值為0 方差為1
這個變換,保留了每列原本的分布, 保留了每個數 距離均值的差距比例
所有數在 均值 為中心周圍分布, 並且方差為1
對於不同列 最大值與最小值之間的差距 不一定是多少,
量綱大的列被縮小 量綱小的列被放大, 量綱不嚴格相等,只是比原來更接近 而且很接近了。
5 歸一化和標准化 怎樣選擇用哪個預處理數據? 有什么區別??
1 現實中,用歸一化更多, 因為需要嚴格要求數據在0到1之間且量綱相等。
比如現在在深度學習中 cnn中的分類任務,都使用梯度下降BP反向傳播算法更新參數,
在梯度下降中是為了逼近最優解,如果不同維度特征的量綱差距大,在超空間中,會形成超橢球的形狀
梯度下降過程會反復震盪,如下:
當量綱完全一致,樣本分布在空間是超正圓,梯度下降才最高效,如圖:
2 但是不盡然! 有的時候真的需要使用標准化, 歸一化效果不好。
比如 就預測零件是否合格的問題,
往往合格的零件,長度和半徑 都在樣本均值附近 才最好 才是合格的。
長度過短或者過長都不合格, 半徑太大太小也都不合格。
我們需要保留樣本距離均值的差距比例,
如果使用歸一化,
我們只考慮樣本到最小值的距離比例,最小值估計應該是個殘次品,
我們丟失了最想要的 均值 周圍的分布情況。
均值左側的被縮放程度小, 均值右側被縮放程度大!
3 總結一下:
有的人說,一般只用 標准化! 這個保留了樣本原來的分布!!
有的人說, 一般只用 歸一化! 這個梯度下降收斂效果好!!
我個人的理解,
如果樣本噪聲不大,污染不嚴重, 采用歸一化比較好, 量綱縮放到嚴格相同, 計算距離的時候帶來的影響是等價的。
如果 均值的信息是有意義的, 建議不實用歸一化,實用標准化。 量綱不同但很接近, 不要丟失核心關鍵!!
以上內容純屬個人理解! 歡迎批評指正!
謝謝閱讀。