m 代表训练集(training set)中实例的数量
x 代表特征(feature)/输入(input) 变量
y 代表目标(target)/输出(output) 变量
(x,y) 代表训练集中的实例
(x(i),y(i))
(
x
(
i
)
,
y
(
i
)
)
代表第i个观察实例
h代表学习算法的模型,也称假设(hypothesis),
hθ(x)=θ0θ1x
h
θ
(
x
)
=
θ
0
θ
1
x
θ
θ
被称为参数(parameters)
模型预测值和训练集中实际值之间的差距就是建模误差(modeling error)
代价函数
学习的过程就是使代价函数(cost function)最小
梯度下降
梯度下降是用来求函数最小值的算法,同样也适用于代价函数.
代价函数的梯度下降思想是:随机选择一个参数的组合
(θ0,θ1,...,θn)
(
θ
0
,
θ
1
,
.
.
.
,
θ
n
)
,计算代价函数,接着找一个能让代价函数值下降最多的参数组合,不断迭代.直到直到局部最小值(local minimum),因为没有尝试所有组合所以不能确定最小值是否是全局最小(global minimum).
这个就是批量梯度下降的计算公式(batch gradient descent),其中
α
α
是学习速率(learn rate),学习速率随着越接近最小值,而变小(如果学习速率太大,则有可能越过最小值,使得代价函数发散)
向量化
常规的写法:
hθ(x)=∑nj=0θjxj
h
θ
(
x
)
=
∑
j
=
0
n
θ
j
x
j
向量的写法:
hθ(x)=θTX
h
θ
(
x
)
=
θ
T
X
其中
θ=[θ0,θ1,...,θn],X=[x1,x2,...,x3]
θ
=
[
θ
0
,
θ
1
,
.
.
.
,
θ
n
]
,
X
=
[
x
1
,
x
2
,
.
.
.
,
x
3
]
In[2]: import numpy as np
...: from numpy.random import rand
...: from timeit import timeit
...: a = np.mat(rand(1,10000))
...: b = np.mat(rand(10000,1))
...:
...: def matrix():
...: a * b
...: timeit(matrix,number=100) # 矩阵写法
...:
Out[2]: 0.009521265081375357
In[3]: a = [i for i in a.flat]
...: b = [i for i in b.flat]
...:
...: def loop():
...: sum = 0
...: for i in range(len(a)):
...: sum = sum + a[i]*b[i]
...: timeit(loop,number=100) # 普通写法
...:
Out[3]: 0.30903943240035536
矩阵的算法使得速度提高了进30倍
用矩阵描述梯度下降
常规写法:
向量写法: