本人从2017年起,开始涉猎机器学习。作为入门,首先学习的是斯坦福大学Andrew Ng(吴恩达)教授的Coursera课程


2 单变量线性回归

线性回归属于监督学习(Supervise Learning),就是Right answer is given。 课程中,举了一个估计房产价格的例子,在此,我就直接使用两组数据去作为例子使用线性回归,拟合出效果最好的曲线。


2.1 单变量线性回归算法的思路

  1. 根据数据的分布,确定模型

    其中,h(x)是假设函数(Hypothesis Fuction),θ1θ0 是关于线性回归的参数
  2. 确定代价函数(Cost Fuction)

    其中,J(θ)是代价函数,也是误差函数,m代表数据个数,这样显然,目标函数就是:
  3. 确定是实现目标函数的方法,就是使J(θ)最小的方法。在这里,我们使用梯度下降法(Gradient Descent )

    对于此式,往下作解释。

下面我举一个很浅显的例子,验证线性回归算法的作用。
假设,有两组数据:
train_x = [1,2,3,4,5,6,7,8,9,10,11,12,13,14]
train_y = [3,5,7,9,11,13,15,17,19,21,23,25,27,29]
仔细观察这两组数据,发现它们满足:y = 2x +1这个函数关系,那么怎么使用线性回归得出这个结果呢?从机器学习的角度来说,就是怎么使得计算机能从已知的有限个数据中,拟合出最合适的曲线,并预测其他x值对应的y值。

2.2 线性模型

针对已知的数据,如果使用线性模型,由于只有一个特征/输入变量(此处指的是x),则属于单变量线性回归。预测函数为:

Python中使用Tensorflow库的实现:

  1. #Input data
  2. train_x = np.asarray([1,2,3,4,5,6,7,8,9,10,11,12,13,14])
  3. train_y = np.asarray([3,5,7,9,11,13,15,17,19,21,23,25,27,29])
  4.  
  5. #Create the linear model
  6. X = tf.placeholder("float")
  7. W = tf.Variable(np.random.randn(),name="theta1")
  8. b = tf.Variable(np.random.randn(),name="theta0")
  9. pred = tf.add(tf.mul(W,X),b)

2.3 代价函数

建立基本模型之后,就要对模型误差进行评估,而这个评估的函数,就是代价函数
这里我们使用预测数据值和偏差的平方去表示模型的误差,式子如2.1所示。在tensorflow中实现:

  1. m = train_x.shape[0] #数据总个数
  2. cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*m)

2.4目标函数的建立及实现

构造模型的目标,当然是是模型误差最小化,因此,目标函数为:

而怎么实现呢?在本例中,我们使用梯度下降,即:

其中,该式针对本例的意思,是:

这样,每进行一次运算,J(θ)的值就会进一步减少。

2.5 理清概念

模型理解的关键是切实理清假设函数和代价函数的作用。如下图所示:

注:图像均使用python下的matplotlib.pyplot和mpl_toolkits.mplot3d库所作。
显然,预测函数是根据训练数据而定的,而代价函数是为假设函数服务的,通过优化代价函数,就能找出最佳的参数赋给假设函数,从而找出最佳的模型。同时,由上图可见,当参数θ有两个的时候,代价函数是一个三维图,所以当参数更多的时候就是更多维的图。

2.6 程序实现线性回归

