最小二乘法
最小二乘法是数学建模中“预测类”题目中最常见的拟合算法之一。
最小二乘法的“几何解释”
求解“最小二乘法”
Matlab中的代码实现:
%最小二乘法
%确定数据矩阵
c=input('请依次输入数据矩阵的各个元素:');
[a,b]=size(c);
%计算拟合得到的“斜率”和“截距”
k=((a*sum(c(:,1).*c(:,2)))-(sum(c(:,2)).*sum(c(:,1))))/((a*sum(c(:,1).^2))-(sum(c(:,1)).^2));
b=(((sum(c(:,1).^2))*sum(c(:,2)))-(sum(c(:,1)*sum(c(:,1).*c(:,2)))))/((a*sum(c(:,1).^2))-(sum(c(:,1)).^2));
%隐式方程
y=@(x)k*x+b;
%拟合数据
nhc(:,1)=c(:,1);
nhc(:,2)=c(:,1).*k+b;
%y的平均值
avey=mean(c(:,2));
%计算“总体平方和” SST
SST=sum((c(:,2)-avey).^2);
%计算“误差平方和” SSE
SSE=sum((c(:,2)-nhc(:,2)).^2);
%计算“回归平方和” SSR
SSR=sum((nhc(:,2)-avey).^2);
%计算“拟合优度” R
R=SSR/SST;
%取“适当区间”
x_min=min(c(:,1))-1;
x_max=max(c(:,1))+1;
%画图
fplot(y,[x_min ,x_max]);
hold on;
plot(c(:,1),c(:,2),'o');
grid on;
xlabel(['拟合优度:',num2str(R)]);
实例应用
题目:
代码实现:
%拟合算法 作业
load data.mat;
[n,m]=size(data);
%计算“斜率”和“截距”
k=((n*sum(data(:,1).*data(:,2)))-sum(data(:,2)*sum(data(:,1))))/((n*sum(data(:,1).^2))-(sum(data(:,1))).^2);
b=((sum(data(:,1).^2)*sum(data(:,2)))-(sum(data(:,1))*sum(data(:,1).*data(:,2))))/((n*sum(data(:,1).^2))-(sum(data(:,1))).^2);
%隐式方程
y=@(x)k*x+b;
%拟合值
nhdata(:,1)=data(:,1);
nhdata(:,2)=data(:,1).*k+b;
%计算 总体平方和 SST
SST=sum((data(:,2)-mean(data(:,2))).^2);
%计算 误差平方和 SSE
SSE=sum((data(:,2)-nhdata(:,2)).^2);
%计算 回归平方和 SSR
SSR=sum((nhdata(:,2)-mean(data(:,2))).^2);
%拟合优度
R=SSR/SST;
%画图
fplot(y,[2,8]);
hold on;
xlabel(['拟合优度:',num2str(R)]);
plot(data(:,1),data(:,2),'o');
grid on;
原始数据图:
拟合后的数据:
Matlab中的“工具箱实现”
Step1. 打开“拟合工具箱”
Step2. 选择要拟合的数据
Step3.选择“拟合方式”