CIFAR-10数据集图像分类【PCA+基于最小错误率的贝叶斯决策】

CIFAR-10和CIFAR-100均是带有标签的数据集,都出自于规模更大的一个数据集,他有八千万张小图片。而本次实验采用CIFAR-10数据集,该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。测试批的数据里,取自10类中的每一类,每一类随机取1000张。抽剩下的就随机排列组成了训练批。注意一个训练批中的各类图像并不一定数量相同,总的来看训练批,每一类都有5000张图。

下面这幅图就是列举了10各类,每一类展示了随机的10张图片:

我的数据集一共有三个文件,分别是训练集train_data,测试集test_data以及标签名称labels_name,而标签名称中共有5个类,‘airplane‘, ‘automobile‘, ‘bird‘, ‘cat‘, ‘deer’.我现在准备对前三类‘airplane‘, ’automobile‘, ’bird‘,(即标签为1, 2, 3的数据 )进行分类。

经过之前大量测试,得到在累计方差贡献率为0.79时,基于最小错误率的贝叶斯决策用于图像分类最佳,以下为代码:

#CIFAR-10数据集:包含60000个32*32的彩色图像,共10类,每类6000个彩色图像。有50000个训练图像和10000个测试图像。
import scipy.io
train_data=scipy.io.loadmat("F:\\模式识别\\最小错误率的贝叶斯决策进行图像分类\\data\\train_data.mat")
print (type(train_data))
print (train_data.keys())
print (train_data.values())
print (len(train_data[‘Data‘]))
#单张图片的数据向量长度:32X32X3=3072
#内存占用量=3072*4*9968=116M  假定一个整数占用4个字节
print (len(train_data[‘Data‘][0]))
print (train_data)
x = train_data[‘Data‘]
y = train_data[‘Label‘]
print (y)
print (len(y))
print (y.shape)
print (y.flatten().shape)
#labels_name:共5个标签,分别为airplane、automobile、bird、cat、deer
import scipy.io
labels_name=scipy.io.loadmat("F:\\模式识别\\最小错误率的贝叶斯决策进行图像分类\\data\\labels_name.mat")
print (type(labels_name))
print (labels_name)
print (len(labels_name))
#test_data:共5000个图像,5类,每类1000个图像
import scipy.io
test_data=scipy.io.loadmat("F:\\模式识别\\最小错误率的贝叶斯决策进行图像分类\\data\\test_data.mat")
print (test_data[‘Label‘])
print (test_data[‘Data‘])
print (len(test_data[‘Label‘]))
datatest = test_data[‘Data‘]
labeltest = test_data[‘Label‘]
print (datatest.shape)
print (labeltest.shape)
test_index=[]
for i in range(len(labeltest)):
    if labeltest[i]==1:
        test_index.append(i)
    elif labeltest[i]==2:
        test_index.append(i)
    elif labeltest[i]==3:
        test_index.append(i)
#print (test_index)
labeltest=test_data[‘Label‘][:3000]
#print (labeltest)
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
print (x)
print (x.shape)
print (type(x))
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.decomposition import PCA
pca=PCA(n_components=0.79)
#训练模型
pca.fit(x)
x_new=pca.transform(x)
print("降维后各主成分的累计方差贡献率:",pca.explained_variance_ratio_)
print("降维后主成分的个数:",pca.n_components_)
print (x_new)
index_1=[]
index_2=[]
index_3=[]
index_num=[]
for i in range(len(y)):
    if y[i]==1:
        index_1.append(i)
    elif y[i]==2:
        index_2.append(i)
    elif y[i]==3:
        index_3.append(i)
index_num=[len(index_1),len(index_2),len(index_3)]
print(len(index_1))
print(len(index_2))
print(len(index_3))
print (index_num)
import numpy as np
class1_feature=[]
class2_feature=[]
class3_feature=[]
#index_1
for i in index_1:
    class1_feature.append(x_new[i])
print (len(class1_feature))
for i in index_2:
    class2_feature.append(x_new[i])
print (len(class2_feature))
for i in index_3:
    class3_feature.append(x_new[i])
