mnist数据集svm python_python支持向量机分类MNIST数据集

支持向量机在高维或无限维空间中构造超平面或超平面集合,其可以用于分类、回归或其他任务。直观来说,分类边界距离最近的训练数据点越远越好,因为这样可以缩小分类器的泛化误差。

调用sklearn.svm的svc函数,将MNIST数据集进行分类,并将整体分类精度输出,这里用了两种预处理的方法(将特征值变成0或者1的数;将特征值变成0-1区间的数)效果不一样,并且分别调用了两种核函数(高斯核函数和多项式核函数)。在支持向量机实验中,将训练集和测试集都等分成10份,并求十份数据集整体分类精度的平均值,这样的结果较为准确客观。可以通过修改惩罚因子C的大小来看不同的效果,并画出图进行比较,C=100的时候效果较为好。

#任务:比较不同的kernel的结果差异,并画出相应的曲线来直观的表示

import struct

from numpy import *

import numpy as np

import time

from sklearn.svm import SVC#C-Support Vector Classification

def read_image(file_name):

#先用二进制方式把文件都读进来

file_handle=open(file_name,"rb") #以二进制打开文档

file_content=file_handle.read() #读取到缓冲区中

offset=0

head = struct.unpack_from(‘>IIII‘, file_content, offset) # 取前4个整数,返回一个元组

offset += struct.calcsize(‘>IIII‘)

imgNum = head[1] #图片数

rows = head[2] #宽度

cols = head[3] #高度

images=np.empty((imgNum , 784))#empty,是它所常见的数组内的所有元素均为空,没有实际意义,它是创建数组最快的方法

image_size=rows*cols#单个图片的大小

fmt=‘>‘ + str(image_size) + ‘B‘#单个图片的format

for i in range(imgNum):

images[i] = np.array(struct.unpack_from(fmt, file_content, offset))

# images[i] = np.array(struct.unpack_from(fmt, file_content, offset)).reshape((rows, cols))

offset += struct.calcsize(fmt)

return images

#读取标签

def read_label(file_name):

file_handle = open(file_name, "rb") # 以二进制打开文档

file_content = file_handle.read() # 读取到缓冲区中

head = struct.unpack_from(‘>II‘, file_content, 0) # 取前2个整数,返回一个元组

offset = struct.calcsize(‘>II‘)

labelNum = head[1] # label数

# print(labelNum)

bitsString = ‘>‘ + str(labelNum) + ‘B‘ # fmt格式:‘>47040000B‘

label = struct.unpack_from(bitsString, file_content, offset) # 取data数据,返回一个元组

return np.array(label)

def normalize(data):#图片像素二值化,变成0-1分布

m=data.shape[0]

n=np.array(data).shape[1]

for i in range(m):

for j in range(n):

if data[i,j]!=0:

data[i,j]=1

else:

data[i,j]=0

return data

#另一种归一化的方法,就是将特征值变成[0,1]区间的数

def normalize_new(data):

m=data.shape[0]

n=np.array(data).shape[1]

for i in range(m):

for j in range(n):

data[i,j]=float(data[i,j])/255

return data

def loadDataSet():

train_x_filename="train-images-idx3-ubyte"

train_y_filename="train-labels-idx1-ubyte"

test_x_filename="t10k-images-idx3-ubyte"

test_y_filename="t10k-labels-idx1-ubyte"

train_x=read_image(train_x_filename)#60000*784 的矩阵

train_y=read_label(train_y_filename)#60000*1的矩阵

test_x=read_image(test_x_filename)#10000*784

test_y=read_label(test_y_filename)#10000*1

#可以比较这两种预处理的方式最后得到的结果

# train_x=normalize(train_x)

# test_x=normalize(test_x)

# train_x=normalize_new(train_x)

# test_x=normalize_new(test_x)

return train_x, test_x, train_y, test_y

if __name__==‘__main__‘:

classNum=10

score_train=0.0

score=0.0

temp=0.0

temp_train=0.0

print("Start reading data...")

time1=time.time()

train_x, test_x, train_y, test_y=loadDataSet()

time2=time.time()

print("read data cost",time2-time1,"second")

print("Start training data...")

# clf=SVC(C=1.0,kernel=‘poly‘)#多项式核函数

clf = SVC(C=0.01,kernel=‘rbf‘)#高斯核函数

#由于每6000个中的每个类的数量都差不多相等,所以直接按照整批划分的方法

for i in range(classNum):

clf.fit(train_x[i*6000:(i+1)*6000,:],train_y[i*6000:(i+1)*6000])

temp=clf.score(test_x[i*1000:(i+1)*1000,:], test_y[i*1000:(i+1)*1000])

