在機器學習或是迴歸問題中,需要對數據進行歸一化或標準化,目的是讓數據能夠做「比較」,假設今天有兩筆數據,A的均值為300、B的均值為2,若要對這兩筆數據進行分析,理所當然,B大部分的特徵會被A所取代。
library(dplyr)
##
## Attaching package: 'dplyr'
## The following objects are masked from 'package:stats':
##
## filter, lag
## The following objects are masked from 'package:base':
##
## intersect, setdiff, setequal, union
x <- select(iris,1,2)
plot(x$Sepal.Length,x$Sepal.Width,xlim = c(0,10),ylim = c(0,5))
歸一化是為了使數據範圍介在[0,1之間],降低單位轉換或是區間對數據的影響
在Gradient descent中,有許多種歸一化的方法,沒有絕對好用的,但最終的目的都是為了加快收斂速度,並求最佳解。
簡單縮放Formula:(x - min(x))/(max(x)-min(x))
這種方法適合數值較集中的情況,若有新數據加入可能導致max或min變動,使得歸一化結果不穩定,後續效果跟著不穩定,max及min可使用經驗法則來設定。
maxmin <- function(x) (x - min(x))/(max(x)-min(x))
Normalize <- apply(x, 2, maxmin)
plot(Normalize,xlim = c(-1,2),ylim = c(-1,2))
標準化是為了讓均值為0,標準差為1,成為Z-socre,密度曲線趨近常態
Formula:(x - µ)/σ
R:scale(x, center = TRUE, scale = TRUE)
在R裡,sd函數預設使用樣本標準差(n-1)
y <- sweep(x, 2, apply(x, 2, mean)) %>%
sweep(2, apply(x,2,sd),FUN = "/")
plot(y, xlim = c(-150,150),ylim = c(-100,150))
par(mfrow = c(1,2))
plot(density(y$Sepal.Length))
plot(density(y$Sepal.Width))