MATLAB进阶:数据的拟合

avatar
作者
猴君
阅读量:0

几天我们继续深度学习MATLAB中的数据拟合

最小二乘拟合

假设已知经验公式y=f(c,x)y=f(c,x)(c为参数,x为自变量),要求根据一批有误差的数据(xi,yi),i=0,1,...,n(xi​,yi​),i=0,1,...,n确定参数c。这样的问题称为数据拟合。

最小二乘法:求c使得平方误差最小化

最小二乘法的内容我们这里不再过多讲解,这里主要侧重讲解如何用MATLAB来解决相关问题。

线性拟合

p=polyfit(x,y,k)

k次多项式拟合向量数据(x, y),返回多项式的降幂系数

p返回的向量,包含拟合多项式的系数。这些系数按降幂排列,即 p(1) 是最高次项的系数,p(end) 是常数项。

举例

x = [1, 2, 3, 4, 5];  % 自变量数据 y = [2, 4, 6, 8, 10]; % 因变量数据 k = 2;                % 拟合二次多项式  p = polyfit(x, y, k); % 拟合多项式并获取系数 

非线性拟合

[c,Q]=lsqcurvefit(Fun,c0,x,y,lb,ub)

其中Fun(c,x)为两个输入变量的函数句柄或匿名函数,

c0为参数c的预估值,作为迭代初值,

x,y为数据向量,

lbub分别表示c的下界和上界,

c返回参数值

Q返回误差平方和,

自变量x可以是多变量,这时第三输入参数x应为矩阵

举例

% 模型函数 fun = @(c, x) c(1) * exp(c(2) * x);  % 初始参数估计 c0 = [1; 1];  % 独立变量数据 x = [1; 2; 3; 4; 5];  % 依赖于x的观测数据 y = [2.3; 2.9; 4.1; 5.9; 8.2];  % 参数的上下界 lb = [0; -Inf]; % c(1) 不能小于0, c(2) 没有下界 ub = [Inf; Inf]; % c(1) 和 c(2) 没有上界  % 调用lsqcurvefit c = lsqcurvefit(fun, c0, x, y, lb, ub);  % 输出结果 disp('拟合参数:'); disp(['c(1) = ', num2str(c(1))]); disp(['c(2) = ', num2str(c(2))]); 

线性拟合与非线性拟合的转换

虽然非线性拟合范围较广,但是却存在难以确定初始值的问题,在我们无法确定初始值时,一般用“0”来替代。而想方设法将其转化为线性函数,亦可以省去猜测初始值的步骤,并且大大减少计算所需时间

举例

这是一个非线性函数,但是如果我们左右两边同时取对数,就可以得到

这时,如果将ln(y)视为常数项z,那么我们就可以用线性拟合解决这个问题

% 假设 x 和 y 是你的数据点 x = [...]; % 你的 x 数据 y = [...]; % 你的 y 数据  % 对 y 取自然对数 y_transformed = log(y);  % 使用 polyfit 拟合一次多项式(线性关系) p = polyfit(x, y_transformed, 1);  % p(1) 将是斜率 b,p(2) 将是截距 ln(a) b = p(1); ln_a = p(2); a = exp(ln_a); % 计算原始的 a 值 

今天就学到这里,我们明天继续学习。

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!