【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

相关文章

Spring Security 从入门到进阶系列教程

Spring Security 入门系列 《保护 Web 应用的安全》 《Spring-Security-入门(一):登录与退出》 《Spring-Security-入门(二):基于数据库验证》 《Spring-Security-入门(三):密码加密》 《Spring-Security-入门(四):自定义-Filter》 《Spring-Security-入门(五):在 Sprin

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

基于MySQL Binlog的Elasticsearch数据同步实践

一、为什么要做 随着马蜂窝的逐渐发展,我们的业务数据越来越多,单纯使用 MySQL 已经不能满足我们的数据查询需求,例如对于商品、订单等数据的多维度检索。 使用 Elasticsearch 存储业务数据可以很好的解决我们业务中的搜索需求。而数据进行异构存储后,随之而来的就是数据同步的问题。 二、现有方法及问题 对于数据同步,我们目前的解决方案是建立数据中间表。把需要检索的业务数据,统一放到一张M

关于数据埋点,你需要了解这些基本知识

产品汪每天都在和数据打交道,你知道数据来自哪里吗? 移动app端内的用户行为数据大多来自埋点,了解一些埋点知识,能和数据分析师、技术侃大山,参与到前期的数据采集,更重要是让最终的埋点数据能为我所用,否则可怜巴巴等上几个月是常有的事。   埋点类型 根据埋点方式,可以区分为: 手动埋点半自动埋点全自动埋点 秉承“任何事物都有两面性”的道理:自动程度高的,能解决通用统计,便于统一化管理,但个性化定

使用SecondaryNameNode恢复NameNode的数据

1)需求: NameNode进程挂了并且存储的数据也丢失了,如何恢复NameNode 此种方式恢复的数据可能存在小部分数据的丢失。 2)故障模拟 (1)kill -9 NameNode进程 [lytfly@hadoop102 current]$ kill -9 19886 (2)删除NameNode存储的数据(/opt/module/hadoop-3.1.4/data/tmp/dfs/na

异构存储(冷热数据分离)

异构存储主要解决不同的数据,存储在不同类型的硬盘中,达到最佳性能的问题。 异构存储Shell操作 (1)查看当前有哪些存储策略可以用 [lytfly@hadoop102 hadoop-3.1.4]$ hdfs storagepolicies -listPolicies (2)为指定路径(数据存储目录)设置指定的存储策略 hdfs storagepolicies -setStoragePo

Hadoop集群数据均衡之磁盘间数据均衡

生产环境,由于硬盘空间不足,往往需要增加一块硬盘。刚加载的硬盘没有数据时,可以执行磁盘数据均衡命令。(Hadoop3.x新特性) plan后面带的节点的名字必须是已经存在的,并且是需要均衡的节点。 如果节点不存在,会报如下错误: 如果节点只有一个硬盘的话,不会创建均衡计划: (1)生成均衡计划 hdfs diskbalancer -plan hadoop102 (2)执行均衡计划 hd

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

烟火目标检测数据集 7800张 烟火检测 带标注 voc yolo

一个包含7800张带标注图像的数据集,专门用于烟火目标检测,是一个非常有价值的资源,尤其对于那些致力于公共安全、事件管理和烟花表演监控等领域的人士而言。下面是对此数据集的一个详细介绍: 数据集名称:烟火目标检测数据集 数据集规模: 图片数量:7800张类别:主要包含烟火类目标,可能还包括其他相关类别,如烟火发射装置、背景等。格式:图像文件通常为JPEG或PNG格式;标注文件可能为X