# print(temp)

temp_train=clf.score(train_x[i*6000:(i+1)*6000,:],train_y[i*6000:(i+1)*6000])

print(temp_train)

score+=(clf.score(test_x[i*1000:(i+1)*1000,:], test_y[i*1000:(i+1)*1000])/classNum)

score_train+=(temp_train/classNum)

time3 = time.time()

print("score:{:.6f}".format(score))

print("score:{:.6f}".format(score_train))

print("train data cost", time3 - time2, "second")

实验结果:对二值化(normalize)后的不同核函数和C的结果进行了统计和分析。结果如下表所示:

Parameter

二值化

{ "C":1," " kernel": "poly"}

{"accuarcy":0.4312,"train time":558.61}

{"C":1, "kernel": "rbf"}

{"accuarcy":0.9212,"train time":163.15}

{"C":10, "kernel": "poly"}

{"accuarcy":0.8802,"train time":277.78}

{"C":10, "kernel": "rbf"}

{"accuarcy":0.9354,"train time":96.07}

{"C":100, "kernel": "poly"}

{"accuarcy":0.9427,"train time":146.43}

{"C":100, "kernel": "rbf"}

{"accuarcy":0.9324,"train time":163.99}

{"C":1000,"kernel":"poly"}

{"accuarcy":0.9519,"train time":132.59}

{"C":1000,"kernel":"rbf"}

{"accuarcy":0.9325,"train time":97.54}

{"C":10000,"kernel":"poly"}

{"accuarcy":0.9518,"train time":115.35}

{"C":10000,"kernel":"rbf"}

{"accuarcy":0.9325,"train time":115.77}

对于实验的优化方法,可以采用pca主成分分析方法,准确率和速度都有提升,代码如下:

结果截屏:

原文:https://www.cnblogs.com/BlueBlue-Sky/p/9382702.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/507240.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql触发器可以使用正则表达式_SQL 正则表达式及mybatis中使用正则表达式

这篇文章主要介绍了SQL 正则表达式及mybatis中使用正则表达式的方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下mysql 提供的模式匹配的其他类型是使用扩展正则表达式。当你对这类模式进行匹配测试时,使用REGEXP和NOT REGEXP操作…

python代码200行左右_200行Python代码实现2048

import cursesfrom random import randrange,chiocefrom collections import defaultdictactions[Up,Left,Down,Right,Restart,Exit]letter_codes[ord(ch) for ch in WASDRQwasdrq]action_dictdict(zip(letter_codes,actions*2))def main(stdscr):def init():#重置游戏棋盘game…

python将excel导入mysql_Python将Excel数据自动导入MySQL,python,实现,excel,到,中

废话不多说,下面附上代码。# -*- coding: utf-8 -*-"""Created on Mon Apr 20 14:18:49 2020author: admin"""import osimport pandas as pd#import cx_Oracle as cxfrom sqlalchemy import create_engineimport pymysqlfile_name[]#…

presto java_Presto Jdbc

Presto Jdbc标签(空格分隔): Presto一, 建立连接传统的JDBC方式类似,建立PrestoConnection”连接“,并且通过unwrap方法将connection转换为PrestoConnection。实际上是赋值一些基本信息,并且建立新的OkHttpClient。Str…

计算机二级java上机_计算机二级JAVA上机试题及答案

2016年9月计算机等级考试正在紧张复习中,为帮助大家进一步复习java,yjbys小编为大家带来最新java上机试题及答案如下:1. 基本操作(1小题,计30分)注意:下面出现的“考生文件夹”均为%USER%在考生文件夹中存有文件名为Ja…

java divide 用法_java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做科学计算或者是工程计算,在商…

如何反映两条曲线的拟合精度_你知道850加工中心定位精度的检测有哪些吗?

你知道850加工中心定位精度的检测有哪些吗?定位精度在机械制造上指零件或刀具等实际位置与标准位置(理论位置/理想位置)之间的差距,其差距越小,说明精度越高。定位精度是零件加工精度得以保证的前提。XFL-850加工中心的…

java ee最新_从此再无 JavaEE,现在叫 JakartaEE

各位小伙伴,你们都知道这个消息吗?Java EE 正式改名为 Jakarta EE 了。以后小伙伴们自我介绍的时候又多了一种方式。(〃▽〃) :你是做什么的?( ̄▽ ̄)~* :你好我是做 JakartaEE!Σ(っД;)っ&#…

十二月份找工作好找吗_小儿推拿师工作好找吗?工资高吗?

小儿推拿师工作好找吗?会不会学成之后找不到工作?作为现在比较热门的一个医学类职业,小儿推拿师还是比较容易找工作的,现在基本一条街上能有不低于十家小儿推拿店,而这些店里面小儿推拿师只有两三个,后面孩子还有很多…

java 单例 读写锁_终极锁实战:单JVM锁+分布式锁

目录1.前言2.单JVM锁3.分布式锁4.总结正文分割线1.前言锁就像一把钥匙,需要加锁的代码就像一个房间。出现互斥操作的典型场景:多人同时想进同一个房间争抢这个房间的钥匙(只有一把),一人抢到钥匙,其他人都等待这个人出来归还钥匙&…

怎么用python读取excel数据并导出_python怎样导入excel表格数据-如何使用python将大量数据导出到Excel中的小技巧...

如何用python将数据写入excel表格 #导入包 import xlrd #设置路径 pathC:\\Users\\jyjh\\Desktop\\datap.xlsx #打开文件 dataxlrd.open_workbook(path) #查询工作表 sheetsdata.sheets() sheets 可以通过函数、索引、名称获得工作表。 sheet_1_by_functiondata.sheets()[0] sh…

linux java socket编程_深入学习socket网络编程,以java语言为例

了解java的socket编程与Linux Socket API之间的关系一、java的网络编程1、socket原理socket通信就是通过IP和端口号将两台主机建立连接,提供通信。主机A的应用程序要能和服务器B进行通信,必须通过Socket建立连接,而建立Socket连接本质上就是依…

python去掉空白行_python去掉空白行的多种实现代码

这篇文章主要介绍了python去掉空白行实现代码,需要的朋友可以参考下 测试代码 php.txt1:www.php.cn 2:www.php.cn 3:www.php.cn 4:www.php.cn 5:www.php.cn 6:www.php.cn 7:www.php.cn 8:www.php.cn 9:www.php.cn 10:www.php.cn 11:www.php.cn 12:www.php.cn 13:www.php.cn 14:…

mysql 手动配置服务器_Win7系统下手动配置Apache+PHP+MySQL环境WEB服务器 -电脑资料...

本来想学学php,于是就想搭建web服务器和sql环境,结果浪费掉了不少时间,大致的总结下,也算是长个记性。使用的安装包分别是httpd-2.2.22-win32-x86-no_ssl .msi,php-5.2.5-Win32.zip和mysql-installer-community-5.5.28.3.msi,很显然用的还算是…

html get请求_99% 的人都理解错了 HTTP 中 GET 与 POST 的区别【面试必问】

先分析一波:1、GET和POST与数据如何传递没有关系??GET和POST是由HTTP协议定义的。那么使用哪个方式与应用层的数据如何传输是没有相互关系的。从而,HTTP就没有要求,POST一定要放到请求体里面,GET就一定要放…

java属于哪种语言_Java属于以下哪种语言( )_学小易找答案

【单选题】AT89s51单片机若晶振频率为fosc12MHz,则一个机器周期等于( ) μS。【单选题】下列选项中,不属于Java中关键字的是( )【简答题】写出力在坐标轴上投影计算的两条重要结论。【判断题】《周南桃夭》中多次出现的“宜”指的是适宜。【单选题】以下关于三元运算符的说法中…

hive load data外部表报错_生产SparkSQL如何读写本地外部数据源及排错

https://spark-packages.org/里有很多third-party数据源的package,spark把包加载进来就可以使用了csv格式在spark2.0版本之后是内置的,2.0之前属于第三方数据源一、读取本地外部数据源1.直接读取一个json文件[hadoophadoop000 bin]$ ./spark-shell --mas…

java中的throw_Java中的throw和throws之间的区别

throw和throws都是异常处理的概念,其中throw用于显式地从方法或任何代码块中引发异常,而throw在方法的签名中用于指示此方法可能抛出列出的类型之一例外。以下是throw和throws之间的重要区别。序号键扔抛出1定义Throw是一个关键字,用于在函数…

ffmpeg命令_使用ffmpeg命令为多个短视频修改视频备注说明

今天主要给大家讲一下使用视频剪辑高手中的ffmpeg命令为多个短视频修改备注说明的详细步骤,有需要和感兴趣的宝贝们可以跟随小编一起来试试。收集视频将需要剪辑的短视频保存到同一文件夹上进入软件双击进入视频剪辑高手,选择“批量剪辑视频”功能添加视…

java 开发帮助_java的简单编程请帮助

(选择题答案可能有多选)一、java基础1、下面那句话编译时不会出现警告或错误:(5分)a)floatf1.3;b)charc"a";c)byteb257;d)booleanbnull;e)inti10;2、下面哪段程序编译时不会有错...(选择题答案可能有多选)一、 java基础1、 下面那句话编译时不会出现警告或…