一、线性回归原理
1.构造模型
y = w1x1+w2x2…+b
2.构建损失函数
均方误差
3.优化损失
梯度下降:
使用梯度下降优化损失,当损失最小时候所对应的权重和偏置就是我们想要的模型参数
二、设计方案
1.准备数据
假定随机指点100个点,只有一个特征。x和y之间的关系满足y=kx+b
x = (100,1)
真实的y_true = (100,1)
数据分布满足y = 0.8*x+0.7
x(100,1) * weight(1,1) + bias(1,1) = y_true(100,1)
预测y_predict = tf.matmul(x,weight) + bias
2.构造损失函数
error = tf.reduce_mean(tf.square(y_predict-y_true))
3.优化损失
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.01).minimize(error)
最后在会话中不断迭代optimizer当损失最小时候获取模型参数(权重weight和偏置bias)
三、代码实现
import tensorflow as tf
def linear_regression():
#1.准备数据
X= tf.random_normal(shape=[100.1])
y_true = tf.matmul(X,[[0.8]])+0.7
#构造权重weight和偏置 使用变量来创建
weight = tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
bias = tf.Variable(initial_value=tf.random_normal(shape=[1,1]))
y_predict = tf.matmul(X,weight)+bias
#2.构造损失函数
error = tf.reduce_mean(tf.square(y_predict-y_true))
#3.优化损失
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1).minimize(error)
#初始化变量
tf.global_variables_initializer()
with tf.Session() as sess:
#运行初始化变量
sess.run(init)
print('训练前查看模型参数:权重:%f,偏置:%f,损失:%f'%(weight.eval(),bias.eval(),error.eval()))
#训练
for i in range(100):
sess.run(otimizer)
print('训练%d后查看模型参数:权重:%f,偏置:%f,损失:%f'% ((i+1),weight.eval(),bias.eval(),error.eval()))
if __name__=='__main__':
linear_regression()
四、总结
学习率 | 训练次数 | 权重 | 偏置 | 损失 |
---|---|---|---|---|
0.01 | 1000 | 0.799999 | 0.699999 | 0.00000 |
0.1 | 100 | 0.79838 | 0.699569 | 0.00000 |
5 | 100 | nan | nan | nan |
显然,
在学习率为0.01时,训练398次后,损失达到0,权重稳定在0.8,偏置稳定在0.7;
在学习率为0.1时,训练33次后,损失达到0,权重稳定在0.8,偏置稳定在0.7;
在学习率为5时,出现训练爆炸
特征没做好,参数调到老。学习率不是越高越好,调参要根据实际情况。