逻辑回归,附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 ...
随机推荐
- 使用Xshell5连接虚拟机VMware中安装的CentOS7系统
使用Xshell5连接VMware中安装的CentOS7系统 准备材料 Xshell 下载地址 VMware Workstation 12 Pro 下载地址 CentOS 7 64位系统 下载地址 安 ...
- Ubuntu 16.04 LTS 下安装MATLAB2015b 以及Matlab system error解决办法
下载MATLAB2015b破解版 操作系统:Ubuntu 16.o4 LTS 程序文件:Matlab2015b-glnxa64破解版 解压提取文件:在ubuntu系统下可以直接提取压缩文件,得到三个文 ...
- Mongodb 认证鉴权那点事
[TOC] 一.Mongodb 的权限管理 认识权限管理,说明主要概念及关系 与大多数数据库一样,Mongodb同样提供了一套权限管理机制. 为了体验Mongodb 的权限管理,我们找一台已经安装好的 ...
- LINUX下分区命令Parted详解
通常划分分区工具我们用的比较多是fdisk命令,但是现在由于磁盘越来越廉价,而且磁盘空间越来越大.而fdisk工具他对分区是有大小限制的,它只能划分小于2T的磁盘.现在的磁盘空间已经远远大于2T,有两 ...
- 安装debian 9.1后,中文环境下将home目录下文件夹改为对应的英文
安装了debian 9.1后,中文环境下home目录下文件夹显示的是中文,相当不方便cd命令,改为对应的英文吧,需要用到的软件xdg-user-dirs-gtk #安装需要的软件 sudo apt i ...
- LINUX 笔记-ps命令
使用该命令能确定有哪些进程正在运行和运行的状态.进程是否结束.进程有没有僵死.哪些进程占用了过多的资源等等 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME ...
- JPA + SpringData 操作数据库 ---- 深入了解 SpringData
原创播客,如需转载请注明出处.原文地址:http://www.cnblogs.com/crawl/p/7735616.html ------------------------------------ ...
- java对象类型转换和多态性
html { font-family: sans-serif } body { margin: 0 } article,aside,details,figcaption,figure,footer,h ...
- js原生API妙用(一)
复制数组 我们都知道数组是引用类型数据.这里使用slice复制一个数组,原数组不受影响. let list1 = [1, 2, 3, 4]; let newList = list1.slice(); ...
- 关于在Python下安装布隆过滤器(bloomfilter)的方法
由于在爬虫代码中需要实现信息的去重功能,所以需借助bloomfilter,在看完各种博客后发现没有安装,这就尴尬了,不会连门都找不到吧.那就安装呗,各种错误,查看官方文档:http://axiak.g ...