梯度下降原理推导及python实现

最近在学习吴恩达老师的机器学习课程,课程里边实现算法用的octave,但是自己常用的是python座所以这里就用python实现梯度下降算法(工程的角度)。

一、梯度下降简介

梯度下降是是无约束线性规划中求解最优问题最基本的方法,类似的还有牛顿法,拟牛顿法等。在解决问题的时候我们通常用来拟合f(x),得到相关参数的值,然后进行预测。梯度法在求解问题的时候总是选择当前位置的负梯度方向作为搜索方向,如果想深究背后得到数学原理可以参考《运筹学》清华大学版,非线性规划部分,以及周志华老师的西瓜书,线性回归部分,以及李航老师的<<统计学习方法>>。

二、蕴含在梯度下降后边的数学原理

梯度下降法目的就是寻找一个合适的参数值来得到一个能够描述目标问题的函数方程,在这里需要的预备知识有代价函数。接下来的部分打字过于麻烦我就手工推导。

这里我们结合图形来说一下

初始点开始按照红色箭头一步一步搜索然后走到min整个过程就是这样的

三、梯度下降python实现

import numpy as np

import matplotlib.pyplot as plt

#y=2 * (x1) + (x2) + 3

rate = 0.001

x_train = np.array([    [1, 2],    [2, 1],    [2, 3],    [3, 5],    [1, 3],    [4, 2],    [7, 3],    [4, 5],    [11, 3],    [8, 7]    ])

y_train = np.array([7, 8, 10, 14, 8, 13, 20, 16, 28, 26])

x_test  = np.array([    [1, 4],    [2, 2],    [2, 5],    [5, 3],    [1, 5],    [4, 1]    ])


a = np.random.normal()

b = np.random.normal()

c = np.random.normal()


def h(x):

    return a*x[0]+b*x[1]+c


for i in range(10000):

    sum_a=0

    sum_b=0

    sum_c=0

    for x, y in zip(x_train, y_train):

        sum_a = sum_a - rate*(y-h(x))*x[0]

        sum_b = sum_b - rate*(y-h(x))*x[1]

        sum_c = sum_c - rate*(y-h(x))

    a = a - sum_a

    b = b - sum_b

    c = c - sum_c

    plt.plot([h(xi) for xi in x_test])


print(a)

print(b)

print(c)


result=[h(xi) for xi in x_train]

print(result)


result=[h(xi) for xi in x_test]

print(result)


plt.show()

四、结果展示

整个拟合过程如上图所示,可见基本的梯度下降还是很耗费时间的,在后边我还会介绍改进过后的梯度下降算法. 

D:\developEnvironment\anaconda\envs\tensorflow\python.exe D:/developWorkSpace/python/worspace/housingPredict/demo.py

2.0000000035611545

1.000000018775773

2.9999999040587215

[6.999999945171423, 7.999999929956804, 9.99999996750835, 14.00000000862105, 7.999999963947195, 12.999999955854886, 19.999999985314123, 16.000000012182205, 27.999999999558742, 26.00000006397837]

[8.999999982722969, 8.999999948732576, 12.000000005059896, 15.999999978191813, 10.00000000149874, 11.999999937079114]


Process finished with exit code 0

五、总结

这只是关于梯度下降的入门,需要有一部分数学知识储备,相关的参考资料我也在文中提及了,自己写的不是很全面,感兴趣的朋友可以参考相关书籍自己推导加深理解.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值