Tensorflow实现线性回归

本文介绍使用TensorFlow实现线性回归的过程,包括线性回归的理论基础、数学公式推导及具体代码实现。通过本教程,读者可以了解如何利用TensorFlow搭建线性回归模型并进行训练。

Tensorflow实现线性回归

线性回归理论以及公式:

目标公式:

y=w1x1+w2x2++wnxn+by=w1x1+w2x2+⋯+wnxn+b

当有m组训练公式的时候,输入数据写成矩阵的形式:

X=x(1)1x(2)1x(m)1x(1)2x(2)2x(m)2x(1)nx(2)nx(m)nX=[x1(1)x2(1)⋯xn(1)x1(2)x2(2)⋯xn(2)⋮⋮⋱⋮x1(m)x2(m)⋯xn(m)]
权重写成权重向量:

w=[w1,w2,,wn]Tw=[w1,w2,⋯,wn]T

偏置项向量:b=[b,b,,b]Tn×1b=[b,b,⋯,b]n×1T
Y=Xw+bY=Xw+b

一般来说,为了加快训练速度,梯度下降的时候,是以向量为单位,对向量进行求导。给出线性回归的使用到的求导公式:
s(xAs)TW(xAs)=2ATW(xAs)∂∂s(x−As)TW(x−As)=−2ATW(x−As)

其中:WW是对称矩阵,小写的粗体是向量。公式来自于Matrix Cookbook这个PDF文档。
给出损失函数的矩阵化定义:
J(w,b)=(yXwb)TIm×m(yXwb)J(w,b)=(y−Xw−b)TIm×m(y−Xw−b)

Im×mIm×m是m阶的单位矩阵,这里只是为了更好的理解求导过程,单位矩阵肯定是对称矩阵,实际可以不加。
根据求导公式:
J(w,b)w=2XT(ybXw)∂J(w,b)∂w=−2XT(y−b−Xw)

J(w,b)b=2(yXwb)∂J(w,b)∂b=−2(y−Xw−b)

梯度下降的更新过程:
w=wαJ(w,b)ww=w−α∂J(w,b)∂w

b=bαJ(w,b)bb=b−α∂J(w,b)∂b

其中αα是学习速率。

tensorflow实现:

实际使用tensorflow的过程中,可以使用库函数实现自动化微分求导的过程,不必手写。

import tensorflow as tf
import numpy as np
import matplotlib.pyplot as plt

# 输入数据
x_data = np.random.normal(size=(100, 3))
w_real = np.matrix([3.0, 5.1, 1.7]).T
b_real = 0.2
y_data = np.matmul(x_data, w_real) + b_real * np.ones((100, 1))

# 占位符,输送数据
x = tf.placeholder(dtype=tf.float32, shape=[None, 3], name="x_train")
y_true = tf.placeholder(dtype=tf.float32, shape=None, name="y_true")

with tf.name_scope("inference") as scope:
    w = tf.Variable(tf.zeros([3, 1]))
    # 不显示地声明形状,形状会自适应
    b = tf.Variable(0.0)
    y_pred = tf.matmul(x, w) + b

with tf.name_scope("loss") as scope:
    # 损失函数 
    loss = tf.reduce_mean(1 / 2 * tf.square(y_pred - y_true))

with tf.name_scope("train") as scope:
    # 训练,使用Adam算法优化,学习步长0.1
    train = tf.train.AdamOptimizer(0.1).minimize(loss)

# 用于绘图
x_axis = []
y_axis = []

with tf.Session() as sess:
    sess.run(tf.global_variables_initializer())
    # 执行1000次训练
    for i in range(1000):
        sess.run(train, feed_dict={x: x_data, y_true: y_data})
        x_axis.append(i)
        # 这里也需要feed数据
        y_axis.append(sess.run(loss, feed_dict={x: x_data, y_true: y_data}))
    print("loss:", sess.run(loss, feed_dict={x: x_data, y_true: y_data}))
    print(sess.run(w), sess.run(b))
    tf.summary.FileWriter("./graph", sess.graph)
    plt.plot(x_axis, y_axis)
    plt.show()

结果输出:
loss: 4.579861e-13
3.0000002,5.100001,1.7
0.19999987
损失函数图片:
这里写图片描述
tensorboard图片:
这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值