算法具体可以参照其他的博客:

随机梯度下降:

  1. # coding=utf-8
  2. '''
  3. 随机梯度下降
  4. '''
  5. import numpy as np
  6.  
  7. # 构造训练数据
  8. x = np.arange(0., 10., 0.2)
  9. m = len(x)
  10. x0 = np.full(m, 1.0)
  11. input_data = np.vstack([x0, x]).T # 将偏置b作为权向量的第一个分量
  12. target_data = 3 * x + 8 + np.random.randn(m)
  13.  
  14. max_iter = 10000 # 最大迭代次数
  15. epsilon = 1e-5
  16.  
  17. # 初始化权值
  18. w = np.random.randn(2)
  19. # w = np.zeros(2)
  20.  
  21. alpha = 0.001 # 步长
  22. diff = 0.
  23. error = np.zeros(2)
  24. count = 0 # 循环次数
  25.  
  26. print '随机梯度下降算法'.center(60, '=')
  27.  
  28. while count < max_iter:
  29. count += 1
  30. for j in range(m):
  31. diff = np.dot(w, input_data[j]) - target_data[j] # 训练集代入,计算误差值
  32. # 这里的随机性表现在:一个样本更新一次参数!
  33. w = w - alpha * diff * input_data[j]
  34.  
  35. if np.linalg.norm(w - error) < epsilon: # 直接通过np.linalg包求两个向量的范数
  36. break
  37. else:
  38. error = w
  39. print 'loop count = %d' % count, '\tw:[%f, %f]' % (w[0], w[1])
  1. # coding=utf-8
  2. """
  3. 批量梯度下降
  4. """
  5. import numpy as np
  6.  
  7. # 构造训练数据
  8. x = np.arange(0., 10., 0.2)
  9. m = len(x)
  10. x0 = np.full(m, 1.0)
  11. input_data = np.vstack([x0, x]).T # 将偏置b作为权向量的第一个分量
  12. target_data = 3 * x + 8 + np.random.randn(m)
  13.  
  14. # 停止条件
  15. max_iter = 10000
  16. epsilon = 1e-5
  17.  
  18. # 初始化权值
  19. w = np.random.randn(2)
  20. # w = np.zeros(2)
  21.  
  22. alpha = 0.001 # 步长
  23. diff = 0.
  24. error = np.zeros(2)
  25. count = 0 # 循环次数
  26.  
  27. while count < max_iter:
  28. count += 1
  29.  
  30. sum_m = np.zeros(2)
  31.  
  32. for i in range(m):
  33. dif = (np.dot(w, input_data[i]) - target_data[i]) * input_data[i]
  34. sum_m = sum_m + dif
  35. '''
  36. for j in range(m):
  37. diff = np.dot(w, input_data[j]) - target_data[j] # 训练集代入,计算误差值
  38. w = w - alpha * diff * input_data[j]
  39. '''
  40. w = w - alpha * sum_m
  41.  
  42. if np.linalg.norm(w - error) < epsilon:
  43. break
  44. else:
  45. error = w
  46. print 'loop count = %d' % count, '\tw:[%f, %f]' % (w[0], w[1])

小批量梯度下降:

  1. # coding=utf-8
  2. """
  3. 小批量梯度下降
  4. """
  5. import numpy as np
  6. import random
  7.  
  8. # 构造训练数据
  9. x = np.arange(0., 10., 0.2)
  10. m = len(x)
  11. x0 = np.full(m, 1.0)
  12. input_data = np.vstack([x0, x]).T # 将偏置b作为权向量的第一个分量
  13. target_data = 3 * x + 8 + np.random.randn(m)
  14.  
  15. # 两种终止条件
  16. max_iter = 10000
  17. epsilon = 1e-5
  18.  
  19. # 初始化权值
  20. np.random.seed(0)
  21. w = np.random.randn(2)
  22. # w = np.zeros(2)
  23.  
  24. alpha = 0.001 # 步长
  25. diff = 0.
  26. error = np.zeros(2)
  27. count = 0 # 循环次数
  28.  
  29. while count < max_iter:
  30. count += 1
  31.  
  32. sum_m = np.zeros(2)
  33. index = random.sample(range(m), int(np.ceil(m * 0.2)))
  34. sample_data = input_data[index]
  35. sample_target = target_data[index]
  36.  
  37. for i in range(len(sample_data)):
  38. dif = (np.dot(w, input_data[i]) - target_data[i]) * input_data[i]
  39. sum_m = sum_m + dif
  40.  
  41. w = w - alpha * sum_m
  42.  
  43. if np.linalg.norm(w - error) < epsilon:
  44. break
  45. else:
  46. error = w
  47. print 'loop count = %d' % count, '\tw:[%f, %f]' % (w[0], w[1])

