吴恩达机器学习系列课程:https://www.bilibili.com/video/BV164411b7dx
正规方程
说白了,这就是用我们在微积分中学习的多元微分学知识直接解出答案。
对于代价函数: 如果它是连续的,那么要求出它的最小值,只需要令各偏导为零,就能得到 的值: 或写作向量形式: 下面我们就来对多元线性回归的代价函数解一解。
多元线性回归的代价函数为: 于是其偏导函数为: 要使之为零向量,只能是: 恒成立。写作矩阵为: 其中, 两边同时乘以 ,假设 可逆,解得: 这就是数学上多元线性回归方程的精确解。
这里, 是一个 的矩阵,因此直接计算 的复杂度是 的,如果 不是很大,这是有效的,但是如果 达到了 或更高级别,就需要使用梯度下降了。
实现
仍然对第二篇中的多元线性回归数据进行求解。
代码很简洁:
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
|