我在 Matlab 中使用lsqvurcefit
拟合指数衰减函数。要做到这一点,我首先normalize我的数据,因为它们有几个数量级。但是我不确定如何对我的拟合参数进行反规范化。
我的拟合模型是s = O + A * exp(-t/T)
,其中t和s是已知的,t是10 ^ -3的数量级,s是10 ^ 5的数量级。所以我从它们中减去它们的平均值并将它们除以它们的标准偏差。我的目标是找到最佳的A,O和T,在给定的时间t将导致最接近s。但是我不知道如何对我产生的A O和T进行非规范化。
有人可能知道怎么做吗?我只是在SO上发现this关于规范化的问题,但并没有真正解决同样的问题。
答案 0 :(得分:2)
规范化时,必须记录每个特征的均值和标准差。然后,您可以轻松地使用这些值进行非规范化。
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);
修改强>
使用标准化A
和O
拟合模型参数(T
,t
和f
)之后,您的模型将支持标准化输入和产生标准化输出。因此,要使用它,您应首先规范化 t
,然后 denormalize f
。
通过在规范化的新f
上运行模型来查找新的t
。因此f(tn)
tn = (t - tm)/ts
和tm
是您的训练(或拟合)t
设置和ts
标准的平均值。然后为了获得正确的幅度f,你必须仅对f进行非规范化,因此完整的解决方案将是
f(tn)*fs + fm
因此,您需要做的就是保存您用于标准化的平均值和标准值。