标准化时,您必须记录每个特征的均值和标准差。然后,您可以轻松地使用这些值进行非规范化。
例如
A = [1 4 7 2 9]';
B = 100 475 989 177 399]';
所以你可以马上标准化:
An = (A - mean(A)) / std(A)
但是你不能回到原来的A。所以首先保存手段和标准。
Am = mean(A); Bm = mean(B);
As = std(A); Bs = std(B);
An = (A - Am)/As;
Bn = (B - Bm)/Bs;
现在做任何你想做的处理,然后去规范化:
Ad = An*As + Am;
Bd = Bn*Bs + Bm;
我敢肯定,如果您有很多功能(即您必须为每个功能输入代码,这是一项多么艰巨的任务!),您会看到这将是一个问题,因此假设您的数据排列为矩阵data
,,其中每个样本是一行,每一列是一个特征。现在你可以这样做:
data = [A, B]
means = mean(data);
stds = std(data);
datanorm = bsxfun(@rdivide, bsxfun(@minus, data, means), stds);
%// Do processing on datanorm
datadenorm = bsxfun(@plus, bsxfun(@times, datanorm, stds), means);
编辑:
使用归一化拟合模型参数(A
和O
)后, 您的模型将期望归一化输入并产生归一化输出。所以要使用它,你应该先normalize然后denormalize。T
t
f
t
f
f
因此,通过在规范化的 new 上运行模型来找到新的t
。那么你的训练(或拟合)集和标准的平均值f(tn)
在哪里?然后要获得正确的幅度 f,您必须仅对 f 进行非规范化,因此完整的解决方案是tn = (t - tm)/ts
tm
t
ts
f(tn)*fs + fm
所以再一次,你需要做的就是保存你用来标准化的平均值和标准。