目录
一、一元线性回归
二、多元线性回归
一、一元线性回归
今天是跟着川川学数模的第四天,也与前些天的规划问题不同,进入到了线性回归,那么我们先来看一下一元线性回归问题.
我们以某一数据列为例,代码如下
x=1:12;
y=[217.22 226.18 231.11 244.96 254.70 261.84 272.46 283.53 291.15 311.15 323.79 330.66];
然后跟着川川画一下散点图:
clc
clear all
x=1:12;
y=[217.22 226.18 231.11 244.96 254.70 261.84 272.46 283.53 291.15 311.15 323.79 330.66];
for i=1:12plot(x(i),y(i),'*r');hold on
end
xlabel('x');
ylabel('y');
乍一看,好家伙这不就是一个跟直线吗,初始值比较大而已,那么我们来试试线性拟合:
clc
clear all
x=[1 2 3 4 5 6 7 8 9 10 11 12];
y=[217.22 226.18 231.11 244.96 254.70 261.84 272.46 283.53 291.15 311.15 323.79 330.66];
z=zeros(size(x));
n=length(x)
for i=1:nz(i)=log(x(i));
end
p=polyfit(x,y,1);
运行一下就得到了p=10.5408和202.2139;因此上述数据得到了一元函数y=10.5048*x+202.2139。
二、多元线性回归
这个东西,我刚好在数维杯中使用过,它的原理很简单,就是调用Matlab的函数:
[b,bint,r,rint,stats]=regress(y,x,alpha)
那么具体我是怎么使用的呢?在数维杯题中,每个城市有着诸多不同的气象数据指标,显然他们之间的量纲或者说相关性是不一致的,所以我们进行了皮尔逊相关系数的计算并画出热力图,代码如下:
clc
clear all
A=xlsread('Summary table of data for years with high precipitation.xlsx');
%这附件是比赛的附件啦~
data=A(:,3:23);
R = corrcoef(data) % correlation coefficient
heatmap(R);
heatmap(R(:,5:end));
然后从诸多气象数据中挑选了三个与年平均降雨量最大的参数,进行多元线性回归,代码如下,先搞个主函数,这边choose是分别对应了不同的拟合情况,例如lsqcurvefit,regress,nlinfit等:
function [beta, r]=fit_nonlinear_data(X, Y, choose)
%lsqcurvefit optimal ternary one-shot fit
if choose==1X1=[ones(length(X(:, 1)), 1), X];[beta, bint, r, rint, states]=regress(Y, X1)rcoplot(r, rint)saveas(gcf,sprintf(' Non-linear curve fitting.jpg'),'bmp');
elseif choose==2beta0=ones(7, 1);[beta, r, J]=nlinfit(X, Y, @myfun, beta0)[Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J)plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');saveas(gcf,sprintf('Non-linear curve fitting _1.jpg'),'bmp');
elseif choose==3beta0=ones(7, 1);[beta,resnorm,r, ~, ~, ~, J]=lsqcurvefit(@myfun,beta0,X,Y)[Ypred,delta]=nlpredci(@myfun, X, beta, r, 'Jacobian', J)plot(X(:, 1), Y, 'k.', X(:, 1), Ypred, 'r');saveas(gcf,sprintf('Non-linear curve fitting _2.jpg'),'bmp');
end
end
function yy=myfun(beta,x)
yy=beta(1)+beta(2)*x(:, 1)+beta(3)*x(:, 2)+beta(4)*x(:, 3)+beta(5)*(x(:, 1).^2)+beta(6)*(x(:, 2).^2)+beta(7)*(x(:, 3).^2);
end
%此代码参考某网站(具体找不太到了)
这里咱就是搞一下regress:
clc
clear all
A=xlsread('Summary table of data for years with high precipitation.xlsx');
N1=A(:,17);
N2=A(:,19);
N3=A(:,22);
N4=A(:,23);
X=[N1,N2,N3];
choose=1;
fit_nonlinear_data(X, N4, choose)
运行结果就是这样的:
beta =-7.89480.11000.01070.1919bint =-41.0649 25.27530.0240 0.1961-0.0219 0.04340.0540 0.3298r =-0.06240.65961.60791.26151.14170.5050-1.1769-1.0386-1.2403-1.7227-0.6183-0.27591.14200.77711.00120.75550.33190.19250.54350.2527-0.29740.10440.13650.7201-0.28020.1063-0.29210.8550-0.3224-0.2533-0.6592-0.0228-0.9088-0.2762-0.0840-0.92020.81461.42671.62252.33891.41081.27521.10420.22751.09250.05920.79561.6953-1.7199-1.52450.1444-0.5348-1.1332-1.2295-1.0016-1.5690-1.2875-2.3272-1.8256-1.4973rint =-2.2047 2.0799-1.4901 2.8094-0.5066 3.7223-0.8789 3.4020-0.9987 3.2821-1.6358 2.6459-3.2769 0.9230-3.1725 1.0953-3.3825 0.9019-3.8099 0.3645-2.7602 1.5236-2.4164 1.8646-0.9279 3.2119-1.3078 2.8620-1.1336 3.1360-1.3745 2.8856-1.7319 2.3957-1.9423 2.3273-1.5884 2.6754-1.8836 2.3890-2.4648 1.8700-2.0327 2.2416-1.9371 2.2101-1.3292 2.7694-2.3837 1.8232-2.0028 2.2153-2.4166 1.8323-1.2920 3.0020-2.3848 1.7401-2.3714 1.8649-2.7524 1.4341-2.1774 2.1317-3.0447 1.2271-2.4386 1.8863-2.2211 2.0531-2.7714 0.9310-1.2912 2.9204-0.6161 3.4695-0.5106 3.75550.2637 4.4140-0.6760 3.4976-0.8379 3.3884-1.0092 3.2176-1.9192 2.3742-1.0546 3.2397-2.1018 2.2202-1.3244 2.9156-0.3114 3.7019-3.7830 0.3431-3.4976 0.4485-2.0219 2.3108-2.6988 1.6293-3.2464 0.9800-3.3544 0.8953-3.0979 1.0947-3.6855 0.5476-3.4033 0.8282-4.3857 -0.2687-3.9089 0.2576-3.5234 0.5287states =0.1890 4.3508 0.0080 1.1854ans =-7.89480.11000.01070.1919>>
即y=-7.8948+0.1100*x1+0.0107*x2+0.1919*x3,当时做完以后觉得很简单,置信区间大概在96%,但一个不巧,忘了归一化处理,此处不做论述,后来通过0-1归一化效果就好多了,这边多元回归出来的就是闹着玩。
以上便是关于一元线性和多元线性的回归问题,当然多元线性回归也不至于此,也需要考虑到拟合的效果,后面继续跟着川川学啦~