Tensorflow实现线性回归模型

共分三部分:1.线性回归理论部分

                      2.代码实现

                      3.课后拓展

一.线性回归概念及基本原理

概念:是一种统计方法,来确定两种或两种以上变量间相互依赖的定量关系。

一元线性回归:y = w * x + b

任务:根据训练数据预测一元线性回归模型,并用验证数据验证预测的一元线性回归模型是否正确。

(x,y)

1  3

2  5.1

3  6.99

y = w * x + b;

1.假设一个线性回归模型

h(x) = 3 * x + 5;

2.判断这假设线性回归模型对不对

3 * 1 + 5 = 8      3

代价函数:均方差

((8 - 3)的平方 + (11 - 5.1)的平方 + (14 - 6.99)的平方 )/ 2*3

3.调整这个模型参数

h(x) = 2.8 * x +4;

h(x) = 2.6 * x + 3;

...

...

h(x) = 2.0 * x + 1;

求最优解算法:

梯度下降:

4.得到符合要求的线性回归模型

h(x) = 2.0 * x +1;

5.用验证数据验证训练出来的模型对不对

总结:

1.获取训练数据和验证数据                一堆(x,y)组成的训练点

2.假设一个一元线性回归函数             a = w * x +b

3.判断函数的好坏                               代价函数

4.调整假设的一元线性回归函数          梯度下降算法  学习率

5.得到最优的预测一元线性回归函数   y = w * x + b

6.根据验证数据验证预测函数是否符合要求

二.线性回归使用到的tensorflow语法

import tensorflow as tf

# -----准备阶段-----

a = tf.Variable( [ [2,3] ] ) #生成一行两列的矩阵
b = tf.Variable( [ [4] , [2] ] ) #生成两行一列的矩阵
c = tf.matmul(a,b) # 求a,b的乘积

print('c的值:',c)

#创建0填充的矩阵
d = tf.zeros([2,4]) #生成两行四列的全0矩阵

#平均值
f = tf.reduce.mean([1,3])

#平方
e = tf.square([2])

#均匀分布的随机数
g = tf.random.uniform([1,10]) #生成一行十列服从均匀分布的随机数。

# -----执行阶段-----

with tf.Session() as sess:
    #初始化所有变量
    init = tf.global_variables_initializer()
    sess.run(init)

    print('a:',a)
    print('a = ',sess.run(a))
    print('c = ',sess.run(c))
    print('d = ',sess.run(d))
    print('e = ',sess.run(e))
    print('f = ',sess.run(f))
    print('g = ',sess.run(g))

三.线性回归的代码实现

#一元的线性回归模型的训练
#1.通过训练数据,推测出线性回归函数(y = w * x + b)中w和b的值
#2.通过验证数据,验证得到的函数是否符合预期

#引入Tensorflow
import tensorflow as tf
#引入绘图表
import matplotlib.pyplot as plt
#引入数据模块
import testData as td

#1.获取训练数据
#testData
#get_train_data 获取训练数据 参数:data_length(获取数据的个数)
#返回值:二维数组 [0] 代表x(横坐标) [1]代表(y纵坐标)
#get_validate_data 获取验证数据 参数:data_length(获取数据的个数)
#返回值:二维数组 [0] 代表x(横坐标) [1]代表(y纵坐标)

trainData = td.get_train_data(200)
trainx = [v[0] for v in trainData]
trainy = [v[1] for v in trainData]

#2.构造预测的线性回归函数 y = w * x + b
w = tf.Variable(tf.random_uniform([1]))
b = tf.Variable(tf.zeros([1]))
y = w * trainx + b

#3.判断假设函数的好坏
#代价函数
cost = tf.reduce_mean(tf.square(y-trainy))

#4.调整假设函数
#梯度下降算法找最优解
optimizer = tf.train.GradientDescentOptimizer(0.08)
train = optimizer.minimize(cost)

with tf.Session() as sess:
    #初始化所有变量值
    init = tf.global_variables_initializer()
    sess.run(init)

    #初始化的W和b的值
    print("cost=",sess.run(cost),"w=",sess.run(w),"b=",sess.run(b))

    #循环运行
    for k in range(500):
        sess.run(train)
        #输出训练好的w和b
        print("cost=",sess.run(cost),"w=",sess.run(w),"b=",sess.run(b))
    print("执行完成")
    
    #构造图形结构
    plt.plot(trainx,trainy,'ro',label='train data')
    plt.plot(trainx,sess.run(y),label='train result')
    plt.legend()
    plt.show()
    

   关于testData模块 (testData.py):

#引入Numpy
import numpy as np

#构造一个线性回归函数
# y = w * x + b
w = 0.3
b = 0.8

#生成测试数据
def get_train_data(data_lenght):
    train_arr = []
    for i in range(data_lenght):
        tr_x = np.random.uniform(0.0,1.0)
        tr_y = tr_x * w + b + np.random.uniform(-0.02,0.02)
        train_arr.append([tr_x,tr_y])

    return train_arr

#生成校验数据
def get_validate_data(data_lenght):
    validate_arr = []
    for i in range(data_lenght):
        va_x = np.random.uniform(0.0,1.0)
        va_y = va_x * w + b + np.random.uniform(-0.02,0.02)
    
    return validate_arr

测试模型:

import matplotlib.pyplot as plt
#引入测试数据
import testData as pt

validateData = pt.get_validate_data(40)
va_x = [v[0] for v in validateData]
va_y = [v[1] for v in validateData]

#训练结果
y = []
for x in va_x:
    y.append( x * 0.3 + 0.8 )


#构造图形结构
plt.plot(va_x,va_y,'ro',label='validate Data')
plt.plot(va_x, y, label='train result')
plt.legend()
plt.show()

课后拓展:

1.随机梯度下降

    方式:每次拿一个训练点进行训练

    优点:大数据下训练更快    缺点:得到的可能不是全局的最优解,只是局部的最优解。

2.批量梯度下降

    方式:每次拿所有的训练点进行计算

    优点:可以得到全局最优解    缺点:数据量特别大的时候,训练会很慢。    

猜你喜欢

转载自blog.csdn.net/qq_40108803/article/details/82983105