【Sklearn】入门花卉数据集实验--理解朴素贝叶斯分类器

本文主要是介绍【Sklearn】入门花卉数据集实验--理解朴素贝叶斯分类器,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 一、前言
  • 二、入门实例--花卉实例
    • 1.下载数据集
    • 2.beyes分类原理
    • 3.实例

一、前言

环境:Win10 + anaconda3 + jupyternotebook

图像的分类:
根据各自在图像信息中所反映的不同特征,把不同类别的目标区分开来的图像处理方法。它利用计算机对图像进行定量分析,把图像或图像中的每个像元或区域划归为若干个类别中的某一种,以代替人的视觉判读。
在这里插入图片描述
常见的分类算法
包括朴素贝叶斯分类器、决策树、K最近邻分类算法、支持向量机、神经网络和基于规则的分类算法等,同时还有用于组合单一类方法的集成学习算法,如Bagging和Boosting等。

本文以朴素贝叶斯分类为主进行讨论,它适用于数据集较少的情况;而数据集少,基于复杂的模型用了太多假设,会导致欠拟合,因此这算是朴素贝斯算法的特点。

二、入门实例–花卉实例

17个类别的花卉数据集:
每个类别有80张图像。选择的花是英国的一些普通花。图像具有较大的比例,姿势和光线变化,并且在类内还存在图像变化较大且与其他类非常相似的类。类别可以在下图中看到。我们将数据集随机分为3个不同的训练,验证和测试集。图像的子集已被地面标记为分段。

1.下载数据集

下载17种花卉数据图片,
这里做简单实验,我只下载了数据集1360张(大小58M,有17类花卉每种40张,有txt图片名称列表)。
在这里插入图片描述
根据txt对,每40张分类到不同的文件夹中:
在这里插入图片描述
分类存放:shutil.move()移动文件

"""1.下载17种花卉数据图片,每40张分类到一个文件夹中
下载地址:http://www.robots.ox.ac.uk/~vgg/data/flowers/17/
"""
import os
import shutiln=0
label=0
with open("images/jpg/files.txt","r") as f:for line in f.readlines():if n < 40:n=n+1else:label=label+1n=0path = 'images/jpg/'+ line.replace("\n", "")path2 ='images/train/'+str(label)+'/'if not os.path.exists(path2):os.makedirs(path2)shutil.move( path , path2+line.replace("\n", ""))

2.beyes分类原理

朴素贝叶斯法是基于贝叶斯定理与特征条件独立假设的分类方法。即假定给定目标值时属性之间相互条件独立。也就是说没有哪个属性变量对于决策结果来说占有着较大的比重,也没有哪个属性变量对于决策结果占有着较小的比重。

最为广泛的两种分类模型是决策树模型(Decision Tree Model)和朴素贝叶斯模型(Naive Bayesian Model,NBM)。和决策树模型相比,朴素贝叶斯分类器(Naive Bayes Classifier 或 NBC)发源于古典数学理论,有着坚实的数学基础,以及稳定的分类效率。

算法流程:
在这里插入图片描述
拆分:

  1. 待分类项 X 有10*40=400张图片:(我们取前10类花种),这个集合叫做训练样本集。
    在这里插入图片描述
  2. 有类别10集合 y1 为 0类花种,40张;y2为1类花种,40张图像
    在这里插入图片描述
  3. 统计10个花种类别各个特征属性的条件概率估计。
    在这里插入图片描述
  4. 如果各个特征属性是条件独立的,则根据贝叶斯定理有如下推导
    在这里插入图片描述
    因为分母对于所有类别为常数,因为我们只要将分子最大化皆可。
    在这里插入图片描述

