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

mnist数据集svmpython_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=ad() #读取到缓冲区中
offset=0
head = struct.unpack_from(‘>IIII‘, file_content, offset) # 取前4个整数,返回⼀个元组
offset += struct.calcsize(‘>IIII‘)
imgNum = head[1] #图⽚数
rows = head[2] #宽度
cols = head[3] #⾼度
pty((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 = ad() # 读取到缓冲区中
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__‘:北京scc
classNum=10
score_train=0.0
score=0.0
temp=0.0
temp_train=0.0
print("Start ")
time1=time.time()
train_x, test_x, train_y, test_y=loadDataSet()
time2=time.time()
print("read data cost",time2-time1,"second")
print("Start ")
# 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主成分分析⽅法,准确率和速度都有提升,代码如下:结果截屏:

本文发布于:2024-09-21 19:41:32,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/570082.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:结果   分类   数据   变成   超平   分析   效果   读取
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议