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倍