程序源码:

  1. #!/usr/bin/env python2
  2. #-*- coding:utf-8 -*-
  3. import tensorflow as tf
  4. import numpy as np
  5. import matplotlib.pyplot as plt
  6. import sys
  7.  
  8. reload(sys)
  9. sys.setdefaultencoding('utf8')
  10.  
  11. #Input data
  12. train_x = np.asarray([1,2,3,4,5,6,7,8,9,10,11,12,13,14])
  13. train_y = np.asarray([3,5,7,9,11,13,15,17,19,21,23,25,27,29])
  14.  
  15. X = tf.placeholder("float")
  16. Y = tf.placeholder("float")
  17.  
  18. #W,b分别代表θ1,θ0
  19. #np.random.rann()用于初始化W和b
  20. W = tf.Variable(np.random.randn(),name="theta1")
  21. b = tf.Variable(np.random.randn(),name="theta0")
  22.  
  23. #1 假设函数的确定
  24. pred = tf.add(tf.mul(W,X),b)
  25.  
  26. #2 代价函数的确定
  27. m = train_x.shape[0] #
  28. cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*m)
  29.  
  30. #3 梯度下降
  31. learning_rate = 0.01
  32. optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
  33. #至此模型构建完成
  34.  
  35. #Initialize the variables
  36. init = tf.initialize_all_variables()
  37.  
  38. #Lauch the graph
  39. with tf.Session() as sess:
  40. sess.run(init)
  41. for epoch in range(1000): #进行100次的迭代训练
  42. for (x,y) in zip(train_x,train_y):
  43. sess.run(optimizer,feed_dict={X:x,Y:y})
  44. #display
  45. if(epoch+1)%50==0:
  46. c=sess.run(cost,feed_dict={X:train_x,Y:train_y})
  47. print "step:%04d, cost=%.9f, θ1=%s, θ0=%s"%((epoch+1),c,sess.run(W),sess.run(b))
  48. print "Optimzer finished!"
  49. #training_cost = sess.run(cost,feed_dict={X:train_x,Y:train_y})
  50.  
  51. print "The final is y=%sx+%s"%(sess.run(W),sess.run(b))
  52. plt.plot(train_x,train_y,'ro',label="Original data")
  53. plt.grid(True)
  54. plt.plot(range(1,))
  55. plt.plot(train_x,sess.run(W)*train_x+sess.run(b),label="Fitted line")
  56. plt.legend()
  57. plt.show()

程序运行结果:

  1. step:0050, cost=0.068827711, θ1=1.92573, θ0=1.77617
  2. step:0100, cost=0.055033159, θ1=1.93359, θ0=1.69404
  3. step:0150, cost=0.044003420, θ1=1.94061, θ0=1.62061
  4. step:0200, cost=0.035184156, θ1=1.9469, θ0=1.55494
  5. step:0250, cost=0.028132409, θ1=1.95252, θ0=1.49622
  6. step:0300, cost=0.022494031, θ1=1.95754, θ0=1.44372
  7. step:0350, cost=0.017985778, θ1=1.96203, θ0=1.39677
  8. step:0400, cost=0.014381131, θ1=1.96605, θ0=1.35479
  9. step:0450, cost=0.011498784, θ1=1.96964, θ0=1.31725
  10. step:0500, cost=0.009194137, θ1=1.97285, θ0=1.28368
  11. step:0550, cost=0.007351381, θ1=1.97573, θ0=1.25366
  12. step:0600, cost=0.005878080, θ1=1.97829, θ0=1.22682
  13. step:0650, cost=0.004699936, θ1=1.98059, θ0=1.20282
  14. step:0700, cost=0.003757860, θ1=1.98265, θ0=1.18136
  15. step:0750, cost=0.003004675, θ1=1.98448, θ0=1.16217
  16. step:0800, cost=0.002402445, θ1=1.98612, θ0=1.14501
  17. step:0850, cost=0.001920973, θ1=1.98759, θ0=1.12967
  18. step:0900, cost=0.001535962, θ1=1.9889, θ0=1.11595
  19. step:0950, cost=0.001228108, θ1=1.99008, θ0=1.10368
  20. step:1000, cost=0.000981987, θ1=1.99113, θ0=1.09271
  21. Optimzer finished!
  22. The final is y=1.99113x+1.09271


显然,最终得出的曲线很接近y=2x+1,如果增加训练的次数会更加接近。成功验证了线性回归算法!

