【问题标题】:Denormalize results of curve fit on normalized data对归一化数据进行曲线拟合的非归一化结果
【发布时间】:2013-11-17 17:25:12
【问题描述】:

我在 Matlab 中用lsqvurcefit 拟合指数衰减函数。为此,我首先normalize 我的数据,因为它们相差几个数量级。但是我不确定如何对我的拟合参数进行非规范化。

我的拟合模型是s = O + A * exp(-t/T),其中 t 和 s 是已知的,t 大约为 10^-3,s 大约为 10^5。所以我从它们中减去它们的平均值,然后除以它们的标准差。我的目标是找到在给定时间 t 最接近 s 的最佳 A、O 和 T。但是我不知道如何对生成的 A O 和 T 进行非规范化。

有人知道怎么做吗?我只在 SO 上找到了this 关于规范化的问题,但并没有真正解决同样的问题。

【问题讨论】:

  • 我认为您不想一开始就进行标准化。您链接到的那个问题表明您想要规范化您的AOt。然而,规范化你的 tf 就像规范化它们的 xvalue 没有多大意义
  • 也许我没有正确解释我的问题,我改变了我在问题中的表述。
  • 好的,请查看我对解决方案的编辑。您应该只对模型输出进行非规范化,但在运行模型之前规范化输入 (t)

标签: matlab normalization curve-fitting denormalization


【解决方案1】:

当您进行标准化时,您必须记录每个特征的均值和标准差。然后,您可以轻松地使用这些值进行非规范化。

例如

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);

编辑:

使用归一化 tf 拟合模型参数(AOT)后,您的模型将期望归一化输入并产生归一化输出。所以要使用它,你应该首先 normalize t 然后 denormalize f

因此,通过在标准化的新 t 上运行模型来找到新的 f。所以f(tn) 其中tn = (t - tm)/tstm 是你的训练(或拟合)的平均值t 设置和ts 标准。然后要获得正确的幅度 f,您必须仅对 f 进行非规范化,因此完整的解决方案是

 f(tn)*fs + fm

因此,您需要做的就是保存您用于标准化的均值和标准差。

【讨论】:

  • 嗯,是的,但是您将标准化的参数(在我的情况下为 t 和 f)非规范化,但我想对拟合的(新的和不同的 A O T)参数进行非规范化
  • @Leo 哦 - 如果您有许多数量级不同的输入,通常会标准化输入。如果您的输入和输出不同,那么我认为您不应该从一开始就进行规范化。所以如果你有 f(A, t) ,其中 A 是一个向量,t 是一个向量,那么你可以像我展示的那样对 A 和 t 进行归一化/非归一化。但是,如果 A 是一个常数,并且您正在尝试将 t 和 f 归一化……那是非常不寻常的,我认为您不应该这样做。我认为在你的情况下你不应该正常化,因为这不是它的目的。幅度差异是由于您的功能,所以它需要存在。
  • 我对函数的拟合输出了三个数字 A O 和 T (因此它们与 f 和 t 不匹配 1 到 1,它们是拟合的)。因为它们适合标准化数据,所以如果在给定时间 t 应用于我的函数,它们将不会产生 f。为了让他们这样做,他们需要首先被非规范化,这就是为什么它确实有意义。如果我不将 lsqcurvefit 归一化,它会慢慢曲折地进入梯度,而永远不会真正达到最小误差(因为梯度被数量级差异拉得如此之大)。
  • @Leo 好的,您可以正常化。我会编辑我的答案
猜你喜欢
  • 2017-04-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-22
  • 1970-01-01
  • 2023-03-19
  • 2018-01-27
  • 1970-01-01
相关资源
最近更新 更多