通过迭代,结果会收敛到8和3:

  1. loop count = w:[8.025972, 2.982300]

参考:http://www.cnblogs.com/pinard/p/5970503.html

SGD/BGD/MBGD使用python简单实现的更多相关文章

  1. 深度学习——优化器算法Optimizer详解(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  2. 【深度学习】深入理解优化器Optimizer算法(BGD、SGD、MBGD、Momentum、NAG、Adagrad、Adadelta、RMSprop、Adam)

    在机器学习.深度学习中使用的优化算法除了常见的梯度下降,还有 Adadelta,Adagrad,RMSProp 等几种优化器,都是什么呢,又该怎么选择呢? 在 Sebastian Ruder 的这篇论 ...

  3. Python简单爬虫入门三

    我们继续研究BeautifulSoup分类打印输出 Python简单爬虫入门一 Python简单爬虫入门二 前两部主要讲述我们如何用BeautifulSoup怎去抓取网页信息以及获取相应的图片标题等信 ...

  4. Python简单爬虫入门二

    接着上一次爬虫我们继续研究BeautifulSoup Python简单爬虫入门一 上一次我们爬虫我们已经成功的爬下了网页的源代码,那么这一次我们将继续来写怎么抓去具体想要的元素 首先回顾以下我们Bea ...

  5. 亲身试用python简单小爬虫

    前几天基友分享了一个贴吧网页,有很多漂亮的图片,想到前段时间学习的python简单爬虫,刚好可以实践一下. 以下是网上很容易搜到的一种方法: #coding=utf-8 import urllib i ...

  6. GJM : Python简单爬虫入门(二) [转载]

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  7. Selenium + PhantomJS + python 简单实现爬虫的功能

    Selenium 一.简介 selenium是一个用于Web应用自动化程序测试的工具,测试直接运行在浏览器中,就像真正的用户在操作一样 selenium2支持通过驱动真实浏览器(FirfoxDrive ...

  8. 【美妙的Python之中的一个】Python简单介绍及环境搭建

    美妙的Python之Python简单介绍及安装         简而言之: Python 是能你无限惊喜的语言,与众不同.             1.Python:                  ...

  9. python 简单图像识别--验证码

    python  简单图像识别--验证码 记录下,准备工作安装过程很是麻烦. 首先库:pytesseract,image,tesseract,PIL windows安装PIL,直接exe进行安装更方便( ...

随机推荐

  1. STL库中的equal_range()

    equal_range根据键值,返回一对迭代器的pair对象.如果该键值在容器中存在,则pair对象中的第一个迭代器指向该键关联的第一个实例,第二个迭代器指向该键关联的最后一个实例的下一位置.如果找不 ...

  2. Python说文解字_Python之多任务_05

    问:在Py3.5之前yield表现非常好,在Py3.5之后为了将予以变得更加明确,就引入了async和await关键词用于定义原生的协议. 答:async和await原生协程: async def d ...

  3. MBR&/BOOT&GRUB

      能正常工作的grub应该包 括一下文件:stage1.stage2.*stage1_5.menu.lst. 其中stage1要被安装(也就是写入)某个硬盘的主引导记录,或者某个活动分区(这个分区要 ...

  4. 一本通1402 Vigenère密码

    [题目描述]6世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南 ...

  5. vmbox 导入虚拟电脑之后无法上网

    先执行 ip addr 查看有没有分配ip 用root执行dhclient -v命令去通过DHCP协议获取一个ip,在下图的最后一行可以看到ip已经分配成功dhclient命令可以用来释放你的电脑的I ...

  6. Codeforces 405D 数学问题

    真是脑残...擦 具体题解在这里 http://www.cnblogs.com/windysai/p/3619222.html 原本我为了防止两个数冲突,设置了好多判断,结果发现,如果两个数冲突,另外 ...

  7. SQL基础教程(第2版)第6章 函数、谓词、CASE表达式:6-3 CASE表达式

    ● 虽然CASE表达式中的ELSE子句可以省略,但为了让SQL语句更加容易理解,还是希望大家不要省略. ● CASE表达式中的END不能省略. ● 使用CASE表达式能够将SELECT语句的结果进行组 ...

  8. libcurl在windows下的使用

    curl在linux下很好用,但到了windows下写程序却没办法使用了,这时候可以使用libcurl库 libcurl库的编译网上很多,我就不一一赘述了,curl的官方网站:https://curl ...

  9. py02_04:三元运算法

    a if a > b else c     #  a>b 成立,则为真,如果a>b为假,则返回c

  10. order by rand()优化

    优化前: SELECT id, loan_id, NAME, company FROM tablename WHERE time BETWEEN 1522512000 AND 1525103999 A ...