print (len(class3_feature))
#计算第一类的类条件概率密度函数的参数
class1_feature=np.mat(class1_feature)
print (class1_feature.shape)
miu1=[]
sigma1=[]
for i in range(30):
    miu=class1_feature[:,i].sum()/len(index_1)
    miu1.append(miu)
    temp=class1_feature[:,i]-miu
    class1_feature[:,i]=temp
sigma1=(class1_feature.T*class1_feature)/len(index_1)
print (miu1)
print (sigma1)
print (sigma1.shape)
#计算第二类类条件概率密度函数的参数
class2_feature=np.mat(class2_feature)
miu2=[]
sigma2=[]
for i in range(30):
    miu=class2_feature[:,i].sum()/len(index_2)
    miu2.append(miu)
    temp=class2_feature[:,i]-miu
    class2_feature[:,i]=temp
sigma2=(class2_feature.T*class2_feature)/len(index_2)
print (miu2)
print (sigma2)
print (sigma2.shape)
#计算第三类类条件概率密度函数的参数
class3_feature=np.mat(class3_feature)
miu3=[]
sigma3=[]
for i in range(30):
    miu=class3_feature[:,i].sum()/len(index_3)
    miu3.append(miu)
    temp=class3_feature[:,i]-miu
    class3_feature[:,i]=temp
sigma3=(class3_feature.T*class3_feature)/len(index_3)
print (miu3)
print (sigma3)
print (sigma3.shape)
#计算三个类别的先验概率:
prior_index1=len(index_1)/len(y)
prior_index2=len(index_2)/len(y)
prior_index3=len(index_3)/len(y)
print (prior_index1)
print (prior_index2)
print (prior_index3)
import math
#降维
x_test = pca.transform(datatest)
print (x_test)
print (x_test.shape)
print (x_test[0])
#print ((np.mat(x_test[0]-miu1))*sigma1.I*(np.mat(x_test[0]-miu1).T))
#print (((np.mat(x_test[0]-miu1))*sigma1.I*(np.mat(x_test[0]-miu1).T))[0,0])
predict_label=[]
for i in range(3000):
    g1=-0.5*((np.mat(x_test[i]-miu1))*sigma1.I*(np.mat(x_test[i]-miu1).T))[0,0]-0.5*math.log(np.linalg.det(sigma1))+math.log(prior_index1)
    g2=-0.5*((np.mat(x_test[i]-miu2))*sigma2.I*(np.mat(x_test[i]-miu2).T))[0,0]-0.5*math.log(np.linalg.det(sigma2))+math.log(prior_index2)
    g3=-0.5*((np.mat(x_test[i]-miu3))*sigma3.I*(np.mat(x_test[i]-miu3).T))[0,0]-0.5*math.log(np.linalg.det(sigma3))+math.log(prior_index3)
    if g1>g2:
        max=1
        if g1>g3:
            max=1
        else:
            max=3
    else:
        max=2
        if g2>g3:
            max=2
        else:
            max=3
    predict_label.append(max)
from sklearn.metrics import accuracy_score
print (accuracy_score(predict_label,labeltest))

可以看到分类结果的准确率高达73%,这一数值在贝叶斯决策用于图像分类中已经是极值了。

原文地址:https://www.cnblogs.com/klausage/p/11790294.html

时间: 2024-10-08 14:36:06

CIFAR-10数据集图像分类【PCA+基于最小错误率的贝叶斯决策】的相关文章

基于最小错误率的贝叶斯决策

