這屬於基礎知識,老師應該講的,可是;老師沒講.....在這個實驗室,一師姐老師只要不在考試購物唱歌,完全無視其他人存在,給各個單身小學弟賣錢包,手表.......真是夠了,精神污染....
一.最小最大歸一化
和區間映射(我理解的是把一個區間[a,b]映射到[c,d],c+(x-a)*(d-c)/(b-a),沒查,應該是這樣,主要要理解的問題是兩段距離映射的話要除以比例因子(d-c)/(b-a),自己理解的,這樣就可以把數據映射到[-1,1])不一樣,這是映射到[0,1],就是x' = (x-min)/(max-min),其中max和min分別是是x序列的最大、小值,並不是0和1。
這種方法的缺點是,如何加入新數據的話min和max可能變化。
二.Z-Score標准化方法
這種方法給予原始數據的均值(mean)和標准差(standard deviation)進行數據的標准化(x-u)/std。經過處理的數據符合標准正態分布,即均值為0,標准差為1。
三.L2標准化
由此,我們可以很塊的寫出最簡單的matlab源代碼如下:首先按行歸一化:
% Examples
A=[3 4;5 12];
[m n] = size(A);
% normalize each row to unit
for i = 1:m
A(i,:)=A(i,:)/norm(A(i,:));
end
按列歸一化。
% normalize each column to unit
A=[3 4;5 12];
for i = 1:n
A(:,i)=A(:,i)/norm(A(:,i));
end
然而,上述代碼最能實現功能,但並不是最優的,它只是一種對該過程的最佳理解代碼。在Matlab中,for循環是一件非常費時間的結構,因此我們在代碼中應該盡量少用for循環。由此,我們可以用repmat命令得到另一種更加簡潔更加快速的代碼,只是這種代碼對於初學者理解起來比較費勁。可以看做是自己水平的一種進階吧。
% normalize each row to unit
A = A./repmat(sqrt(sum(A.^2,2)),1,size(A,2));
% normalize each column to unit
A = A./repmat(sqrt(sum(A.^2,1)),size(A,1),1);
參考:http://blog.sciencenet.cn/blog-810210-655011.html
http://www.newsmth.net/nForum/#!article/NumComp/108647