Andrew Ng机器学习入门——线性回归的更多相关文章

  1. Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归)

    title: Andrew Ng机器学习课程笔记--week1(机器学习介绍及线性回归) tags: 机器学习, 学习笔记 grammar_cjkRuby: true --- 之前看过一遍,但是总是模 ...

  2. Andrew Ng机器学习课程笔记(一)之线性回归

    Andrew Ng机器学习课程笔记(一)之线性回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364598.html 前言 ...

  3. Andrew Ng机器学习算法入门(一):简介

    简介 最近在参加一个利用机器学习来解决安全问题的算法比赛,但是对机器学习的算法一直不了解,所以先了解一下机器学习相关的算法. Andrew Ng就是前段时间从百度离职的吴恩达.关于吴恩达是谁,相信程序 ...

  4. Andrew Ng机器学习课程笔记(五)之应用机器学习的建议

    Andrew Ng机器学习课程笔记(五)之 应用机器学习的建议 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7368472.h ...

  5. Andrew Ng机器学习课程笔记--汇总

    笔记总结,各章节主要内容已总结在标题之中 Andrew Ng机器学习课程笔记–week1(机器学习简介&线性回归模型) Andrew Ng机器学习课程笔记--week2(多元线性回归& ...

  6. Andrew Ng机器学习课程笔记(四)之神经网络

    Andrew Ng机器学习课程笔记(四)之神经网络 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365730.html 前言 ...

  7. Andrew Ng机器学习课程笔记(三)之正则化

    Andrew Ng机器学习课程笔记(三)之正则化 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7365475.html 前言 ...

  8. Andrew Ng机器学习课程笔记(二)之逻辑回归

    Andrew Ng机器学习课程笔记(二)之逻辑回归 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7364636.html 前言 ...

  9. Andrew Ng机器学习课程10

    Andrew Ng机器学习课程10 a example 如果hypothesis set中的hypothesis是由d个real number决定的,那么用64位的计算机数据表示的话,那么模型的个数一 ...

随机推荐

  1. [译]关于Java 字符串最常被问到的十个问题

    (说明,该文章翻译自Top 10 questions of Java Strings) 下面是关于Java字符串最常被问到的十个问题 1.怎么去比较字符串?使用==还是使用equals()? 简单来说 ...

  2. 《Visual Studio Magazine》2013年读者选择奖—界面框架类

    好消息!2013 Visual Studio Magazine读者选择奖已经正式揭晓了!据了解,截至今年此奖项已经评选了21次,非常值得.NET开发人员信赖和参考.此次评选共有400多个产品角逐28个 ...

  3. Android总结的基本机制监控事件

    研究上午Android底层机制事件监视器,例如下面的摘要: 内核驱动监控硬件状态和行为,由uevent机制将事件发送到用户空间: 通过用户空间UeventObserver从内核监控uevent,处理. ...

  4. javascript 函数介绍

    javascript函数使用的时候,往往都比较单一,这里介绍几种不同于我们之前使用的函数调用方式! 1.函数表达式包含名称,用于递归 var f = function s(num) { if (num ...

  5. 谈一谈struts2和springmvc的拦截器

    最近涉及到了两个项目,都需要考虑全局的拦截器,其功能就是判断session的登陆状态,如果session信息完好,可以从中取得相应的信息,则放行,否则拦截,进入重定向的uri. 既然是全局的拦截器,其 ...

  6. 如何将C#对象转化为JSON字符串

    System.Web.Extensions.dll中类JavaScriptSerializer可以帮助我们把C#对象转化为JSON字符串. 有一个Person类 public class Person ...

  7. Oracle左连接,右连接

    Oracle左连接,右连接 数据表的连接有: 1.内连接(自然连接): 只有两个表相匹配的行才能在结果集中出现 2.外连接: 包括 (1)左外连接(左边的表不加限制) (2)右外连接(右边的表不加限制 ...

  8. ADFS 2.0 配置简介 PartⅢ – 声明规则语言

    上一篇我们最终把 ADFS 与应用之间的信任关系建立起来了,但是应用接收到的声明信息只有默认的两个,这次我们就来学学怎么配置声明. 一.声明存储配置 ADFS 目前默认支持三种方式的声明值存储,另外还 ...

  9. C语言练习-学生信息管理系统

    题目要求: 学生信息管理系统struct studentInfo{ int id; char name[128]; int age; char sex; int c_score; int cpp_sc ...

  10. Linq to sql 结

    ----左链接 var LeftJoin = from emp in ListOfEmployees join dept in ListOfDepartment on emp.DeptID equal ...