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

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

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

根据体温判断是否发烧

这种答案只有两种可能的问题(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. memcached+狀態模式+工廠方法使用

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  2. win10 uwp 模拟网页输入

    有时候需要获得网页的 js 执行后的源代码,或者模拟网页输入,如点按钮输入文字. 如果需要实现,那么就需要用 WebView ,使用方法很简单. 首先创建一个 WebView ,接下来的所有输入都需要 ...

  3. Python并发编程__多进程

    Python并发编程_多进程 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大 ...

  4. R学习笔记 第四篇:函数,分支和循环

    变量用于临时存储数据,而函数用于操作数据,实现代码的重复使用.在R中,函数只是另一种数据类型的变量,可以被分配,操作,甚至把函数作为参数传递给其他函数.分支控制和循环控制,和通用编程语言的风格很相似, ...

  5. glog 使用

    glog 使用 来源:http://www.cnblogs.com/tianyajuanke/archive/2013/02/22/2921850.html 一.安装配置 1.简介 google 出的 ...

  6. html5页面实现点击复制功能

    在实际工作中,有时候会遇到这样的需求,页面上有一个链接,不需要选中链接内容,只需要点击复制按钮,就可以把链接内容复制到剪切板.这时候可以使用clipboard插件来实现.以下是一个简单的demo. 首 ...

  7. grunt任务自动管理

    Grunt管理工具使用: 一.模块安装 1.在项目的根目录里新建package.json文件,形式如下,指定依赖的库以及版本信息. 2.然后在项目根目录下,执行 npm install ,安装json ...

  8. 混合app

    cordova run android            把应用发送到手机   ionic serve        电脑浏览器调试命令   创建: cordova create hello co ...

  9. vue初级学习--环境搭建

    一.导语 最近总想学点东西,es6啊.typescript啊,都想学,刚好有个机遇,可以学点vue,嗯,那就开始吧. 二.正文 1.node环境: 下载安装nodeJs,最好是1.6以上的版本,下载地 ...

  10. struts2 中文乱码问题,自定义过滤器通用解决方法

    问题描述 在JSP中使用form表单向后台action中传递中文参数,后台action接收到参数出现中文乱码.JSP页面统一采用了utf-8编码格式.由于struts2默认采用的编码为utf-8,根据 ...