使用 matlab 求解最小二乘问题

有约束线性最小二乘

其标准形式为:
min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin21Cxd22
约束条件为:
A ⋅ x ≤ b A e q ⋅ x = b e q l b ≤ x ≤ u b \begin{aligned} A \cdot x & \le b \\ A_{eq} \cdot x & = b_{eq} \\ lb \le & x \le ub \end{aligned} AxAeqxlbb=beqxub
matlab 使用 lsqlin 求解该类型问题,调用格式如下
x = lsqlin(C, d, A, B, Aeq, Beq, lb, ub, x0)
[x, resnorm, residual] = lsqlin(C, d, A, B, Aeq, Beq, lb, ub, x0)
没有的约束设置为 [] 就行,x0 是初始解向量,比如说你知道解大概是多少,设了可以避免陷入局部最优,减少优化时间等,没有可以不加或者设置为 []。resnorm就是 ∥ C x − d ∥ 2 2 \left\| Cx-d \right\|_2^2 Cxd22,residual就是 C x − d Cx-d Cxd.
假设已知有一个函数为:
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4
其中 a 1 = 1 , a 2 = 2 , a 3 = − 3 , a 4 = 4 a_1 = 1, a_2 = 2, a_3 = -3, a_4 = 4 a1=1,a2=2,a3=3,a4=4,另外在 y y y中添加了噪声 n o i s e noise noise,如何用有噪声的数据将参数求出来。
噪声数据如图
在这里插入图片描述
仿真如下:

% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 - 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

C = [x1',x2',x3',x4'];
d = yn';
theta = lsqlin(C,d);

因为题目是我瞎编的,没加什么约束,实际中有约束加上去就行了,比如说约束上下界 l b = − 10 , u b = 10 lb = -10, ub =10 lb=10,ub=10

lb = -10*ones(1,4);
ub = 10*ones(1,4);
theta = lsqlin(C,d,[],[],[],[],lb,ub);

这样设置就行了,最后求出来的系数为:
t h e t a = [ 1.0106 ; 2.0880 ; − 3.0468 ; 3.9113 ] theta = [1.0106; 2.0880; -3.0468; 3.9113] theta=[1.0106;2.0880;3.0468;3.9113]

非线性曲线拟合

跟上面很像,比如说知道输入输出函数关系,但是不知道系数向量,就可以进行曲线拟合。
min ⁡ x 1 2 ∥ F ( x , x d a t a ) − y d a t a ∥ 2 2 = 1 2 ∑ i ( F ( x , x d a t a i ) − y d a t a i ) 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| F(x, x_{data})-y_{data} \right\|_2^2 = \frac{1}{2}\sum\limits_i \left(F(x, x_{data_i})-y_{data_i} \right)^2 xmin21F(x,xdata)ydata22=21i(F(x,xdatai)ydatai)2
matlab 调用函数如下:
[x, resnorm] = lsqcurvefit(fun, x0, xdata, ydata,lb,ub)
以x0作为初始解,求取合适的系数,使得非线性函数fun满足最佳拟合。lb,ub是系数的边界约束条件,没有就不加。resnorm就是 ∥ F ( x , x d a t a ) − y d a t a ∥ 2 2 \left\| F(x, x_{data})-y_{data} \right\|_2^2 F(x,xdata)ydata22的值。
还是一样,比如说要拟合曲线
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4
先建立函数

function y = myfun(a,xdata)
y = a(1)*xdata + a(2)*sqrt(xdata) + a(3)*xdata.^0.8 + a(4);

拟合

% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 - 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

x0 = [1,1,1,1];
a = lsqcurvefit(@myfun,x0,x1,yn);

最后的解为
a = [ 0.9969 , 1.9763 , − 2.9865 , 4.0131 ] a = [0.9969, 1.9763, -2.9865, 4.0131] a=[0.9969,1.9763,2.9865,4.0131]

非负线性最小二乘

min ⁡ x 1 2 ∥ C x − d ∥ 2 2 \mathop {\min }\limits_x \quad \frac{1}{2}\left\| Cx-d \right\|_2^2 xmin21Cxd22
约束条件为:
x ≥ 0 x \ge 0 x0
matlab 调用函数如下:
x = lsqnonneg(C, d)
[x, resnorm, residual] = lsqnonneg(C, d)
其中resnorm就是 ∥ C x − d ∥ 2 2 \left\| Cx-d \right\|_2^2 Cxd22,residual就是 C x − d Cx-d Cxd.
比如说将上面的函数改为
y = a 1 × x + a 2 × x + a 3 × x 0.8 + a 4 y = a_1 \times x + a_2 \times \sqrt{x} + a_3 \times x^{0.8} + a_4 y=a1×x+a2×x +a3×x0.8+a4
其中 a 1 = 1 , a 2 = 2 , a 3 = 3 , a 4 = 4 a_1 = 1, a_2 = 2, a_3 = 3, a_4 = 4 a1=1,a2=2,a3=3,a4=4,使用有噪声的数据求参数。

% created by hyacinth on 2024/1/8
clc
clear
close all

%%
x1 = 1:100;
x2 = x1.^0.5;
x3 = x1.^0.8;
x4 = ones(size(x1));

y = x1 + 2*x2 + 3*x3 + 4*x4;
yn = y + 0.05*randn(size(x1));

C = [x1',x2',x3',x4'];
d = yn';
theta = lsqnonneg(C,d);

最后的结果为:
t h e t a = [ 0.9918 ; 1.9662 ; 3.0294 ; 3.9876 ] theta = [0.9918; 1.9662; 3.0294; 3.9876] theta=[0.9918;1.9662;3.0294;3.9876]

  • 23
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值