1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > Python-多元线性回归方程比较最小二乘法与梯度下降法

Python-多元线性回归方程比较最小二乘法与梯度下降法

时间:2018-06-14 18:56:29

相关推荐

Python-多元线性回归方程比较最小二乘法与梯度下降法

最小二乘法是先将方程自变量与因变量化为系数矩阵X,再求该矩阵的转置矩阵(X1),接着求矩阵X与他的转置矩阵的X1的乘积(X2),然后求X2的逆矩阵。最后整合为系数矩阵W,求解后分别对应截距b、a1、和a2。可见计算一个矩阵的逆是相当耗费时间且复杂的,而且求逆也会存在数值不稳定的情况。

梯度下降法迭代的次数可能会比较多,但是相对来说计算量并不是很大。且其有收敛性保证。故在大数据量的时候,使用梯度下降法比较好。

梯度下降法

import numpy as npfrom matplotlib import pyplot as pltfrom mpl_toolkits.mplot3d import Axes3Ddata = np.genfromtxt('test.csv',delimiter=',')x_data = data[:,:-1]y_data = data[:,2]#定义学习率、斜率、截据#设方程为y=a1x1+a2x2+a0lr = 0.00001a0 = 0a1 = 0a2 = 0#定义最大迭代次数,因为梯度下降法是在不断迭代更新k与bepochs = 10000#定义最小二乘法函数-损失函数(代价函数)def compute_error(a0,a1,a2,x_data,y_data):totalerror = 0for i in range(0,len(x_data)):#定义一共有多少样本点totalerror = totalerror+(y_data[i]-(a1*x_data[i,0]+a2*x_data[i,1]+a0))**2return totalerror/float(len(x_data))/2#梯度下降算法求解参数def gradient_descent_runner(x_data,y_data,a0,a1,a2,lr,epochs):m = len(x_data)for i in range(epochs):a0_grad = 0a1_grad = 0a2_grad = 0for j in range(0,m):a0_grad -= (1/m)*(-(a1*x_data[j,0]+a2*x_data[j,1]+a2)+y_data[j])a1_grad -= (1/m)*x_data[j,0]*(-(a1*x_data[j,0]+a2*x_data[j,1]+a0)+y_data[j])a2_grad -= (1/m)*x_data[j,1]*(-(a1*x_data[j,0]+a2*x_data[j,1]+a0)+y_data[j])a0 = a0-lr * a0_grada1 = a1-lr * a1_grada2 = a2-lr * a2_gradreturn a0,a1,a2#进行迭代求解a0,a1,a2 = gradient_descent_runner(x_data,y_data,a0,a1,a2,lr,epochs)print('结果:迭代次数:{0} 学习率:{1}之后 a0={2},a1={3},a2={4},代价函数为{5}'.format(epochs,lr,a0,a1,a2,compute_error(a0,a1,a2,x_data,y_data)))print("多元线性回归方程为:y=",a1,"X1",a2,"X2+",a0)#画图ax = plt.figure().add_subplot(111,projection='3d')ax.scatter(x_data[:,0],x_data[:,1],y_data,c='r',marker='o')x0 = x_data[:,0]x1 = x_data[:,1]#生成网格矩阵x0,x1 = np.meshgrid(x0,x1)z = a0+a1*x0+a2*x1#画3d图ax.plot_surface(x0,x1,z)ax.set_xlabel('area')ax.set_ylabel('distance')ax.set_zlabel("Monthly turnover")plt.show()

结果如下:

最小二乘法

import numpy as npimport matplotlib.pyplot as pltimport pandas as pdimport seaborn as sns%matplotlib inlinedata = np.genfromtxt("test.csv",delimiter=",") #导入.csv文件数据X1 = data[0:10,0] #自变量1X2 = data[0:10,1] #自变量2Y = data[0:10,2] #因变量销售量Y1 = np.array([Y]).T #将因变量赋值给矩阵Y1X11 = np.array([X1]).T #为自变量系数矩阵X赋值X22 = np.array([X2]).TA = np.array([[1],[1],[1],[1],[1],[1],[1],[1],[1],[1]]) #创建系数矩阵B = np.hstack((A,X11)) #将矩阵a与矩阵X11合并为矩阵bX = np.hstack((B,X22)) #将矩阵b与矩阵X22合并为矩阵XX7 = X.T #矩阵X的转置矩阵X8 = np.dot(X7,X) #求矩阵X与他的转置矩阵的X7(X的转置矩阵)的乘积X9 = np.linalg.inv(X8) #X8的逆矩阵W = np.dot(np.dot((X9),(X7)),Y1) #求解系数矩阵W,分别对应截距b、a1、和a2b = 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('test.xlsx') #导入.xlsx文件数据sns.pairplot(data1, x_vars=['area','distance'], y_vars='Y', height=3, aspect=0.8, kind='reg') plt.show() #求月销售量Y的和以及平均值y1sumy = 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)#求预测值sales1sales1 = []for i in range(0,len(Y)):sales1.append(a1*X1[i]+a2*X2[i]+b)#求预测值的平均值y2y2 = 0sumy2 = 0for i in range(len(sales1)):sumy2 = sumy2+sales1[i]y2 = sumy2/len(sales1)#求预测值-平均值的和y11_y2y11_y2= 0for 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 = 0for i in range(0,len(sales1)):Sy1y1=Sy1y1+((sales1[i]-y2)*(sales1[i]-y2))print("Sy1y1=",Sy1y1)#(y1-y1平均)*(y-y平均)Syy1 = 0for 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*Rprint("判定系数R2=",R2)

结果如下:

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。