线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。其表达形式为y = w’x+e,e为误差服从均值为0的正态分布。而在TensorFlow中以及机械学习之中,同样是十分重要的一种方法。下面给了一种初学者向的思路以及实现办法。
import matplotlib.pyplot as plt
import tensorflow as tf
import numpy as np
#使用numpy生成2000个随机点
x_data=np.linspace(-0.5,0.5,2000)[:,np.newaxis]#在正负0.5中产生200点,并且增加一个维度,得到一个200行一列的数据,等间距生成数据
noise=np.random.normal(0,0.02,x_data.shape)#与x_data形状一样的随机数据(“形状”类似于矩阵)
y_data=np.square(x_data)+(noise)
#定义两个placeholder
x=tf.placeholder(tf.float32,[None,1])
y=tf.placeholder(tf.float32,[None,1])
#定义神经网络中间层 #(N*1)*(1*10)=N*10 神经元是1*1的有十个,在N*1的输入上卷积,1个神经元输出N*1,第二层(N*10)*(0*1)=N*1,神经元是10*1的有十个
Weights_L1=tf.Variable(tf.random_normal([1,10]))#权值连接着输入层与中间层,1个输入即有一个神经元,10个神经元所以是10
biases_L1=tf.Variable(tf.zeros([1,10]))#偏值,初始化为0,{1,10}定义同上
Wx_plus_b_L1=tf.matmul(x,Weights_L1)+biases_L1#计算信号总数,矩阵乘法:输入值X乘以权值加上偏值
L1=tf.nn.tanh(Wx_plus_b_L1)#激活函数,双曲正切函数
#输出层
Weights_L2=tf.Variable(tf.random_normal([10,1]))#输入10个神经元,输出一个神经元
biases_L2=tf.Variable(tf.zeros([1,1]))#输出层只有一个,故只有一个
Wx_plus_b_L2=tf.matmul(L1,Weights_L2)+biases_L2#输出层的输入相当于输入层的输出
prediction=tf.nn.tanh(Wx_plus_b_L2)
#二次代价函数
loss=tf.reduce_mean(tf.square(y-prediction))
optimizer=tf.train.GradientDescentOptimizer(0.02)
train=optimizer.minimize(loss)#梯度下降法
#初始化全局变量
init=tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(6000):
sess.run(train,feed_dict={x:x_data,y:y_data})#传入样本点
prediction_value=sess.run(prediction,feed_dict={x:x_data})#得到预测值
#用画图的方法看预测结果
plt.figure()
plt.scatter(x_data,y_data)
plt.plot(x_data,prediction_value,'r-',lw=5)
plt.show()
而以上代码实验下来的效果图如下↓↓↓
可以看到,生成的红色曲线还是大致和随机点的走向分布相符合,但是还是有偏差之处。尤其是刚开始数据较少之处。这就需要我们代码精细化并且升级算法。