内容简介:这是一次使用机器学习和人类学习的过程:如果觉得上图不好理解的话就再举一个栗子:
这是一次使用 《TensorFlow笔记(1)——TensorFlow中的相关基本概念》 中学习到的知识进行机器学习的实验,一来是为了理解机器学习大概是什么样的,另一方面也算是将之前学习到的一些知识活学活用。 本次实现的环境为:
- macOS Mojave 10.14.1
- python 3.7.0(pyenv)
- Tensorflow 1.12.0
- numpy 1.15.4
简单介绍下机器学习是什么
机器学习和人类学习的过程:
如果觉得上图不好理解的话就再举一个栗子:
假设你有个女朋友,她特别爱美。为了互相了解,你们每周末都会一起约会吃饭;已经约会有8周了,每周吃饭你女朋友都会比约定时间晚到10分钟-30分钟,所以你每次约会也会比约定时间晚10-30分钟,并且你总结了一个规律(如果约会前打电话她说从家走了,那么基本都是晚到30分钟左右,如果她说就快到了,那么基本会晚到10分钟),不过你女朋友后来迟到的时间从10、30分钟变成了15、45分钟,你也自己调整了约定时间后到达的时间。
根据上述栗子:chestnut:我们来类比下:
机器学习方法是计算机利用已有的数据(8次约会的经验),得出了某种模型(迟到的规律),并利用此模型预测未来(是否迟到)的一种方法。
Tensorflow的基础知识
基础知识在这里我就不多说了,详见 《TensorFlow笔记(1)——TensorFlow中的相关基本概念》
构建一个线性模型
先来说明下我们需要构建的这个简单的线性模型是什么东西:
假设我们有个线性模型(一元一次函数): y=0.1x+0.2
,我们知道这个线性模型长啥样,就是一条直线嘛,但是我现在想让机器也知道这条直线,该怎么做?还记得上面说的那个栗子吗,我们可以提供一系列类似 (x,y)
的数据,然后带入 y=k*x_data+b
,求出k和b的值之后,机器也就知道了这个线性模型长啥样了。
下面来更数学化一点的介绍:
给定一个大小为n的点集 ={( 1, 1),( 2, 2),…( , )} ,
线性模型的目标就是寻找一组 K 和 构成的直线 = K + ,
使得所有点的损失值 = 越小越好,因为 越小就表明预测值与真实值的差距越小。
因为如果我们找到了这么一组 K 和 ,我们就可以预测某一个 的 值。
这里我想多说几句,线性模型在实际应用中不一定能很好的预测 的值,这是因为实际的数据分布也许不是线性的,可能是二次、三次、圆形甚至无规则,所以判断什么时候能用线性模型很重要。只是因为我们在这里知道了这是线性模型才这么做的,真正构建模型的时候是需要相应的方法的。
代码解读
话不多少,分段来看代码:
- 导入相应的 python 包,这里我们使用了tensorflow和numpy
# tensorflow简单示例 import tensorflow as tf import numpy as np 复制代码
- 使用numpy生成1000个随机点,关于numpy的使用,可以查看我的numpy系列笔记
# 使用numpy生成1000个随机点 x_data = np.random.rand(1000) y_data = x_data*0.1+0.2 # 真实值 复制代码
- 构造一个线性模型
# 构造一个线性模型 b = tf.Variable(0.) k = tf.Variable(0.) y = k*x_data+b # 预测值 复制代码
- 定义损失函数,用于判断y 真实值 和y 预测值 之间的差距
# 二次代价函数(损失函数) loss = tf.reduce_mean(tf.square(y_data-y)) 复制代码
依次来解释下每个部分的含义:
y_data-y tf.square tf.reduce_mean
所以上面这三个函数合在一起就是计算loss值。
- 使用
GradientDescentOptimizer
类创建一个优化器来优化模型,减少loss
值,这个类的原理是梯度下降,至于什么是梯度下降,可以参考其他教程,日后会介绍,目前只要知道这么写就好了。
# 定义一个梯度下降法来进行训练的优化器 optimizer = tf.train.GradientDescentOptimizer(0.2) 复制代码
- 使用优化器来减少
loss
值,minimize
是优化器的一个方法
# 定义一个最小化代价函数 train = optimizer.minimize(loss) 复制代码
- 初始化上面的所有变量
# 初始化变量 init = tf.global_variables_initializer() 复制代码
- 利用
Session
训练我们的模型
with tf.Session() as sess: # 定义会话上下文 sess.run(init) # 执行初始化操作 for step in range(3000): # 训练3000次 sess.run(train) # 执行训练操作 if step % 20 == 0: # 每隔20步 print(step, sess.run([k, b])) # 打印出k和b的值 复制代码
至此,一个最简单的线性模型也就完成了。下面是所有代码:
# tensorflow简单示例 import tensorflow as tf import numpy as np # 使用numpy生成1000个随机点 x_data = np.random.rand(1000) y_data = x_data*0.1+0.2 # 真实值 # 构造一个线性模型 b = tf.Variable(0.) k = tf.Variable(0.) y = k*x_data+b # 预测值 # 二次代价函数(损失函数) loss = tf.reduce_mean(tf.square(y_data-y)) # 定义一个梯度下降法来进行训练的优化器 optimizer = tf.train.GradientDescentOptimizer(0.2) # 定义一个最小化代价函数 train = optimizer.minimize(loss) # 初始化变量 init = tf.global_variables_initializer() with tf.Session() as sess: sess.run(init) for step in range(3000): sess.run(train) if step % 20 == 0: print(step, sess.run([k, b])) 复制代码
运行结果的部分截图:
从上面两张图我们可以明显的看出来,在训练到第2980次的时候,k的结果已经非常非常接近0.1,b也非常非常接近0.2了,由此可以看出,这个模型还是较为正确的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 使用Tensorflow训练一元线性模型
- 如何用线性回归模型做数据分析?
- 线性模型已退场,XGBoost时代早已来
- 线性模型篇之 SVM 数学公式推导
- 线性回归 Statsmodels 模型预测波士顿房价
- 线性回归:这可能是机器学习中最简单的一个模型了
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Head First Rails
David Griffiths / O'Reilly Media / 2008-12-30 / USD 49.99
Figure its about time that you hop on the Ruby on Rails bandwagon? You've heard that it'll increase your productivity exponentially, and allow you to created full fledged web applications with minimal......一起来看看 《Head First Rails》 这本书的介绍吧!