tensorflow实现线形回归

  回归是基于已有的数据对新的数据进行预测,除了标准的线形回归,还会有戴明回归、lasso回归、岭回归、弹性网络回归、逻辑回归等,具体的定义和差别会在下文实现中体现。

  tensorflow作为流行的机器学习框架,有诸多现成的API可以调用,在线形回归的实现中,使用这些API可以非常便捷的实现。

  

  1、首先准备数据 ,这里采用sklearn的数据iris数据集

  from sklearn import datasets

  import numpy as np

  import tensorflow as tf

  x_vals=np.array([x[3] for x in iris.data])

  y_vals=np.array([y[0] for y in iris.data])

  

  2、声明训练参数

  learning_rate=0.05

  batch_size=25

  x_data=tf.placeholder(shape=[None,1],dtype=tf.float32)

  y_target=tf.placeholder(shape=[None,1],dtype=tf.float32)

  A=tf.Variable(tf.random_normal(shape=[1,1]))

  b=tf.Variable(tf.random_normal(shape=[1,1]))

  

  3、配置模型

  model_output=tf.add(tf.matmul(x_data,A),b)

  

  4、声明损失函数

  #这里使用L2正则损失函数

  loss=tf.reduce_mean(tf.square(y_target-model_output))

  #这里使用L1正则损失函数

  loss=tf.reduce_mean(tf.abs(y_target-model_output))

  #这里是戴明回归的损失函数

  demming_numerator=tf.abs(tf.sub(y_target,tf.add(tf.matmul(x_data,A),b)))

  demming_denominator=tf.sqrt(tf.add(tf.square(A),1))

  loss=tf.reduce_mean(tf.truediv(demming_numerator,demming_denominator))

  #lasso回归,增加损失函数

  lasso_param=tf.constant(0.9)

  heavyside_step=tf.truediv(1,tf.add(1,tf.exp(tf.mul(-100,tf.sub(A,lasso_param)))))

  regularization_param=tf.mul(heavyside_step,0.9)

  loss=tf.add(tf.reduce_mean(tf.square(y_target-model_output)),regularization_param)

  #岭回归算法,增加了L2正则项

  ridge_param=tf.constant(1)

  ridge_loss=tf.reduce_mean(tf.square(A))

  loss=tf.expand_dims(tf.add(tf.reduce_mean(tf.square(y_target-model_output)),tf.mul(ridge_param,ridge_loss)),0) 

  弹性网络回归,增加了L1和L2正则项

  elastic_param1=tf.constant(1)

  elastic_param2=tf.constant(1)

  l1_a_loss=tf.reduce_mean(tf.abs(A))

  l2_a_loss=tf.reduce_mean(tf.square(A))

  e1_term=tf.mul(elastic_param1,l1_a_loss)

  e2_term=tf.mul(elastic_param2,l2_a_loss)

  loss=tf.expand_dims(tf.add(tf.add(tf.reduce_mean(tf.square(y_target-model_output)),e1_term),e2_term),0)

    

  5、运行图

  init=tf.global_variables_initializer()

  sess.run(init)

 

  6、训练图

  设置优化因子

  my_opt=tf.train.GradientDescentOptimizer(learning_rate)

  train_step=my_opt.minimize(loss)

  for i in range(steps):

    rand_index=np.random.choice(len(x_vals),size=batch_size)

    rand_x=np.transpose([x_vals[rand_index]])

    rand_y=np.transpose([y_vals[rand_index]])

    sess.run(train_step,feed_dict={x_data:rand_x,y_target:rand_y})

    temp_loss=sess.run(loss,feed_dict={x_data:rand_x,y_target:rand_y})

代码参考书籍《tensorflow机器学习实战指南》

posted @ 2019-03-02 23:31  dob  阅读(122)  评论(0编辑  收藏  举报