• 为了保证你在浏览本网站时有着更好的体验,建议使用类似Chrome、Firefox之类的浏览器~~
    • 如果你喜欢本站的内容何不Ctrl+D收藏一下呢,与大家一起分享各种编程知识~
    • 本网站研究机器学习、计算机视觉、模式识别~当然不局限于此,生命在于折腾,何不年轻时多折腾一下

Tensorflow for Line Regression

Qt admin 2年前 (2017-06-28) 1276次浏览 2个评论 扫描二维码

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

假设我们真实的模型是: 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

Deeplearn, 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明Tensorflow for Line Regression
喜欢 (1)
admin
关于作者:
互联网行业码农一枚/业余铲屎官/数码影音爱好者/二次元

您必须 登录 才能发表评论!

(2)个小伙伴在吐槽
  1. :smile: 厉害了我滴哥,深度学习框架玩起来了
    admin2017-06-29 12:39