详解多元线性回归,并分别用标准方程法以及梯度下降法,通过Python编程求解

什么是多元线性回归?

java多元线性回归预测房价 多元线性回归分析房价_特征值


 

如何实现多元线性回归?

java多元线性回归预测房价 多元线性回归分析房价_梯度下降法_02


现在,我们只需要让代价函数Jθ最小,就能得到最优的θ参数。那么,要怎样才能使Jθ最小呢?有两个办法,一个是梯度下降法(gradient descent),一个是标准方程法(norm equation)

Jθ在样本数据X确定时,是关于θ的一个函数,而θ是一个(n+1)维的列向量,也就是说Jθ其实是一个(n+1)元函数。学过微积分的人应该知道,要求一个多元函数的极值,可以令多元函数对每个未知元的偏导数为0,从而求出未知元,再代入函数中,便可求出函数的极值。同样地,我们现在要求Jθ的极值,那么就要先使Jθ关于θ的偏导数,或者说关于θ0、θ1、θ2、...、θn的偏导数都为0。

java多元线性回归预测房价 多元线性回归分析房价_梯度下降法_03


注意:在第四步中,两边左乘一个XT是为了在左边获得一个方阵(XTX),因为只有方阵才有逆矩阵。

在Python中,只需要两步便可实现这个算法:

1 from numpy.linalg import pinv
2 theta = pinv(X.T.dot(X)).dot(X.T).dot(y)

 

梯度下降法(Gradient Descent)

标准方程法虽然实现起来很简单,但是在面对十万甚至是百万级别的数据样本量时,求解一个如此大的矩阵的逆需要花费大量的时间,这时候就需要考虑梯度下降法了。梯度下降法的思想是一点点、逐步靠近极小值,通过多次迭代,不断更新θ的值,让代价函数Jθ收敛于极小值。迭代的公式为:

java多元线性回归预测房价 多元线性回归分析房价_多元线性回归_04

我们已经知道了如何求Jθ关于θ的偏导数,只要一直迭代下去,直到Jθ等于0或者足够的小(比如小于1e-5),最后我们便得到了想要的θ值。

以下我用Python实现了用梯度下降法求θ:

1 import numpy as np
 2 
 3 def partial_derivative(X, theta, y):
 4     derivative = X.T.dot(X.dot(theta) - y) / X.shape[0]
 5     return derivative
 6 
 7 
 8 def gradient_descent(X, y, alpha=0.1):
 9     theta = np.ones(shape=y.shape, dtype=float)
10     partial_derivative_of_J = partial_derivative(X, theta, y)
11     while any(abs(partial_derivative_of_J) > 1e-5):
12         theta = theta - alpha * partial_derivative_of_J
13         partial_derivative_of_J = partial_derivative(X, theta, y)
14     return theta