前言:
解决线性回归问题不仅可以使用梯度下降法,还可以使用标准方程法,今天我将尝试用标准方程法来解决问题
正文:
#老朋友就不介绍了 import numpy as np from numpy import genfromtxt import matplotlib.pyplot as plt
#载入数据 data = np.genfromtxt("data.csv",delimiter = ",") #增加维度 x_data = data[:,0,np.newaxis] y_data = data[:,1,np.newaxis] #描点画图 plt.scatter(x_data,y_data) plt.show()
图片展示:
#np.mat函数用来把数据转化为数组矩阵 print(np.mat(x_data).shape) print(np.mat(y_data).shape) #给样本添加偏置项 #用concatenate函数来合并项 #np.ones函数来创建全为1数组矩阵 x_data = np.concatenate((np.ones((100,1)),x_data),axis = 1) print(x_data.shape)
图片显示如下:
可以看到x_data修改后的格式
#用标准方程来求参数 def weights(xArr,yArr): #用mat函数来生成矩阵 xMat = np.mat(xArr) yMat = np.mat(yArr) xTx = xMat.T*xMat #矩阵乘法 #用linalg.det函数来计算矩阵的值,如果值为0.说明该矩阵没有逆矩阵 if np.linalg.det(xTx) == 0.0: print("this matrix cannot do innverse") return #xTx.I是xTx的逆矩阵 #xtx.T是xTx的转置矩阵 #通过公式计算出ws,也就是方程各个参数的值 #ws的值应为多个数值,即方程中未知参数的总量 ws = xTx.I*xMat.T*yMat return ws
#代入我们的数据,并用写好的函数来计算ws的值 ws = weights(x_data,y_data) print(ws)
结果如下:
#把x_data的范围固定20~80 x_test = np.array([[20],[80]]) #用ws中求出来的参数值,计算y的值 y_test = ws[0] + x_test*ws[1] #描点描线 plt.plot(x_data,y_data,'b.') plt.plot(x_test,y_test,'r') #画图 plt.show()
总结:
通过标准方程法同样可以解决问题,且较为简单,但对于多参数问题,则梯度下降法比较合适!
来源:https://www.cnblogs.com/lqk0216/p/12341958.html