我有以下等式:
我想使用MATLAB对上述等式进行指数曲线拟合,其中y = f(u,a)
。 y
是我的输出,(u,a)
是我的输入。我想为一组提供的数据找到系数A,B
。
我知道如何通过定义状态来为简单多项式做这个。例如,如果states= (ones(size(u)), u u.^2)
,这将给我L+Mu+Nu^2
,其中L
,M
和N
是回归系数。
然而,上述等式不是这种情况。我怎么能在MATLAB中做到这一点?
答案 0 :(得分:3)
一种方法是使用log(y)相对于u²和a³:
的线性回归假设u
,a
和y
是相同长度的列向量:
AB = [u .^ 2, a .^ 3] \ log(y)
在此之后,AB(1)
是A的拟合值,AB(2)
是B的拟合值。计算使用Matlab的mldivide
operator;另一种方法是使用pseudo-inverse。
这样得到的拟合值是参数的最大似然估计,假设偏离精确方程是常数 - 方差正态分布误差加到Au²+ Ba³。如果实际的偏差来源与此不同,则这些估计可能不是最佳的。
答案 1 :(得分:3)
以@eigenchris所说的为基础,简单地采用等式两边的自然对数(MATLAB中的log
)。如果我们这样做,我们实际上将log
空间中的等式线性化。换句话说,给出你原来的等式:
我们得到:
然而,这不完全是多项式回归。这更像是least squares fitting分。具体来说,你要做的是给出一组y
和一对(u,a)
点,你将建立一个方程组并通过最小二乘法求解这个系统。换句话说,给定集合y = (y_0, y_1, y_2,...y_N)
和(u,a) = ((u_0, a_0), (u_1, a_1), ..., (u_N, a_N))
,其中N
是您拥有的点数,您将建立您的方程组,如下所示:
这可以用矩阵形式写出:
要解决A
和B
,您只需找到最小二乘解。您可以看到它的形式为:
Y = AX
要解决X
,我们会使用所谓的pseudoinverse。就这样:
X = A^{*} * Y
A^{*}
是伪逆。这可以使用\
或mldivide
运算符在MATLAB中雄辩地完成。您所要做的就是构建一个y
值的向量,并使用log
,并构建u
和a
值的矩阵。因此,如果您的分数(u,a)
分别存储在U
和A
以及y
中存储的Y
的值,那么您只需执行此操作:
x = [u.^2 a.^3] \ log(y);
x(1)
将包含A
的系数,而x(2)
将包含B
的系数。正如A. Donda在他的回答(我尴尬地忘记了)中所指出的那样,A
和B
的值是假设关于你想要适合的精确曲线的误差是通常(高斯)以恒定方差分布。这些错误也需要加以补充。如果不是这种情况,那么您获得的参数可能并不代表最佳匹配。
请参阅此维基百科页面,了解有关假设最小二乘拟合的更多详细信息:
http://en.wikipedia.org/wiki/Least_squares#Least_squares.2C_regression_analysis_and_statistics