上面的步骤就是对多元线性回归方程的系数求解的实验原理,接下来,就让我们通过python代码进行推导过程的模拟吧!
可以看到,上面数据的内容是一样的,只不过保存的数据格式不一样,这是因为我编写代码导入的数据的包用的不一样的,所以自己对同一个数据建立了两个不同的表格,虽然繁琐,但是有用哦!index项不用管,可以不要,只要用来表示序号的!
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns
%matplotlib inline
pip install seaborn
data = np.genfromtxt("D:/面积距离车站数据.csv",delimiter=",")
X1=data[0:10,0]#自变量温度
X2=data[0:10,1]#因变量销售量
Y=data[0:10,2]#自变量温度
1)、原理如下:
2)、因变量(月销售额)Y进行矩阵化的代码:
#将因变量赋值给矩阵Y1
Y1=np.array([Y]).T
3)、自变量X1(店铺面积0)、X2(距离车站的距离)、进行矩阵化变为原理的X矩阵的代码:
#为自变量系数矩阵X赋值
X11=np.array([X1]).T
X22=np.array([X2]).T
A=np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])#创建系数矩阵
B=np.hstack((A,X11))#将矩阵a与矩阵X11合并为矩阵b
X=np.hstack((B,X22))#将矩阵b与矩阵X22合并为矩阵X
4)、求X矩阵的转置矩阵==X_==矩阵
#求矩阵X的转置矩阵
X_=X.T
5)、求矩阵X与他的==转置矩阵的X_==的乘积
X_X=np.dot(X_,X)
6)、求矩阵X与他的转置矩阵的X_的乘积的逆矩阵
及求下面红色圈中的部分:
X_X_=np.linalg.inv(X_X)
#求解系数矩阵W,分别对应截距b、a1、和a2
W=np.dot(np.dot((X_X_),(X_)),Y1)
8)、将系数矩阵W转换为系数a1、a2和截距b,并输入线性回归方程
b=W[0][0]
a1=W[1][0]
a2=W[2][0]
print("系数a1=",a1)
print("系数a2=",a2)
print("截距为=",b)
print("多元线性回归方程为:y=",a1,"X1+",a2,"X2+",b)
data1=pd.read_excel('D:\面积距离车站数据.xlsx')
sns.pairplot(data1, x_vars=['area','distance'], y_vars='Y', height=3, aspect=0.8, kind='reg')
plt.show()
判定系数R2如何求?就只有通过他的表达式来进行求解啦,R2的表达式如下所示:
及R2=R*R,也就是说,我们需要求解Syy、Syy1、以及Sy1y1,分别代表什么含义上面的公式已经给出了哦,下面、就让我们一起来进行求解吧!
1)、求解月销售额的总值,以及平均值y1
#求月销售量Y的和以及平均值y1
sumy=0#因变量的和
y1=0#因变量的平均值
for i in range(0,len(Y)):
sumy=sumy+Y[i]
y1=sumy/len(Y)
2)、求解月销售额y减去它平均值的和y_y1
#求月销售额y-他的平均值的和
y_y1=0#y-y1的值的和
for i in range(0,len(Y)):
y_y1=y_y1+(Y[i]-y1)
print("销售量-销售量平均值的和为:",y_y1)
运行结果如下:
3)、通过上面系数和截距,求出预测的月销售额sales1
#求预测值sales1
sales1=[]
for i in range(0,len(Y)):
sales1.append(a1*X1[i]+a2*X2[i]+b)
4)、求预测月销售额的平均值y2
#求预测值的平均值y2
y2=0
sumy2=0
for i in range(len(sales1)):
sumy2=sumy2+sales1[i]
y2=sumy2/len(sales1)
5)、求预测月销售额减去其平均值的和y11_y2
#求预测值-平均值的和y11_y2
y11_y2=0
for i in range(0,len(sales1)):
y11_y2=y11_y2+(sales1[i]-y2)
print("预测销售值-预测销售平均值的和为:",y11_y2)
运行结果如下:
6)、求月销售额y减去他的平均值的平方和Syy
#求月销售额y-他的平均值的平方和
Syy=0#y-y1的值的平方和
for i in range(0,len(Y)):
Syy=Syy+((Y[i]-y1)*(Y[i]-y1))
print("Syy=",Syy)
运行结果如下:
7)、求预测月销售额减去其平均的平方和Sy1y1
#求y1-y1平均的平方和
Sy1y1=0
for i in range(0,len(sales1)):
Sy1y1=Sy1y1+((sales1[i]-y2)*(sales1[i]-y2))
print("Sy1y1=",Sy1y1)
运行结果如下:
8)、求(y1-y1平均)*(y-y平均)的和Syy1
#(y1-y1平均)*(y-y平均)
Syy1=0
for i in range(0,len(sales1)):
Syy1=Syy1+((Y[i]-y1)*(sales1[i]-y2))
print("Syy1=",Syy1)
运行结果如下:
2)、求解的python代码如下:
#求R
R=Syy1/((Syy*Sy1y1)**0.5)
R2=R*R
print("判定系数R2=",R2)
运行结果如下:
以上就是我们判定系数R2的求解的全部过程啦,原理很简单,就是根据公式一步、一步的往下进行!
#利用线性代数的矩阵求解法求解多元线性回归方程的系数
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
%matplotlib inline
data = np.genfromtxt("D:/面积距离车站数据.csv",delimiter=",")
X1=data[0:10,0]#自变量温度
X2=data[0:10,1]#因变量销售量
Y=data[0:10,2]#自变量温度
#将因变量赋值给矩阵Y1
Y1=np.array([Y]).T
#为自变量系数矩阵X赋值
X11=np.array([X1]).T
X22=np.array([X2]).T
A=np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]])#创建系数矩阵
B=np.hstack((A,X11))#将矩阵a与矩阵X11合并为矩阵b
X=np.hstack((B,X22))#将矩阵b与矩阵X22合并为矩阵X
#求矩阵X的转置矩阵
X_=X.T
#求矩阵X与他的转置矩阵的X_的乘积
X_X=np.dot(X_,X)
#求矩阵X与他的转置矩阵的X_的乘积的逆矩阵
X_X_=np.linalg.inv(X_X)
#求解系数矩阵W,分别对应截距b、a1、和a2
W=np.dot(np.dot((X_X_),(X_)),Y1)
b=W[0][0]
a1=W[1][0]
a2=W[2][0]
print("系数a1=",a1)
print("系数a2=",a2)
print("截距为=",b)
print("多元线性回归方程为:y=",a1,"X1+",a2,"X2+",b)
#画出线性回归分析图
data1=pd.read_excel('D:\面积距离车站数据.xlsx')
sns.pairplot(data1, x_vars=['area','distance'], y_vars='Y', height=3, aspect=0.8, kind='reg')
plt.show()
#求月销售量Y的和以及平均值y1
sumy=0#因变量的和
y1=0#因变量的平均值
for i in range(0,len(Y)):
sumy=sumy+Y[i]
y1=sumy/len(Y)
#求月销售额y-他的平均值的和
y_y1=0#y-y1的值的和
for i in range(0,len(Y)):
y_y1=y_y1+(Y[i]-y1)
print("销售量-销售量平均值的和为:",y_y1)
#求预测值sales1
sales1=[]
for i in range(0,len(Y)):
sales1.append(a1*X1[i]+a2*X2[i]+b)
#求预测值的平均值y2
y2=0
sumy2=0
for i in range(len(sales1)):
sumy2=sumy2+sales1[i]
y2=sumy2/len(sales1)
#求预测值-平均值的和y11_y2
y11_y2=0
for i in range(0,len(sales1)):
y11_y2=y11_y2+(sales1[i]-y2)
print("预测销售值-预测销售平均值的和为:",y11_y2)
#求月销售额y-他的平均值的平方和
Syy=0#y-y1的值的平方和
for i in range(0,len(Y)):
Syy=Syy+((Y[i]-y1)*(Y[i]-y1))
print("Syy=",Syy)
#求y1-y1平均的平方和
Sy1y1=0
for i in range(0,len(sales1)):
Sy1y1=Sy1y1+((sales1[i]-y2)*(sales1[i]-y2))
print("Sy1y1=",Sy1y1)
#(y1-y1平均)*(y-y平均)
Syy1=0
for i in range(0,len(sales1)):
Syy1=Syy1+((Y[i]-y1)*(sales1[i]-y2))
print("Syy1=",Syy1)
#求R
R=Syy1/((Syy*Sy1y1)**0.5)
R2=R*R
print("判定系数R2=",R2)
注意:上面为整体的运行结果,不过,这里林君学长建议通过分步执行、然后分步运行,以确定代码的结果是否出现错乱,不建议最后写完整体运行,不然出现错误不知道在哪里去寻找,一步一步走,一步一步看!
由上图可知,我们求解的结果与Excel求解的结果大致一样,因为Excel求解后的系数,林君学长让他保留了两位有效数字,而python进行求解的结果,自己没有保留有效数字,这里可以很肯定的说,我们python求解的结果更加的精确哦!
以上就是我们本次博客的全部内容,希望通过本次博客,大家可以更好的理解多元线性回归方程的求解原理,通过一步一步求解,可以让我们知道,那些求多元解线性方程的包是如何编写的,原理就是和这个一样的哦!
遇到问题的小伙伴记得在评论区留言,学长给你们耐心解答!
陈一月的又一天编程岁月^ _ ^