逻辑回归,附tensorflow实现
本文旨在通过二元分类问题、多元分类问题介绍逻辑回归算法,并实现一个简单的数字分类程序
在生活中,我们经常会碰到这样的问题:
根据苹果表皮颜色判断是青苹果还是红苹果
根据体温判断是否发烧
这种答案只有两种可能的问题(y {0,1}),被称为二元分类问题
有一组数据:
(x,y) {(1,0), (2,0), (3,0), (4,0), (5,0),
(6,1), (7,1), (8,1), (9,1), (10,1) }
这组数据在二维平面表现如下:

现在要根据x的值把这些点分成2类
我们先按照线性回归的思路来拟合出一条直线,如下图

由于是二元分类问题,我们判断当h(x)>0.5时,y=1;当h(x)<0.5时,y=0;画出来差不多是这么个样子

到现在为止看起来线性回归干得不错,但是当我们在数据中加一个噪声点(15,1)的时候:

可以看到,(6,1)(7,1)两个点都没有被正确的拟合
为了解决此问题,引入sigmoid函数

函数图是一个漂亮的S形
图片来自wiki
可以看出,当z(x)>0的时候,h(x)>0.5,由此判断y=1;反之则判断y=0
不过在实际使用中,更多的把h(x)看做是y=1的概率,1-h(x)看做是y=0的概率
例如h(x)=0.5,意味着y=1的概率为50%
由此把二元分类问题转化成了概率问题
那么怎么判断我们预测的是否准确,换句话说该怎样定义cost function呢
引入交叉熵
交叉熵产生于信息论里面的信息压缩编码技术,但是它后来演变成为从博弈论到机器学习等其他领域里的重要技术手段;公式如下

其中 y是预测的值, 是实际的值;比较粗糙的理解是,交叉熵是用来衡量我们的预测用于描述真相的有效性;更详细的证明在此不进一步展开
PS:一般在二元分类问题中都介绍最大似然法;在分类问题中交叉熵本质上与最大似然法相同,故在此只介绍交叉熵
在此稍微说明一下交叉熵为何有效
先让我们看一下-log(x)在0-1区间的函数图像:

假设 =1,y=0.6,转换成向量表达为
=[0,1],
=[0.4,0.6]
此时
假设 =1,y=0.99,转换成向量表达为
=[0,1],
=[0.01,0.99]
此时
假设 =1,y=0.01,转换成向量表达为
=[0,1],
=[0.99,0.01]
此时
可以看出,当我们预测得越准确时,cost function的值就越小;当预测错误时,cost function就会很大
所以问题就又来到了之前讨论过的的最小化cost function上
在上面的二元分类问题中,问题的答案只有是和否(y {0,1});但是很多问题的答案并不那么简单,比如说:
手写一个数字,识别改数字的值(y {0,1,2,3,4,5,6,7,8,9} )
根据一个汽车的标识,识别汽车的生产厂商(y { 奔驰,宝马,奥迪等等 })
这类问题被称为多元分类问题
很明显,sigmoid函数并不能满足多元分类问题的需要
在此引入softmax函数,函数如下

