天天看點

歸一化的matlab實作

最近在做神經網絡,需要對訓練資料進行歸一化到[0.1 0.9]之間。雖然matlab有現成的歸一化函數(mapminmax() premnmx),但歸一化到特定的區間,上述函數并不友善使用。由此萌生了自己編寫歸一化函數的想法。

本質上,常用的歸一化就是線性變換。本文中以轉化到[0.1 0.9]為例

歸一化的matlab實作

y與x之間的關系為 y=ax+b ,具體一下就是

y=0.9−0.1xmax−xminx+0.1xmax−0.9xminxmax−xmin

x=xmax−xmin0.9−0.1y+0.9xmin−0.1xmax0.9−0.1

對于單個值和向量來說,隻要按照上面的公式轉化就行,很簡單。

但很多時候,我們需要歸一化的是多元向量,比如訓練資料的輸入特征集 X=[X1,X2,...,XM]T ,其中 Xi 是行向量。最大值向量 max=[m1,m2,...] ,最小值向量為 min=[n1,n2,...]

以2維向量為例,我們進行推導,得到:

[Y1Y2]=[a100a2]X+[b100b2]ones(size(X))

寫到這裡,對于程式實作來說,并沒什麼卵用。接下來對兩個系數矩陣進一步推導,這裡的 a1,a2 和 b1,b2 對應每維向量的 a 和b

[a100a2]=(0.9−0.1)[m1−n100m2−n2]−1

[b100b2]=[0.1m1−0.9n1000.1m2−0.9n2][m1−n100m2−n2]−1

對于matlab來說,上面的對角陣非常容易實作

一堆惡心的公式到此結束,接下來上幹貨兒。以matlab為例,

function [ y, xmax, xmin ] = Normalize( x, xmax , xmin )
%NORMALIZE 利用max-min方法将資料歸一化到[0.1,0.9]
% input: x---每行對應一個特征,每列為一個樣本,
% output: nx---歸一化資料,max---特征最大值,min---特征最小值
% created by Nie Zhipeng 2016.06.24
nxmin = ;
nxmax = ;
if nargin < 
    P = minmax(x);
    xmin = P(:,);
    xmax = P(:,);
end
K = (nxmax - nxmin) * inv(diag(xmax - xmin));
b = diag(nxmin * xmax - nxmax * xmin) / diag(xmax - xmin);
y = K * x + b * ones(size(x));
end
           
function [ x ] = RNormalize( y, xmax, xmin )
%RNORMALIZE 恢複max-min方法歸一化的資料
%input: nx---歸一化的資料, 每行對應一個特征,每列對應一個樣本
%       max---特征最大值
%       min---特征最小值
%Created by Nie Zhipeng 2016.06.24
nxmin = ;
nxmax = ;
K = /(nxmax-nxmin) * diag(xmax - xmin);
b = /(nxmax-nxmin) * diag(nxmax * xmin - nxmin * xmax);
x = K * y + b * ones(size(y)); 
end