【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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Python中OpenCV与Matplotlib的图像操作入门指南

《Python中OpenCV与Matplotlib的图像操作入门指南》:本文主要介绍Python中OpenCV与Matplotlib的图像操作指南,本文通过实例代码给大家介绍的非常详细,对大家的学... 目录一、环境准备二、图像的基本操作1. 图像读取、显示与保存 使用OpenCV操作2. 像素级操作3.

解决mysql插入数据锁等待超时报错:Lock wait timeout exceeded;try restarting transaction

《解决mysql插入数据锁等待超时报错:Lockwaittimeoutexceeded;tryrestartingtransaction》:本文主要介绍解决mysql插入数据锁等待超时报... 目录报错信息解决办法1、数据库中执行如下sql2、再到 INNODB_TRX 事务表中查看总结报错信息Lock