关于softmax的运作机制,可以参考下图
图片来自《一天搞懂深度学习》
cost function还是使用前文提到的交叉熵即可
那么一个简单的数字识别算法实现如下:
关于这段代码的详细实现思路,推荐阅读:MNIST机器学习入门 - TensorFlow 官方文档中文版 - 极客学院Wiki
import tensorflow as tf
# Import MINST data
from tensorflow.examples.tutorials.mnist import input_data
mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
# Parameters
learning_rate = 0.01
training_epochs = 10
batch_size = 100
display_step = 1
# tf Graph Input
x = tf.placeholder(tf.float32, [None, 784]) # mnist data image of shape 28*28=784
y = tf.placeholder(tf.float32, [None, 10]) # 0-9 digits recognition => 10 classes
# Set model weights
W = tf.Variable(tf.zeros([784, 10]))
b = tf.Variable(tf.zeros([10]))
# Construct model
pred = tf.nn.softmax(tf.matmul(x, W) + b) # Softmax
# Minimize error using cross entropy
cost = tf.negative(tf.reduce_sum(y * tf.log(pred)))
# Gradient Descent
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(cost)
# Initializing the variables
init = tf.global_variables_initializer()
# Launch the graph
with tf.Session() as sess:
sess.run(init)
# Training cycle
for epoch in range(training_epochs):
avg_cost = 0.
total_batch = int(mnist.train.num_examples / batch_size)
# Loop over all batches
for i in range(total_batch):
batch_xs, batch_ys = mnist.train.next_batch(batch_size)
# Fit training using batch data
_, c = sess.run([optimizer, cost], feed_dict={x: batch_xs,
y: batch_ys})
# Compute average loss
avg_cost += c / total_batch
# Display logs per epoch step
if (epoch + 1) % display_step == 0:
print("Epoch:", '%04d' % (epoch + 1), "cost=", "{:.9f}".format(avg_cost))
print("Optimization Finished!")
# Test model
correct_prediction = tf.equal(tf.argmax(pred, 1), tf.argmax(y, 1))
# Calculate accuracy for 3000 examples
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print("Accuracy:", accuracy.eval({x: mnist.test.images, y: mnist.test.labels}))
逻辑回归,附tensorflow实现的更多相关文章
- tensorflow 实现逻辑回归——原以为TensorFlow不擅长做线性回归或者逻辑回归,原来是这么简单哇!
实现的是预测 低 出生 体重 的 概率.尼克·麦克卢尔(Nick McClure). TensorFlow机器学习实战指南 (智能系统与技术丛书) (Kindle 位置 1060-1061). Kin ...
- tensorFlow(三)逻辑回归
tensorFlow 基础见前博客 逻辑回归广泛应用在各类分类,回归任务中.本实验介绍逻辑回归在 TensorFlow 上的实现 理论知识回顾 逻辑回归的主要公式罗列如下: 激活函数(activati ...
- 10分钟搞懂Tensorflow 逻辑回归实现手写识别
1. Tensorflow 逻辑回归实现手写识别 1.1. 逻辑回归原理 1.1.1. 逻辑回归 1.1.2. 损失函数 1.2. 实例:手写识别系统 1.1. 逻辑回归原理 1.1.1. 逻辑回归 ...
- 利用TensorFlow实现多元逻辑回归
利用TensorFlow实现多元逻辑回归,代码如下: import tensorflow as tf import numpy as np from sklearn.linear_model impo ...
- 利用Tensorflow实现逻辑回归模型
官方mnist代码: #下载Mnist数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read ...
- 深度学习原理与框架-Tensorflow基本操作-mnist数据集的逻辑回归 1.tf.matmul(点乘操作) 2.tf.equal(对应位置是否相等) 3.tf.cast(将布尔类型转换为数值类型) 4.tf.argmax(返回最大值的索引) 5.tf.nn.softmax(计算softmax概率值) 6.tf.train.GradientDescentOptimizer(损失值梯度下降器)
1. tf.matmul(X, w) # 进行点乘操作 参数说明:X,w都表示输入的数据, 2.tf.equal(x, y) # 比较两个数据对应位置的数是否相等,返回值为True,或者False 参 ...
- tensorflow学习笔记五----------逻辑回归
在逻辑回归中使用mnist数据集.导入相应的包以及数据集. import numpy as np import tensorflow as tf import matplotlib.pyplot as ...
- tensorflow之逻辑回归模型实现
前面一篇介绍了用tensorflow实现线性回归模型预测sklearn内置的波士顿房价,现在这一篇就记一下用逻辑回归分类sklearn提供的乳腺癌数据集,该数据集有569个样本,每个样本有30维,为二 ...
- TensorFlow从0到1之TensorFlow逻辑回归处理MNIST数据集(17)
本节基于回归学习对 MNIST 数据集进行处理,但将添加一些 TensorBoard 总结以便更好地理解 MNIST 数据集. MNIST由https://www.tensorflow.org/get ...
随机推荐
- phpstudy升级mysql数据库
因为MySQL支持全文索引的只有5.6以上,而我下的phpstudy只有5.5的版本,在导入数据库的时候因为该数据库的表内有使用全文索引,因此必须升级phpstudy的mysql版本,这里就把自己当升 ...
- win10 UWP MessageDialog 和 ContentDialog
我之前开发一个软件 winMarkdown,这个软件在关闭需要提示用户还没有保存东西,需要保存,如果用户选择退出,那么把数据存放. 在Metro程序中,没有传统的窗口,当我们要用需要交互的消息提示时, ...
- jdk8 JAVA_OPTS
JAVA_OPTS="-server -Xms1024m -Xmx1024m -XX:MetaspaceSize=512m -XX:MaxMetaspaceSize=512m -Djava. ...
- 基于JavaBean编辑器读取peroperties文件
引言 最近在重读<精通Spring+4.x++企业应用开发实战>这本书,看到了有关JavaBean编辑器的部分,了解到PropertyEditor和BeanInfo的使用.不得不说,Bea ...
- JavaScript中的比较规则之“==”运算符
"=="运算符(两个操作数的类型不相同时) 如果一个值是null,另一个值是undefined,则它们相等 如果一个值是数字,另一个值是字符串,先将字符串转换为数学,然后使用转换后 ...
- 深入理解 Linux 的 RCU 机制
欢迎大家前往腾讯云社区,获取更多腾讯海量技术实践干货哦~ 作者:梁康 RCU(Read-Copy Update),是 Linux 中比较重要的一种同步机制.顾名思义就是"读,拷贝更新&quo ...
- 用source语句引用mysql文件的细节注意
今天在使用 mysql数据库的时候,创建 数据表的时候出现了很多的小问题,今天一天花费了大量的时间去解决这些问题.首先就是一些小的细节,在文本编辑器上编辑好了SQL语句,然后转移到mysql的命令行中 ...
- Struts2实现文件上传下载功能(批量上传)
今天来发布一个使用Struts2上传下载的项目, struts2为文件上传下载提供了好的实现机制, 首先,可以先看一下我的项目截图 关于需要使用的jar包,需要用到commons-fileupload ...
- POJ3264 (RMQのST解法)
For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in the same order. One d ...
- Problem K
Problem Description The local toy store sells small fingerpainting kits with between three and twelv ...