本文旨在通过二元分类问题、多元分类问题介绍逻辑回归算法,并实现一个简单的数字分类程序

在生活中,我们经常会碰到这样的问题:

根据苹果表皮颜色判断是青苹果还是红苹果

根据体温判断是否发烧

这种答案只有两种可能的问题(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实现的更多相关文章

  1. tensorflow 实现逻辑回归——原以为TensorFlow不擅长做线性回归或者逻辑回归,原来是这么简单哇!

    实现的是预测 低 出生 体重 的 概率.尼克·麦克卢尔(Nick McClure). TensorFlow机器学习实战指南 (智能系统与技术丛书) (Kindle 位置 1060-1061). Kin ...

  2. tensorFlow(三)逻辑回归

    tensorFlow 基础见前博客 逻辑回归广泛应用在各类分类,回归任务中.本实验介绍逻辑回归在 TensorFlow 上的实现 理论知识回顾 逻辑回归的主要公式罗列如下: 激活函数(activati ...

  3. 10分钟搞懂Tensorflow 逻辑回归实现手写识别

    1. Tensorflow 逻辑回归实现手写识别 1.1. 逻辑回归原理 1.1.1. 逻辑回归 1.1.2. 损失函数 1.2. 实例:手写识别系统 1.1. 逻辑回归原理 1.1.1. 逻辑回归 ...

  4. 利用TensorFlow实现多元逻辑回归

    利用TensorFlow实现多元逻辑回归,代码如下: import tensorflow as tf import numpy as np from sklearn.linear_model impo ...

  5. 利用Tensorflow实现逻辑回归模型

    官方mnist代码: #下载Mnist数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read ...

  6. 深度学习原理与框架-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 参 ...

  7. tensorflow学习笔记五----------逻辑回归

    在逻辑回归中使用mnist数据集.导入相应的包以及数据集. import numpy as np import tensorflow as tf import matplotlib.pyplot as ...

  8. tensorflow之逻辑回归模型实现

    前面一篇介绍了用tensorflow实现线性回归模型预测sklearn内置的波士顿房价,现在这一篇就记一下用逻辑回归分类sklearn提供的乳腺癌数据集,该数据集有569个样本,每个样本有30维,为二 ...

  9. TensorFlow从0到1之TensorFlow逻辑回归处理MNIST数据集(17)

    本节基于回归学习对 MNIST 数据集进行处理,但将添加一些 TensorBoard 总结以便更好地理解 MNIST 数据集. MNIST由https://www.tensorflow.org/get ...

随机推荐

  1. win8.1 安装

    下载了Windows8.1企业版的iso文件,文件名称:cn_windows_8_1_enterprise_x86_dvd_2791409.iso 下载地址: http://msdn.itellyou ...

  2. MTV模型

    django的MTV分别代表: model(模型):负责业务对象与数据库的对象(orm) template(模板):负责把页面展示给用户 view(视图):负责业务逻辑,并在适当的时候调用model和 ...

  3. Python 第十三节 文件操作

    A 1.首先文件读写操作有以下几种模式:   a\a+  w\w+ r\r+   a模式:追加_写入模式,写入指针默认在开头,如果文件存在将在开头追加写入,如果文件不存在将创建文件再写入. a+模式: ...

  4. 基于HTML5及WebGl下生成的json格式的工控SCADA风机叶轮旋转

    突然有个想法,如果能把一些用到不同的知识点放到同一个界面上,并且放到一个盒子里,这样我如果要看什么东西就可以很直接显示出来,而且这个盒子一定要能打开.我用HT实现了我的想法,代码一百多行,这么少的代码 ...

  5. 本地idea调试spark2.x程序

    1.构建使用idea 构建maven 项目 选择org.scala-tools.archetypes:scala-archetype-simple,然后一直点next,maven最好选中本地配置国内源 ...

  6. 走进 Xamarin Test Recorder for Xamarin.Forms

    此篇是承接之前 走进 UITest for Xamarin.Forms 的,所以如果没有看过之前的可以先看下之前的 UITest 比起上一篇纯敲代码只适合程序员的 UITest ,这一篇不管是程序员还 ...

  7. Xilinx ISE 14.1中模拟True Dual Port RAM例子

    <一>创建工程 创建工程在此略过. <二>基本代码 1.创建一个Verilog modual代码如下: module main( input clk, input rsta, ...

  8. JQuery源码-------JQuery中数值型变量的判断isNumeric

    判断一个数值型变量的方法,在jquery中非常简单,只有一行代码. isNumeric: function( obj ) { // parseFloat NaNs numeric-cast false ...

  9. h5 动画页面

    伪元素上就不要做动画了,页面果然应该做一个测试一个啊   拿到设计稿一开始就先看看这个设计稿的布局,有一些是从页面顶部到底部都有效果的,这个时候就要考虑在 iPhone4 这样屏幕不够高的设备上如何保 ...

  10. 单元测试 Qunit

    http://api.qunitjs.com/category/assert/    测试方法   选中 "Check for Globals" 会暴露全局对象,看你的代码会不会无 ...