朴素贝叶斯分类分为三个阶段

  • 第一阶段——准备工作阶段,这个阶段的任务是为朴素贝叶斯分类做必要的准备,主要工作是根据具体情况确定特征属性,并对每个特征属性进行适当划分,然后由人工对一部分待分类项进行分类,形成训练样本集合。这一阶段的输入是所有待分类数据,输出是特征属性和训练样本。这一阶段是整个朴素贝叶斯分类中唯一需要人工完成的阶段,其质量对整个过程将有重要影响,分类器的质量很大程度上由特征属性、特征属性划分及训练样本质量决定。
  • 第二阶段——分类器训练阶段,这个阶段的任务就是生成分类器,主要工作是计算每个类别在训练样本中的出现频率及每个特征属性划分对每个类别的条件概率估计,并将结果记录。其输入是特征属性和训练样本,输出是分类器。这一阶段是机械性阶段,根据前面讨论的公式可以由程序自动计算完成。
  • 第三阶段——应用阶段。这个阶段的任务是使用分类器对待分类项进行分类,其输入是分类器和待分类项,输出是待分类项与类别的映射关系。这一阶段也是机械性阶段,由程序完成。

3.实例

  1. 切分训练集和测试集:
    一共有400张图片,70%作为训练集286张;30%作为测试集,123张。

  2. 图像读取及转换为像素直方图
    (这里是特征提取标准,这里暂时用直方图特征来提取,简化过程;实际运用中,这里的提取标准应该是你自定义优化特征提取的函数)

  3. 基于朴素贝叶斯的图像分类处理
    采用BernoulliNB().fit(XX_train, y_train)#伯努利贝叶斯分类器
    predictions_labels = clf.predict(XX_test)训练图片预测
    classification_report(y_test, predictions_labels)测试图片结果分析

    over!

完整代码:

"""2.朴素贝叶斯分类识别将400张图像按照训练集为70%,测试集为30%的比例随机划分,
再获取每张图像的像素直方图,(这里后面替换为你的提取特征的方法)
根据像素的特征分布情况进行图像分类分析。
"""# -*- coding: utf-8 -*-
import os
import cv2
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import confusion_matrix, classification_report#----------------------------------------------------------------------------------
# 第一步 切分训练集和测试集
#----------------------------------------------------------------------------------X = [] #定义图像名称
Y = [] #定义图像分类类标
#Z = [] #定义图像像素for i in range(0, 10):#遍历文件夹,读取图片for f in os.listdir("images/train/%s" % i):#获取图像名称X.append("images/train/" +str(i) + "/" + str(f))#获取图像类标即为文件夹名称Y.append(i)X = np.array(X)
Y = np.array(Y)#随机率为100% 选取其中的30%作为测试集
X_train, X_test, y_train, y_test = train_test_split(X, Y,test_size=0.3, random_state=1)print(len(X_train), len(X_test), len(y_train), len(y_test))#----------------------------------------------------------------------------------
# 第二步 图像读取及转换为像素直方图
#----------------------------------------------------------------------------------#训练集
XX_train = []
for i in X_train:#读取图像#print iimage = cv2.imread(i)#图像像素大小一致img = cv2.resize(image, (256,256),interpolation=cv2.INTER_CUBIC)#计算图像直方图并存储至X数组hist = cv2.calcHist([img], [0,1], None,[256,256], [0.0,255.0,0.0,255.0])XX_train.append(((hist/255).flatten()))#测试集
XX_test = []
for i in X_test:#读取图像#print iimage = cv2.imread(i)#图像像素大小一致img = cv2.resize(image, (256,256),interpolation=cv2.INTER_CUBIC)#计算图像直方图并存储至X数组hist = cv2.calcHist([img], [0,1], None,[256,256], [0.0,255.0,0.0,255.0])XX_test.append(((hist/255).flatten()))#----------------------------------------------------------------------------------
# 第三步 基于朴素贝叶斯的图像分类处理
#----------------------------------------------------------------------------------from sklearn.naive_bayes import BernoulliNB
# 使用训练集训练模型
clf = BernoulliNB().fit(XX_train, y_train)#伯努利贝叶斯分类器
predictions_labels = clf.predict(XX_test)# 使用测试集预测结果
print(u'预测结果:')
print(predictions_labels)
# 生成文本型分类报告
print(u'算法评价:')#算法评价准确率(Precision)、召回率(Recall)和F值(F1-score)
print((classification_report(y_test, predictions_labels)))
# 生成字典型分类报告
report = classification_report(y_test, predictions_labels, output_dict=True)
print(u'第二张图的字典型分类报告:')
for key, value in report["1"].items():print(f"{key:10s}:{value:10.2f}")#输出前10张图片及预测结果
k = 0
while k<10:#读取图像print(X_test[k])image = cv2.imread(X_test[k])print(predictions_labels[k])#显示图像cv2.imshow("img", image)cv2.waitKey(0)cv2.destroyAllWindows()k = k + 1

