自定义w与b
用TensorFlow去学习并且准确预测出w和b
线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = wx+b+e,e为误差服从均值为0的正态分布。
回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。
自定义w和b
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
num_points=1000
vectors_set=[]
for i in range(num_points):
x1=np.random.normal(0.0,0.55)
y1=x1*0.1+0.3+np.random.normal(0.0,0.03)
vectors_set.append([x1,y1])
x_data=[v[0] for v in vectors_set]
y_data=[v[1] for v in vectors_set]
plt.scatter(x_data,y_data,c='r')
plt.show()
运行结果如图:
用TensorFlow去学习并且准确预测出w和b
接着我们用梯度下降法来实现w和b的预测
那么什么是梯度下降法
梯度下降法概念
在详细了解梯度下降的算法之前,我们先看看相关的一些概念。
步长(Learning rate):步长又称学习率,决定了在梯度下降迭代的过程中,每一步沿梯度负方向前进的长度。用上面下山的例子,步长就是在当前这一步所在位置沿着最陡峭最易下山的位置走的那一步的长度。
损失函数(loss function):为了评估模型拟合的好坏,通常用损失函数来度量拟合的程度。损失函数极小化,意味着拟合程度最好,对应的模型参数即为最优参数。在线性回归中,损失函数通常为样本输出和假设函数的差取平方。
梯度下降法调优
在梯度下降法中调优比较重要的是3个因素,步长、初始值、归一化。
步长:步长太小,收敛慢,步长太大,会远离最优解。所以需要从小到大,分别测试,选出一个最优解。
初始值:随机选取初始值,当损失函数是非凸函数时,找到的解可能是局部最优解,需要多测试几次,从局部最优解中选出最优解。当损失函数是凸函数时,得到的解就是最优解。
归一化:如果不归一化,会收敛的很慢,会形成之字的路线。
用TensorFlow里的梯度下降实现线性回归模型
用TensorFlow里的梯度下降法实现线性回归模型十分简单
直接贴代码:
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
num_points=1000
vectors_set=[]
for i in range(num_points):
x1=np.random.normal(0.0,0.55)
y1=x1*0.1+0.3+np.random.normal(0.0,0.03)
vectors_set.append([x1,y1])
x_data=[v[0] for v in vectors_set]
y_data=[v[1] for v in vectors_set]
W=tf.Variable(tf.random_uniform([1],-1.0,1.0),name='W')
b=tf.Variable(tf.zeros([1]),name='b')
y=W*x_data+b;
loss=tf.reduce_mean(tf.square(y-y_data),name='loss')
optimizer=tf.train.GradientDescentOptimizer(0.5)
train=optimizer.minimize(loss,name='train')
sess=tf.Session()
init=tf.global_variables_initializer()
sess.run(init)
print("W=",sess.run(W),"b=",sess.run(b),"loss=",sess.run(loss))
for step in range(20):
sess.run(train)
print("W=", sess.run(W), "b=", sess.run(b), "loss=", sess.run(loss))
运行结果如下:
我们发现:在20次迭代之后,w逐渐趋向我们的设定值0.1,而b逐渐趋向于设定值0.3
损失loss则不断减小,成功实现了回归模型
接下来用图形展示运行:
plt.scatter(x_data,y_data,c='r')
plt.plot(x_data,sess.run(W)*x_data+sess.run(b))
plt.show()
结果如下:
没错,直线拟合的很好。