目录
引入
梯度下降法VS标准方程法
标准方程法代码实现
引入
假设引入一个买房子的问题,如下表,记录了房子大小,卧室数,客厅数,拥有几年了以及价格
我们将这些数据转换成矩阵形式,如下:
转换成矩阵形式后,也可以将我们之前的方程转成矩阵形式如下,我们可以看到只需要求解出w即可。
从第一张图,我们可以看到需要求最小的值,根据数学知识我们可以直到可以对函数进行求导来求最小的值。矩阵求导,我们需要引入一些概念以及求导公式(公式可以在网页中搜索):
分子布局:分子为列向量或者分母为行向量
分母布局:分子为行向量或者分母为列向量
求导过程如下:
使求导的结果等于0,结果如下:
在上边求出来的w中,(X.TX)^-1为X.TX的逆矩阵,这个在计算的时候要保证X.TX的行列式不为0,若为0则没有逆矩阵,不能使用此方法来计算。
梯度下降法VS标准方程法
梯度下降法 | 标准方程法 | |
缺点 | 需要选择合适的学习率 | 需要计算(X.TX)^-1 |
需要迭代很多个周期 | 时间复杂度大约是O(n^3) | |
只能得到最优解的近似值 | n是特征值数量 | |
优点 | 当特征值非常多的时候也可以很好的工作 | 不需要学习率 |
不需要迭代 | ||
可以得到全局最优解 |
标准方程法代码实现
- 需要用到的库导入
import numpy as np
from numpy import genfromtxt
import matplotlib.pyplot as plt
%matplotlib inline
- 将数据导入
data = np.genfromtxt('data.csv',delimiter = ',')
plt.scatter(x_data,y_data)
plt.show()
- 将数据进行处理,添加偏执
x_data = data[:,0,np.newaxis]
y_data = data[:,1,np.newaxis]
#添加偏置
X_data = np.concatenate((np.ones((100,1)),x_data),axis = 1) #concatenate 组合 axis = 1表示对应行的数组进行拼接
print((X_data).shape)
- 标准方程法求解线性回归
#标准方程法求解线性回归
def Stand_equation(Xarr,Yarr):
#转换成矩阵的形式
Xmat = np.mat(Xarr)
Ymat = np.mat(Yarr)
xtx = Xmat.T * Xmat
if np.linalg.det(xtx) == 0.0: #我们所求的矩阵的行列式不能等于0
print("no eigenvalues")
return
sw = xtx.I*Xmat.T*Ymat
return sw
- 调用我们写的函数
w = Stand_equation(X_data,y_data)
- 这样就已经实现完了,接下来,我们画图来实际看看效果
#画图
x_test = np.array([[20],[80]])
y_test = w[0] + x_test*w[1]
plt.plot(x_data,y_data,'b.')
plt.plot(x_test,y_test,'r')
plt.show()
- 结果显示
以上就是我们用不同于梯度下降法实现的线性回归!