标准化时,您必须记录每个特征的均值和标准差。然后您可以轻松地使用这些值进行非规范化。
e.g.
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);
EDIT:
拟合模型参数后(A
,O
and T
)使用归一化t
and f
那么您的模型将期望标准化输入并产生标准化输出。所以要使用它你应该首先正常化 t
进而非规范化 f
.
所以要寻找新的f
通过在标准化的新模型上运行模型t
. So f(tn)
where tn = (t - tm)/ts
and tm
是你的训练(或拟合)的平均值t
设置和ts
标准。然后,为了获得正确的大小 f,您必须仅对 f 进行反规范化,因此完整的解决方案是
f(tn)*fs + fm
因此,您需要做的就是保存用于标准化的均值和标准差。