[吴恩达机器学习]3·正规方程解多元线性回归

吴恩达机器学习系列课程:https://www.bilibili.com/video/BV164411b7dx

正规方程

说白了,这就是用我们在微积分中学习的多元微分学知识直接解出答案。

对于代价函数: J(θ)=J(θ0,θ1,,θn) 如果它是连续的,那么要求出它的最小值,只需要令各偏导为零,就能得到 θ 的值: Jθj=0,j=0,1,,n 或写作向量形式: Jθ=0 下面我们就来对多元线性回归的代价函数解一解。


多元线性回归的代价函数为: J(θ)=12mi=1m(θTx(i)y(i))2 于是其偏导函数为: Jθ=1mi=1m(θTx(i)y(i))x(i) 要使之为零向量,只能是: θTx(i)=y(i),i=1,2,,m 恒成立。写作矩阵为: Xθ=y 其中, X=[x0(1)x1(1)xn(1)x0(2)x1(2)xn(2)x0(m)x1(m)xn(m)]=[x(1)Tx(2)Tx(m)T],y=[y(1)y(2)y(m)] 两边同时乘以 XT,假设 XTX 可逆,解得: θ=(XTX)1XTy 这就是数学上多元线性回归方程的精确解。


这里,XTX 是一个 (n+1)×(n+1) 的矩阵,因此直接计算 θ 的复杂度是 O(n3) 的,如果 n 不是很大,这是有效的,但是如果 n 达到了 104,105 或更高级别,就需要使用梯度下降了。

实现

仍然对第二篇中的多元线性回归数据进行求解。

代码很简洁:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

def J(T, X, Y):
res = 0
for i in range(m):
res += (np.matmul(T.T, X[i:i+1, :].T) - Y[i:i+1, :]) ** 2
res /= 2 * m;
return res

data = np.genfromtxt("ex1data2.txt", delimiter = ',')
(m, n) = data.shape
X = np.column_stack((np.ones((m, 1)), data[:, :-1]))
Y = data[:, -1:]
T = np.matmul(np.matmul(np.linalg.inv(np.matmul(X.T, X)), X.T), Y)
print(T)
print(J(T, X, Y))
PYTHON

很快给出了结果:.

不可逆情形

前一节的推导基于 可逆的假设,如若不可逆,我们只需将代码中的 inv() 换成 pinv() 求出伪逆矩阵即可。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import numpy as np

def J(T, X, Y):
res = 0
for i in range(m):
res += (np.matmul(T.T, X[i:i+1, :].T) - Y[i:i+1, :]) ** 2
res /= 2 * m;
return res

data = np.genfromtxt("ex1data2.txt", delimiter = ',')
(m, n) = data.shape
X = np.column_stack((np.ones((m, 1)), data[:, :-1]))
Y = data[:, -1:]
T = np.matmul(np.matmul(np.linalg.pinv(np.matmul(X.T, X)), X.T), Y)
print(T)
print(J(T, X, Y))
PYTHON

[吴恩达机器学习]3·正规方程解多元线性回归
https://xyfjason.github.io/blog-main/2020/12/22/吴恩达机器学习-3·正规方程解多元线性回归/
作者
xyfJASON
发布于
2020年12月22日
许可协议