本文主要参考资料 最小错误率是在统计的意义上说的,请注意其含义. 在这里要弄清楚条件概率这个概念.P(*|#)是条件概率的通用符号,在“|”后边出现的#为条件,之前的*为某个事件,即在某条件#下出现某个事件*的概率.P(ωK|X)是表示在X出现条件下,样本为ωK类的概率. 一个事物在某条件下出现的概率P(*|#)与该事件在不带任何条件下出现的概率(写成P(*))是不相同的.例如全世界人口有60亿.因此你见到一个人在不带任何条件下,有20%的可能性是中国人P(*)=0.2,但是如果你在中国,或香港

最小错误率训练(mert)基本原理学习

在看本博文之前,最好阅读如下三篇文章: 1. Discriminative Training and Maximum Entropy Models for Statistical Machine Translation 2. Minimum Error Rate Training in Statistical Machine Translation 3. Z-MERT: A Fully Configurable Open Source Tool for Minimum Error Rate Tr

Bunch 转换为 HDF5 文件:高效存储 Cifar 等数据集

关于如何将数据集封装为 Bunch 可参考 关于 『AI 专属数据库的定制』的改进. PyTables 是 Python 与 HDF5 数据库/文件标准的结合.它专门为优化 I/O 操作的性能.最大限度地利用可用硬件而设计,并且它还支持压缩功能. 下面的代码均是在 Jupyter NoteBook 下完成的: import sys sys.path.append('E:/xinlib') from base.filez import DataBunch import tables as tb i

初学算法-基于最小堆的优先级队列C++实现

笔者近日实现了最小堆类及其派生的优先级队列,特将代码奉上,不足之处还请指出! 在实现优先级队列时,笔者表示萌萌哒没有用过template写派生类,结果写完了出现error: *** was not decleared in this scope..后来各种补上this->才完事,在CSDN(笔者的帖子地址? http://bbs.csdn.net/topics/391806995)上提问后才知道是模板参数依赖,笔者表示涨姿势了.. /**  * The Minimum Heap Class an

10款web前端基于jquery超实用jQuery插件大合集

1.纯CSS3实现多种箭头绘制及动画 今天要介绍的这款CSS3应用也非常实用,利用它可以用纯CSS3实现各种箭头的绘制,包括左右箭头.上下箭头以及各个方向的转弯箭头,另外还有一款更酷的CSS3箭头动画特效,可以用来做Loading加载动画.这么多箭头,你可以任选一个应用到项目中去. 在线演示 源码下载 2.基于jquery的手风琴显示详情 今天要各网友分享一款基于jquery的手风琴显示详情实例.当单击顶部箭头的时候,该项以手风琴的形式展示显示详情. 在线演示 源码下载 3.纯CSS3实现眨眼动

10款web前端基于Jquery的动画源码

1.使用 CSS3 动感的图片标题动画效果 在网站中,有很多地方会需要在图片上显示图片标题.使用 CSS3 过渡和变换可以实现动感的鼠标悬停显示效果.没有使用 JavaScript,所以只能在支持 CSS3 动画的现代浏览器中才能正常工作.您可以查看网页的源代码,了解动画是如何工作的. 在线演示 源码下载 2.简单的轻量级的 jQuery 仪表板插件 sDashboard 是一个轻量的仪表板 jQuery 插件,转换一个对象数组到仪表板.数组中的每个对象将被呈现为一个仪表板组件,可以通过左右拖

10款web前端基于jquery的页面代码

1.基于jquery实现的带按钮的图片左右滚动切换 jquery带按钮的图片滚动切换代码是一款jquery制作带按钮的图片左右滚动切换特效代码 在线演示 源码下载 2.基于jQuery的图片上下左右无缝连续循环滚动 imgscroll插件是一款支持图片焦点滚动(支持渐变和滚动),图片连续无缝循环滚动的js库,依赖于jQuery图片无缝连续循环滚动 支持上下左右的滚动. 在线演示 源码下载 3.jquery实现的fixed固定层时间轴动态效果 jquery实现的fixed固定层时间轴动态效果源码,

10个web前端基于jQuery动画插件及源码

1.超赞的页面加载进度自动指示和 Ajax 导航效果 在页面中引入 Pace.js 和您所选择主题的 CSS 文件,就可以让你的页面拥有漂亮的加载进度和 Ajax 导航效果.不需要挂接到任何代码,自动检测进展.您可以选择颜色和多种效果,有简约,闪光灯,MAC OSX,左侧填充,顶部填充,计数器和弹跳等等. 在线演示 源码下载 2.ProgressBar.js – 漂亮的响应式 SVG 进度条 ProgressBar.js 是一个借助动态 SVG 路径的漂亮的,响应式的进度条效果.使用 Progr

输入10个数,将其中最小的数与第一个对换,最大的数与最后一个对换

输入10个整数,将其中最小的数与第一个数对换,将最大的数与最后一个数对换. 写三个函数:1.输入10个整数 2.进行处理 3.输出10个数 #include "stdafx.h" #include<iostream> using namespace std; int array[10],*p; //第一个函数,输入数字 void shuru(int *p) { cout<<"请输入十个整数:"<<endl; for(int i=0