一元线性回归
适用于零售总额与职工工资总额关系
采用最小二乘法回归
百度百科:
设拟合直线的公式为,
其中:拟合直线的斜率为:
计算出斜率后,根据和已经确定的斜率k,利用待定系数法求出截距b。
对上述数据进行回归
源代码
%% 最小二乘法回归
%% 输入数据
clc,clear all ,close all
x = [23.80 27.60 32.40 33.70 34.90 43.20 52.80 63.80 73.40];
y = [41.4 51.8 61.7 67.9 77.5 95.6 137.4 155.0 175.0];
%% 做散点图
plot(x,y,'k*');
xlabel('x(职工工资总额)','fontsize',15);%横坐标名称
ylabel('y(商品零售总额)','fontsize',15);%纵坐标名称
set(gca,'linewidth',2); %将坐标轴加粗
%% 用最小二乘法拟合
Lxx = sum((x - mean(x)).^2); %mean函数用来求x的均值
Lxy = sum((x - mean(x)).*(y - mean(y)));
b1 = Lxy/Lxx;
b0 = mean(y)-b1*mean(x);
y1 = b1*x+b0;
hold on
plot(x,y1,'r-','linewidth',2);
Y = y';
X = [ones(size(x,2),1),x'];
[b] = regress(Y,X) %采用regress函数进行回归
输出结果
一元非线性回归
在实际生活当中,变量的关系并不是都是线性的,此时就应该用非线性回归。
非线性回归可以采取对数形式非线性回归,也可以采用指数非线性回归。
对数形式非线性回归
clc, clear all, close all
x = [1.5 4.5 7.5 10.5 13.5 16.5 19.5 22.5 25.5];
y = [7.0 4.8 3.6 3.1 2.7 2.5 2.4 2.3 2.2];
plot(x,y,'*','linewidth', 2);
set(gca, 'linewidth',2);
xlabel('销售额x/万元','fontsize',2);%横坐标名称
ylabel('流通费率y/%','fontsize',2);%纵坐标名称
%% 对数形式非线性回归
m1 = @(b,x)b(1)+b(2)*log(x);
nonlinfit1 = fitnlm(x,y,m1,[0.01;0.01])
b = nonlinfit1.Coefficients.Estimate;
Y1 = b(1,1)+b(2,1)*log(x);
hold on
plot(x,Y1,'--k','linewidth',2)
输出结果
指数形式非线性回归
clc, clear all, close all
x = [1.5 4.5 7.5 10.5 13.5 16.5 19.5 22.5 25.5];
y = [7.0 4.8 3.6 3.1 2.7 2.5 2.4 2.3 2.2];
plot(x,y,'*','linewidth', 2);
set(gca, 'linewidth',2);
xlabel('销售额x/万元','fontsize',2);%横坐标名称
ylabel('流通费率y/%','fontsize',2);%纵坐标名称
%% 指数形式非线性回归
m2 = 'y ~b1 * x^b2';
nonlinfit2 = fitnlm(x,y,m2,[1;1]);
b1 = nonlinfit2.Coefficients.Estimate(1,1);
b2= nonlinfit2.Coefficients.Estimate(2,1);
Y2 = b1*x.^b2;
hold on
plot(x,Y2,'r','linewidth',2)
legend('原始数据','a+b*lnx','a*x^b')
输出结果
很明显,指数的模拟更好。。