Tensorflow for Line Regression

3,133次阅读
2 条评论

共计 2900 个字符,预计需要花费 8 分钟才能阅读完成。

回归问题是机器学习中一类重要的问题,可以作为一种预测系统或者作为推荐系统的模型,这里不重点讨论回归的理论,读者可自行百度。本文讨论的是对于一种系统:比如推荐系统或者预测系统,我们如何来挑选模型,及对模型的评价。

假设我们真实的模型是: y = 4*x + 3,用这个模型我们生成一系列带噪声的样本。实际中我们并不知道真实模型是什么样,那如何去根据数据找模型呢?
显然:
步骤1:给定一组模型的集合,比如有一次函数模型,二次函数模型,多项式模型,指数模型等等;
步骤2:根据模型集合,选择一种模型(函数),求出起参数;
问题来了:最好参数的原则如何定义?
一般而言有多种方法,其中一种就是均方误差最小。
步骤3:根据代价函数(均方误差最小函数)求出最优的模型参数;
问题又来了,如何求模型参数呢?
方法也有很多,对于机器学习或者深度学习来说,梯度下降法是比较好的选择。
最后,根据最优解确定参数。
步骤4:对多个函数集里面的函数重复步骤1~步骤3,得到各模型的最优参数,然后根据误差来确定一个或几个比较好的模型;
步骤5:测试数据集来测试选择的模型,交叉验证。

上述就是基本方法,下面有一些关键问题是实际中需要注意和理解的:
1、对于代价函数是凸函数的问题来说,用梯度下降法来求解是有全局最优解的,对于一些有局部最优解的cost fuction,初始化的条件很重要,如何选择也很重要,但往往没什么规则。
2、梯度下降法的迭代step选取很重要,若很小的话,收敛速度太慢,如果太大,容易错过最优解。对于多维空间的样本而言,很难通过高维空间的数据,比如高维的w和b来判断step的好坏,幸运的是可以通过lost值来判断step是大还是小:
1)如果lost是很缓慢的下降,说明step太小,可以适当调大;
2)如果lost很快的下降到一定值,并且基本不变,很有可能是step太大,lost在来回震荡;
3)如果lost比较合理的下降到一定值,且后续基本保持不变,则step应该比较合适。
3、为了加速收敛,可以让step一开始比较大,但随着迭代次数的增加慢慢减小,也可以采用随机梯度法。
4、当我们用一个模型,来回训练了多次,得到了多个最优参数时,如何通过一些数据来判断该模型是好还是坏,该如何改进呢?
主要的两个数据参考就是Error,Bias,Variance,简单来说:当一个模型n次训练得到的n个最优参数的模型,
1)这n个模型的Bias很大时,往往代表着模型不够复杂,训练数据不够多,属于underfitting;
2)这n个模型的Variance很大时,往往代表着模型太复杂,参数太多,属于overfitting,可以适当降低参数数量或者简化模型。

下面是用Tensorflow训练一个一次函数模型的实现:

1 #!/usr/bin/python                                                           
  2 #-*- coding:utf-8 -*-  
  3 ############################  
  4 #File Name: LR_test1.py
  5 #Author: yang
  6 #Mail: milkyang2008@126.com  
  7 #Created Time: 2017-06-27 22:51:20
  8 ############################
  9  
 10 # import tensorflow lib
 11 import numpy as np
 12 import random
 13 #sample point
 14 x_sap = np.arange(-5,5,0.5)
 15 y_sap = [4*i + 3 for i in x_sap]
 16 x_a = [b1*(random.randint(90,120))/100 for b1 in x_sap]
 17 y_a = [b2*(random.randint(90,120))/100 for b2 in y_sap]
 18 #import matplotlib.pyplot as plt
 19 
 20 import tensorflow as tf
 21 #define variable
 22 w = tf.Variable(tf.zeros([1]))
 23 b = tf.Variable(tf.zeros([1]))
 24 x = tf.placeholder(tf.float32)
 25 y_ = tf.placeholder(tf.float32)
 26 
 27 y = w * x + b
 28 
 29 STEPS = 30000
 30 step = 0.001
 31 
 32 #sample point
 33 #x_sap = np.arange(-5,5,0.5)
 34 #y_sap = [4*i + 3 for i in x]
 35 #x_a = [b1*(random.randint(90,120))/100 for b1 in x]
 36 #y_a = [b2*(random.randint(90,120))/100 for b2 in y]
 37 
 38 #cost_fuction
 39 lost = tf.reduce_mean(tf.square(y_-y))
 40 optimizer = tf.train.GradientDescentOptimizer(step)
 41 train_step = optimizer.minimize(lost)
 42 
 43 init_op = tf.initialize_all_variables()
 44 
 45 with tf.Session() as sess:
 46     sess.run(init_op)
 47 
 48     for i in range(STEPS):
 49         feed = {x: x_a, y_: y_a}
 50         sess.run(train_step, feed_dict=feed)
 51         if i % 100 ==0 :
 52             print("After %d interation:" %i)
 53             print("W: %f" % sess.run(w))
 54             print("b: %f" % sess.run(b))
 55             print("lost: %f" % sess.run(lost, feed_dict=feed))
 56

真是模型为y = 4*x + 3;训练数据还加上了随机噪声;训练出的结果:经过30000次迭代,训练出的模型为:y = 3.98*x + 3.19;比较接近真实模型了。

After 29200 interation:
W: 3.980329
b: 3.189958
lost: 2.088752
After 29300 interation:
W: 3.980333
b: 3.190148
lost: 2.088748
After 29400 interation:
W: 3.980337
b: 3.190339
lost: 2.088745
After 29500 interation:
W: 3.980341
b: 3.190530
lost: 2.088742
After 29600 interation:
W: 3.980345
b: 3.190721
lost: 2.088738
After 29700 interation:
W: 3.980348
b: 3.190897
lost: 2.088736
After 29800 interation:
W: 3.980352
b: 3.191064
lost: 2.088732
After 29900 interation:
W: 3.980355
b: 3.191231
lost: 2.088729
正文完
请博主喝杯咖啡吧!
post-qrcode
 
admin
版权声明:本站原创文章,由 admin 2017-06-28发表,共计2900字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(2 条评论)
验证码
admin 博主
2017-06-29 12:39:23 回复

:smile: 厉害了我滴哥,深度学习框架玩起来了

 Windows  Chrome  中国广东省深圳市电信
    gegey 评论达人 LV.1
    2017-06-29 13:12:36 回复

    @admin 哈哈,争取向站长看齐啊

     iPhone  AppleWebKit  中国广东省深圳市联通