6、线性回归模型原理与实现(一)——简单实现流程


 

(1)线性回归通过权重与特征的乘积相加,即y = w1*x1+w2x2+....wn*x+ bias

  ①准备好已知的特征值x和目标值y (如y = x * 0.7 + 0.8,训练的目的是为了找到权重0.7和bias0.8)

  ②建立模型,随机初始化准备权重w和偏置b,得到预测值y_predict

  ③y_predict  = x * w + b  (这里的权重和特征的乘积涉及了矩阵的运算,模型的参数必须用变量定义)

    矩阵运算API: tf.matmul (x , w)

    平方API:tf.square(error)

    均值API:tf.reduce_mean(error)

  ④求损失函数,误差

    均方误差 loss = [ (y1 - y1')2+.....+(y- yn')2] /n

  ⑤通过梯度下降去优化损失函数,(tf中自带,需要自己指定学习率) 

    tf.train.GradientDescentOptimizer(learning _rate)  梯度下降优化
     learning_ rate: 学习率,一般为
     method: minimiz&(loss)
     return: 梯度下降op

(2)分步代码实现

 ①准备数据,特征值x,目标值y,这里假设是100个样本,1个特征,即[100, 1], 目标值y是100个值,即[100]

1 x = tf.random_normal([100,1], mean=1.75, stddev=0.5, name="x_data")  #自己定义一个假的数据集
2 y_ture = tf.matmul(x, [[0.7]]) + 0.8    #矩阵相乘,w值必须设置成相应的维数,这里是2维

   ②建立线性回归模型,1个特征-->1个权重值, 一个偏置 bias,即y = x * w +b ,(如果有多个特征,需要建立对应的模型)

  • 随机给一个权重w和偏置值b
1 weights = tf.Variable(tf.random_normal([1,1],mean=0.0, stddev=1.0), name="w") #模型中的参数要用变量进行定义,在括号里面给一个随机的值,让模型从该值开始优化
2 bias = tf.Variable(0.0, name="b") #定义变量
3 y_predict = tf.matmul(x, weights) + bias #预测值
  • 然后计算损失函数loss,均方误差
1 loss = tf.reduce_mean(tf.square(y_ture - y_predict))   #平方之后,相加再除以总数,error = y_ture - y_predict
  • 利用梯度下降在当前状态下优化损失函数,梯度下降优化损失op (学习率: learning_rate)
1 train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)   #最小化损失 0.1是学习率(步长),自己调
  • 然后需要定义一个初始化的op,对所有的变量进行初始化,这样才能在会话中进行打印
1 init_op = tf.global_variables_initializer()
  • 建立会话,运行op
 1 with tf.Session() as sess:
 2     #初始化变量
 3     sess.run(init_op)
 4     # 打印优化前的初始化值
 5     print("随机初始化的参数,权重为: %f, 偏置为: %f"%(weights.eval(),bias.eval()))
 6     # 运行优化
 7     for i in range(300):
 8         sess.run(train_op)
 9         print(("第%s次优化后的参数,权重为: %f, 偏置为: %f" % (i, weights.eval(), bias.eval())))
10     #权重weights和偏置值bias是一个op,需要run或者使用eval

(3)完整代码

 1 import tensorflow as tf
 2 import os
 3 os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2' #去掉警告,将警告级别提升
 4 # 1. 准备数据 [X, 特征值] 这里假设是100个样本,1个特征,即[100, 1],  目标值y是100个值,即[100]
 5 x = tf.random_normal([100,1], mean=1.75, stddev=0.5, name="x_data")  #自己定义一个假的数据集
 6 y_ture = tf.matmul(x, [[0.7]]) + 0.8    #矩阵相乘,w值必须设置成相应的维数,这里是2维
 7 
 8 # 2. 建立线性回归模型 1个特征-->1个权重值, 一个偏置 y = x * w +b
 9 weights = tf.Variable(tf.random_normal([1,1],mean=0.0, stddev=1.0), name="w") #模型中的参数要用变量进行定义,在括号里面给一个随机的值,让模型从该值开始优化
10 bias = tf.Variable(0.0, name="b") #定义变量
11 y_predict = tf.matmul(x, weights) + bias #预测值
12 
13 # 3. 建立计算损失函数,均方误差
14 loss = tf.reduce_mean(tf.square(y_ture - y_predict))
15 
16 # 4. 梯度下降优化损失op (学习率: learning_rate)
17 train_op = tf.train.GradientDescentOptimizer(0.1).minimize(loss)
18 
19 # 定义一个初始化的op,对所有的变量进行初始化,这样才能在会话中进行打印
20 init_op = tf.global_variables_initializer()
21 
22 #通过会话运行程序(op)
23 with tf.Session() as sess:
24     #初始化变量
25     sess.run(init_op)
26     # 打印优化前的初始化值
27     print("随机初始化的参数,权重为: %f, 偏置为: %f"%(weights.eval(),bias.eval()))
28     # 运行优化
29     for i in range(300):
30         sess.run(train_op)
31         print(("第%s次优化后的参数,权重为: %f, 偏置为: %f" % (i, weights.eval(), bias.eval())))
32     #权重weights和偏置值bias是一个op,需要run或者使用eval

 

输出:

随机初始化的参数,权重为: 0.518298, 偏置为: 0.000000
第0次优化后的参数,权重为: 0.933197, 偏置为: 0.225464
第1次优化后的参数,权重为: 0.976979, 偏置为: 0.257402
第2次优化后的参数,权重为: 0.979285, 偏置为: 0.266130
第3次优化后的参数,权重为: 0.985607, 偏置为: 0.278494
第4次优化后的参数,权重为: 0.977851, 偏置为: 0.283757
                         .
                         .
                         .

第295次优化后的参数,权重为: 0.708675, 偏置为: 0.783767
第296次优化后的参数,权重为: 0.708562, 偏置为: 0.783985
第297次优化后的参数,权重为: 0.708459, 偏置为: 0.784152
第298次优化后的参数,权重为: 0.708406, 偏置为: 0.784446
第299次优化后的参数,权重为: 0.708426, 偏置为: 0.784669

 可以发现在300次训练之后的结果为w = 0.708426 ,b = 0.784669,理论值为0.7和0.8,我们可以增加迭代次数,或者改变步长来进行优化

posted on 2019-11-13 16:31  Luaser  阅读(1058)  评论(0编辑  收藏  举报