[吴恩达机器学习]2·梯度下降解多元线性回归

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

多元线性回归

类似于一元的线性回归,不过我们现在有多个自变量 x1,x2,,xn,即给定的数据集为: {(x1(i),x2(i),,xn(i),y(i)),i=1,2,,m} 相应地,回归方程也具有多个参数 θ0,θ1,,θnhθ(x)=θTx=θ0x0++θnxn 这里我们假定 x0 恒等于 1,并以向量表示自变量和参数:θ=(θ0,,θn)T,x=(x0,,xn)T.

梯度下降解多元线性回归

类似的,我们定义代价函数: J(θ)=12mi=1m(θTx(i)y(i))2 于是, Jθ=1mi=1m(θTx(i)y(i))x(i) 梯度下降时,不断作迭代: θ:=θαJθ 即可。

特征缩放与标准化

当我们的不同自变量取值范围相差较大时,梯度下降可能会很慢,这时,我们需要把所有自变量进行缩放、标准化。具体的,只要我们置: xi(j):=xi(j)μiσi 其中,μi=1mj=1mxi(j) 是样本均值,σi=j=1m(xi(j)μi)2m1 是样本标准差,就完成了归一化。

归一化后样本均值为 0,方差为 1.

实现

Normalization 函数将数据集标准化,J 函数即计算 J(θ)partJ 函数计算 JθGradientDescent 进行梯度下降。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
import numpy as np
import matplotlib.pyplot as plt

alpha = 0.01
iteration = 10000
Z = []

def Normalization(data):
return (data - data.mean(axis = 0)) / data.std(axis = 0, ddof = 1)

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

def partJ(T, X, Y):
res = np.zeros((n, 1))
for i in range(m):
res += (np.matmul(T.T, X[i:i+1, :].T) - Y[i:i+1, :]) * X[i:i+1, :].T
res /= m
return res

def GradientDescent(X, Y):
T = np.zeros((n, 1))
for t in range(iteration):
T = T - alpha * partJ(T, X, Y)
Z.append(J(T, X, Y)[0][0])
return T

data = np.genfromtxt("ex1data2.txt", delimiter = ',')
(m, n) = data.shape
data = Normalization(data)
X = np.column_stack((np.ones((m, 1)), data[:, :-1]))
Y = data[:, -1:]
T = GradientDescent(X, Y)
print(T)

p1 = plt.subplot(111)
p1.plot(range(1, iteration+1), Z)
p1.set_xlabel('Iteration')
p1.set_ylabel('Cost')
plt.show()
PYTHON

最后得到的结果:.

学习率取为 时,代价函数值随迭代次数的变化:


[吴恩达机器学习]2·梯度下降解多元线性回归
https://xyfjason.github.io/blog-main/2020/12/21/吴恩达机器学习-2·梯度下降解多元线性回归/
作者
xyfJASON
发布于
2020年12月21日
许可协议