结果:
一共有400张图片,70%作为训练集286张;30%作为测试集,123张。
123张的预测结果:
在这里插入图片描述
算法评价:算法评价准确率(Precision)、召回率(Recall)和F值(F1-score)
在这里插入图片描述
前十张的预测结果有有两张正确,因为我们的训练样本太少,以及特征提取仅依靠直方图一个因素进行判断,所以这里准确率不高。
在这里插入图片描述

这篇关于【Sklearn】入门花卉数据集实验--理解朴素贝叶斯分类器的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/411073

相关文章

深入理解Mysql OnlineDDL的算法

《深入理解MysqlOnlineDDL的算法》本文主要介绍了讲解MysqlOnlineDDL的算法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小... 目录一、Online DDL 是什么?二、Online DDL 的三种主要算法2.1COPY(复制法)

Linux下利用select实现串口数据读取过程

《Linux下利用select实现串口数据读取过程》文章介绍Linux中使用select、poll或epoll实现串口数据读取,通过I/O多路复用机制在数据到达时触发读取,避免持续轮询,示例代码展示设... 目录示例代码(使用select实现)代码解释总结在 linux 系统里,我们可以借助 select、

C#使用iText获取PDF的trailer数据的代码示例

《C#使用iText获取PDF的trailer数据的代码示例》开发程序debug的时候,看到了PDF有个trailer数据,挺有意思,于是考虑用代码把它读出来,那么就用到我们常用的iText框架了,所... 目录引言iText 核心概念C# 代码示例步骤 1: 确保已安装 iText步骤 2: C# 代码程

Pandas处理缺失数据的方式汇总

《Pandas处理缺失数据的方式汇总》许多教程中的数据与现实世界中的数据有很大不同,现实世界中的数据很少是干净且同质的,本文我们将讨论处理缺失数据的一些常规注意事项,了解Pandas如何表示缺失数据,... 目录缺失数据约定的权衡Pandas 中的缺失数据None 作为哨兵值NaN:缺失的数值数据Panda

C++中处理文本数据char与string的终极对比指南

《C++中处理文本数据char与string的终极对比指南》在C++编程中char和string是两种用于处理字符数据的类型,但它们在使用方式和功能上有显著的不同,:本文主要介绍C++中处理文本数... 目录1. 基本定义与本质2. 内存管理3. 操作与功能4. 性能特点5. 使用场景6. 相互转换核心区别

python库pydantic数据验证和设置管理库的用途

《python库pydantic数据验证和设置管理库的用途》pydantic是一个用于数据验证和设置管理的Python库,它主要利用Python类型注解来定义数据模型的结构和验证规则,本文给大家介绍p... 目录主要特点和用途:Field数值验证参数总结pydantic 是一个让你能够 confidentl

JAVA实现亿级千万级数据顺序导出的示例代码

《JAVA实现亿级千万级数据顺序导出的示例代码》本文主要介绍了JAVA实现亿级千万级数据顺序导出的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面... 前提:主要考虑控制内存占用空间,避免出现同时导出,导致主程序OOM问题。实现思路:A.启用线程池

SpringBoot分段处理List集合多线程批量插入数据方式

《SpringBoot分段处理List集合多线程批量插入数据方式》文章介绍如何处理大数据量List批量插入数据库的优化方案:通过拆分List并分配独立线程处理,结合Spring线程池与异步方法提升效率... 目录项目场景解决方案1.实体类2.Mapper3.spring容器注入线程池bejsan对象4.创建

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

C#实现千万数据秒级导入的代码

《C#实现千万数据秒级导入的代码》在实际开发中excel导入很常见,现代社会中很容易遇到大数据处理业务,所以本文我就给大家分享一下千万数据秒级导入怎么实现,文中有详细的代码示例供大家参考,需要的朋友可... 目录前言一、数据存储二、处理逻辑优化前代码处理逻辑优化后的代码总结前言在实际开发中excel导入很