Andrew在他的機器學習課程里強調,在進行學習之前要進行特征縮放,目的是保證這些特征都具有相近的尺度,這將幫助梯度下降算法更快地收斂。
python里常用的是preprocessing.StandardScaler()
公式為:(X-mean)/std 計算時對每個屬性/每列分別進行。
將數據按期屬性(按列進行)減去其均值,並處以其方差。得到的結果是,對於每個屬性/每列來說所有數據都聚集在0附近,方差為1。
但是我在用k-means進行分類的時候發現,歸一化之后分類的准確性反而下降了,應該是跟我的數據特征有關系。我的數據是三維坐標,我的要求是z軸不一樣的數據一定不能放在一類里,所以我人為將z軸數據加劇區分度,比如原來是(10,20,0),(13,16,0),(23,16,10)。為了確保將z軸不同的數據區分開來,我將第三個數據改為了(23,16,100),這樣z維的數據區別遠大於其他兩維,在聚類是就不會被淹沒。但是當進行歸一化之后,所有的數據都變得很小,我想要的區分度就不能體現了,就達不到我需要的聚類效果。
所以我覺得,是不是需要做歸一化,以及如何做歸一化還是需要根據情況而定。