人工稚能之sklearn分类

分类算法和聚类比较类似,都是将输入数据赋予一个标签类别。区别是分类算法的分类是预先确定的,有明确含义的。而聚类的标签是从输入数据本身的分布中提取出来的一种抽象的类别。聚类是无监督算法,而分类是有监督的,除了输入数据x外,还有标签y。

分类算法和回归算法也有类似之处,它们都是有监督算法。区别是回归算法预测的是连续值,而分类算法预测的是离散的预定义的类别。

分类算法同样分为线性分类和非线性分类算法,线性可分是指可以用二维空间的直线或者多维空间的平面将输入数据分开,非线性就是线性不可分。

分类算法非常繁多,朴素贝叶斯分类是其中一种常见的分类算法,它是基于贝叶斯概率推导出来的算法。该算法在垃圾文本分类中使用非常广泛。虽然贝叶斯概率公式并不复杂,但是理解它也需要有一定的概率数学基础。本篇就不做详细推导解释。

sklearn的naive_bayes算法提供了三种实现,BernoulliNB、MultinormialNB和GaussianNB,BernoulliNB适合抛硬币这种0/1型布尔输入,MultinormialNB适合文章中的单词数量这种数量型输入,而最后一个GaussianNB适合本例中连续性数字输入。

接下来我们使用sklearn提供的GaussianNB模块体验一下朴素贝叶斯分类算法

首先我们构造出一些随机数据点。

# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt

k = 5
# 颜色标签
colors = ['green', 'red', 'blue', 'yellow', 'pink']
# 先随机出中心点
centers = []
for i in range(k):
    x = 10 + 100 * random.random()
    y = 10 + 100 * random.random()
    centers.append((x, y))

points = []
# 然后在每个中心点的周围随机100个点
for ci, (x, y) in enumerate(centers):
    ps = []
    for i in range(100):
        px = x + random.random() * 20 - 10
        py = y + random.random() * 20 - 10
        ps.append((px, py))
        points.append(((px, py), ci))
    # 显示数据点
    plt.scatter(
        [x for x, y in ps],
        [y for x, y in ps],
        c=colors[ci], marker='.')

然后我们使用模型来预测所有网格点的颜色

# -*- coding: utf-8 -*-
import random
import matplotlib.pyplot as plt
from sklearn.naive_bayes import GaussianNB

k = 5
# 颜色标签
colors = ['green', 'red', 'blue', 'yellow', 'pink']
# 先随机出中心点centers = []
for i in range(k):
    x = 10 + 100 * random.random()
    y = 10 + 100 * random.random()
    centers.append((x, y))

points = []
# 然后在每个中心点的周围随机100个点
for ci, (x, y) in enumerate(centers):
    ps = []
    for i in range(100):
        px = x + random.random() * 20 - 10
        py = y + random.random() * 20 - 10
        ps.append((px, py))
        points.append(((px, py), ci))
    # 显示数据点
    plt.scatter(
        [x for x, y in ps],
        [y for x, y in ps],
        c=colors[ci], marker='.')

model = GaussianNB()
# 拟合输入
model.fit([p for p, ci in points], [ci for p, ci in points])

pcolors = []
# 网格点
grids = [(x, y) for x in range(0, 120, 5) for y in range(0, 120, 5)]
# 预测颜色
for i, ci in enumerate(model.predict(grids)):
    pcolors.append((grids[i], ci))

# 显示带颜色的网格点
plt.scatter(
    [x for (x, y), ci in pcolors],
    [y for (x, y), ci in pcolors],
    c=[colors[ci] for (x, y), ci in pcolors], marker='x')

plt.show()

可以看出分类的颜色块边界还是非常明细的。

如果换成BernoulliNB,就完全看不到边界。

再换成MultinomialNB,勉强也能接受,只是边界不够明细。

所以这三种算法有各自的使用场景,不能随便使用。

原文发布于微信公众号 - 码洞(codehole)

原文发表时间:2018-03-16

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏杨熹的专栏

为什么要用交叉验证

本文结构: 什么是交叉验证法? 为什么用交叉验证法? 主要有哪些方法?优缺点? 各方法应用举例? ---- 什么是交叉验证法? 它的基本思想就是将原始数据(da...

5174
来自专栏计算机视觉战队

详聊CNN的精髓

现在的深度学习发展速度已经超出每个人的想象,很大一部分人只是觉得我用他人的框架去实现自己的目的,并且效果很好就可以了,这也是现在一大部分的一个瓶颈。曾经有一个老...

3675
来自专栏决胜机器学习

深层神经网络参数调优(五) ——超参数调试、batch归一化、softmax回归

深层神经网络参数调优(五) ——超参数调试、batch归一化、softmax回归 (原创内容,转载请注明来源,谢谢) 一、超参数调试 1、超参数 超参数是不直...

4728
来自专栏Pytorch实践

分类问题样本不均衡常见的解决方法

分类时,由于训练集合中各样本数量不均衡,导致模型训偏在测试集合上的泛化性不好。解决样本不均衡的方法主要包括两类:(1)数据层面,修改各类别的分布;(2)分类器层...

7185
来自专栏marsggbo

DeepLearning.ai学习笔记(四)卷积神经网络 -- week1 卷积神经网络基础知识介绍

一、计算机视觉 ? 如图示,之前课程中介绍的都是64* 64 3的图像,而一旦图像质量增加,例如变成1000 1000 * 3的时候那么此时的神经网络的计...

22810
来自专栏计算机视觉战队

DeepLab v2及调试过程

今天我们开始说说语义分割第二个系列,DeepLab V2。说这个之前,我们先说说FCN的一些简单知识。 图像语义分割,简单而言就是给定一张图片,对图片上的每一个...

4746
来自专栏贾志刚-OpenCV学堂

理解CNN卷积层与池化层计算

深度学习中CNN网络是核心,对CNN网络来说卷积层与池化层的计算至关重要,不同的步长、填充方式、卷积核大小、池化层策略等都会对最终输出模型与参数、计算复杂度产生...

2291
来自专栏梦里茶室

读论文系列:Object Detection ICCV2015 Fast RCNN

Fast RCNN是对RCNN的性能优化版本,在VGG16上,Fast R-CNN训练速度是RCNN的9倍, 测试速度是RCNN213倍;训练速度是SPP-ne...

3786
来自专栏机器学习、深度学习

人脸对齐--Dense Face Alignment

Dense Face Alignment ICCVW2017 http://cvlab.cse.msu.edu/project-pifa.html ...

5397
来自专栏瓜大三哥

DeepFace

检测→对齐→表示→分类 在文章中,通过3d模型改进了人脸对齐的方法。然后,通过基于4million人脸图像(4000个个体)训练的一个9层的人工神经网络来进行人...

2546

扫码关注云+社区

领取腾讯云代金券