几天我们继续深度学习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为数据向量,
lb和ub分别表示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 值
今天就学到这里,我们明天继续学习。