TensorFlow 实现一元线性回归模型

来源:互联网 发布:康佳网络电视售后电话 编辑:程序博客网 时间:2024/04/29 18:31

**

TensorFlow 实现一元线性回归模型

一元线性回归即是将N个随机样本点拟合到一条直线上


样本点:

x y 3.3 1.7 4.4 2.7 5.5 2.1 6.71 3.2 6.93 1.69 4.168 1.573 9.779 3.366 6.182 2.596 … …

样本点可表示为:

(X,Y)N=[(x1,y1),(x2,y2)...(xn,yn)]


我需要拟合出的直线方程可以表示为:

y^=f(x)=Wx+b

可以通过最小二乘法来求得拟合直线的值,拟合过程就是使得MSEloss的最小值。拟合过程就转化成求以下函数的极值问题。

MSEloss=minw,b12Nn=1N(y^yn)2

W就可表示为:

W=(XTX)1Y

上式需要用所有样本来训练,训练过程也可采用另一种方式,使用随机梯度下降法求得极值,则不用一次入所有样本用于训练,步骤如下:
step0: 给定W ,b初始值,W0,b0,
step1: 随机选取一个样本 (xn,yn)
step2: 将样本和Wt1,bt1代入 y^n=ft1(xn)=Wt1xn+bt1确定y^n,
step3: 求得Wt=Wt1+α(y^nyn)xn,
step4: 求得bt=ynWtxn,
循环迭代1-4步,使得MSEloss的值小于某个值退出循环。


TensorFlow程序设计:

inference: 先确定线性拟合直线表达式
loss: 制定损失判定标准
train: 将损失函数代入梯度下降节点,n次迭代,获得W,b的权值
evaluate:将权值作用于测试点,计算损失。损失越小,模型越精确。

代码

import osimport tensorflow as tfimport numpy as npimport matplotlib.pyplot as plt#os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'train_X = np.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,                         7.042,10.791,5.313,7.997,5.654,9.27,3.1])train_Y = np.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,                         2.827,3.465,1.65,2.904,2.42,2.94,1.3])plt.plot(train_X,train_Y,'ro',label='train points')plt.legend()plt.show()with tf.Graph().as_default():    #input    with tf.name_scope('Input'):        X = tf.placeholder(tf.float32 , name="X")        Y_true = tf.placeholder(tf.float32 , name="Y_true" )    with tf.name_scope('Inference'):        #模型参数变量        W = tf.Variable(tf.zeros([1]),name="Weight")        b = tf.Variable(tf.zeros([1]),name="Bias")        #inference :Y= WX + b        Y_pre = tf.add(tf.multiply(X,W),b)    with tf.name_scope('Loss'):    #loss :        Trainloss = tf.reduce_mean(tf.pow(Y_true - Y_pre,2))/2    with tf.name_scope('Train'):    #train:        optimizer = tf.train.GradientDescentOptimizer(learning_rate = 0.01)        TrainOp = optimizer.minimize(Trainloss)    with tf.name_scope('Evaluate'):    #evaluate:        Evaloss = tf.reduce_mean(tf.pow(Y_true - Y_pre,2))/2    InitOp = tf.global_variables_initializer()    writer = tf.summary.FileWriter(logdir='logs_1',graph=tf.get_default_graph())    writer.close()    print("start session  run graph, train start")    with tf.Session() as sess:        sess.run(InitOp)        for step in range(1000):            #for tx,ty in zip(train_X,train_Y):               # trainOp,trainloss,t_w,t_b = sess.run([TrainOp,Trainloss,W,b],feed_dict={X:tx,Y_true:ty})            trainOp,trainloss,t_w,t_b = sess.run([TrainOp,Trainloss,W,b],feed_dict={X:train_X,Y_true:train_Y})            if((step + 1)%5 == 0):                print("step:", (step+1),"train loss:","{:.9f}".format(trainloss),"W=",t_w,"b=",t_b)        print("train end")        W,b = sess.run([W,b])        print("para mode: W=",W," b=",b)        plt.plot(train_X,train_Y,'ro',label='train points')        plt.plot(train_X, W * train_X + b,label="Fitted Line")        plt.legend()        plt.show()   
原创粉丝点击