您的位置:首页 > 其它

TensorFlow实战1:实现单变量线性回归

2017-11-15 16:55 411 查看
最近在学习TensorFlow,这款由Google开源的深度学习框架在不到两年的时间里取得了巨大的发展,在GitHub上面的活跃度也远超其他深度学习框架。学习TensorFlow对于初学者而言是一个非常不错的选择。下面是我将用TensorFlow实现机器学习算法当中的线性回归的小例子,我所在的运行环境是在jupyter notebook上面进行的,也可以用其他的一些运行环境。

接下来是实现线性回归的步骤和代码:

1、数据准备

实际的数据大家可以通过pandas等package读入,也可以使用自带的Boston House Price数据集,这里为了简单,我们自己手造一点数据集。

%matplotlib inline
#上面一行是将图形嵌入到jupyter notebook中
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt
plt.rcParams["figure.figsize"] = (14,8)   #作出长14,宽8的图


n_observations = 100   #制作100个点
xs = np.linspace(-3,3,n_observations)   #横轴在(-3,3)区间中
ys = np.sin(xs) + np.random.uniform(-0.5,0.5,n_observations)   #纵轴在sin()函数中,取[-0.5,0.5)之间的随机值
plt.scatter(xs,ys)      #绘制散点图
plt.show()


上面的代码就通过自己手动的构建了基于正弦函数的100个散点随机数据。下面试运行代码所得的图形:



2、准备好placeholder,开好容器来装数据

X = tf.placeholder(tf.float32,name = 'X')
Y = tf.placeholder(tf.float32,name = 'Y')


3、初始化参数/权重和偏置

W = tf.Variable(tf.random_normal([1]),name = 'weight')   #从正态分布中输出一个值
b = tf.Variable(tf.random_normal([1]),name = 'bias')


4、计算预测结果

y_pred = tf.add(tf.multiply(X,W),b)    #X和W相点乘,再加上b


5、计算损失函数

loss = tf.square(Y - y_pred,name = 'loss')    #两个向量相减之后求每个点的平方之和


6、初始化optimizer

learning_rate = 0.01
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(loss)
#最小化损失函数,对于此时的凸函数才能用GD,因为局部最优解就是全局最优解,但是如果不是凸函数,则不能用GD,否则可能会最终停留在局部最优解


7.指定迭代次数,并在session里执行graph

n_samples = xs.shape[0]    #取xs的第一维长度,此处即为变量个数
init = tf.global_variables_initializer()   #对所有变量进行初始化
with tf.Session() as sess:
sess.run(init)

writer = tf.summary.FileWriter('./graphs/linear_reg', sess.graph)
#将收集的变量写入日志文件

#训练模型
for i in range(50):
total_loss = 0    #设定初始的损失值为0
for x,y in zip(xs,ys):      #zip:将两个列表中的对应元素分别取一个出来,形成一个元组
#通过feed_dict把数据灌进去
_,l = sess.run([optimizer,loss],feed_dict = {X:x,Y:y})
total_loss += l   #将所有损失值相加

if i%5 ==0:
print('Epoch {0}: {1}'.format(i, total_loss/n_samples))

#关闭writer
writer.close()

#取出W和b的值
W,b = sess.run([W,b])


下面是迭代运行结果:



打印参数值:

print(W,b)
#获取W和b的值
print("W:"+str(W[0]))
print("b:"+str(b[0]))




画出拟合图形:

plt.plot(xs, ys, 'bo', label='Real data')
plt.plot(xs, xs * W + b, 'r', label='Predicted data')
plt.legend()     #显示图例
plt.show()


下图为运行得出的图形:



由于此例子中用来拟合这些正弦散点图的是只有一个变量的线性直线,故无论将迭代次数增到到多少,都不能较好的拟合,此时反应的是欠拟合现象。

后面一篇文章我会来用多变量线性回归来拟合这些数据。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: