人工智能/模式识别/机器学习精华专题机器学习与数据挖掘Python语言与信息数据获取和机器学习

机器学习之梯度下降

2017-02-18  本文已影响170人  HeartGo

梯度下降法是求解无约束最优化问题的一种常用的方法,方法实现简单。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合(θ0,θ1,...,θn),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到一个局部最小值(local minimum)。

Paste_Image.png

例如

1.目标函数

Paste_Image.png

2.代价函数

Paste_Image.png

问题:如何选取

Paste_Image.png

使得代价函数

Paste_Image.png

最小

思路如下:

(1)先确定向下一步的步伐大小α,我们称为Learning rate;

(2)任意给定一个初始值θ0,θ1,...θi;

(3)确定一个向下的方向,并向下走预先规定的步伐,并更新初始值;

Paste_Image.png

(4)当下降的高度小于某个定义的值,则停止下降;此时的θ0,θ1,...θi即为我们学习后得到的目标函数的θ0,θ1,...θi。

学习速率的影响

在使用梯度下降的时候,α的选取会影响算法的使用,α的值应该选取合适的值,不能过小,过小,学习效率比较慢,过大可能无法得到目标函数。

α的选取有如下几种方法

1.Adagrad

Paste_Image.png

其中,α为初始的学习速率,α^t为t次迭代后的学习速率。

2.或者给一固定值

α一般取0到1之间

代码如下:

x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]
# y[i] 样本点对应的输出
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]
 
# 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代
epsilon = 0.0001
 
# 学习率
alpha = 0.01
diff = [0, 0]
max_itor = 1000
error1 = 0
error0 = 0
cnt = 0
m = len(x)
 
 
# 初始化参数
theta0 = 0
theta1 = 0
theta2 = 0
 
while True:
    cnt += 1
 
    # 参数迭代计算
    for i in range(m):
        # 拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
        # 计算残差
        diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]
 
        # 梯度 = diff[0] * x[i][j]
        theta0 -= alpha * diff[0] * x[i][0]
        theta1 -= alpha * diff[0] * x[i][1]
        theta2 -= alpha * diff[0] * x[i][2]
 
    # 计算损失函数
    error1 = 0
    for lp in range(len(x)):
        error1 += (y[lp]-(theta0 + theta1 * x[lp][1] + theta2 * x[lp][2]))**2/2
 
    if abs(error1-error0) < epsilon:
        break
    else:
        error0 = error1
 
    print  (theta0, theta1, theta2, error1)
print  (theta0, theta1, theta2)
print  (cnt)
上一篇下一篇

猜你喜欢

热点阅读