使用支持向量机训练mnist数据

  1 # encoding: utf-8
  2 import numpy as np
  3 import matplotlib.pyplot as plt
  4 import cPickle
  5 import gzip
  6
  7 class SVC(object):
  8     def __init__(self, c=1.0, delta=0.001):  # 初始化
  9         self.N = 0
 10         self.delta = delta
 11         self.X = None
 12         self.y = None
 13         self.w = None
 14         self.wn = 0
 15         self.K = np.zeros((self.N, self.N))
 16         self.a = np.zeros((self.N, 1))
 17         self.b = 0
 18         self.C = c
 19         self.stop=1
 20         self.k=0
 21         self.cls=0
 22         self.train_result=[]
 23
 24     def kernel_function(self,x1, x2):  # 核函数
 25         return np.dot(x1, x2)
 26
 27     def kernel_matrix(self, x):  # 核矩阵
 28         for i in range(0, len(x)):
 29             for j in range(i, len(x)):
 30                 self.K[j][i] = self.K[i][j] = self.kernel_function(self.X[i], self.X[j])
 31
 32     def get_w(self):  # 计算更新w
 33         ay = self.a * self.y
 34         w = np.zeros((1, self.wn))
 35         for i in range(0, self.N):
 36             w += self.X[i] * ay[i]
 37         return w
 38
 39     def get_b(self, a1, a2, a1_old, a2_old):  # 计算更新B
 40         y1 = self.y[a1]
 41         y2 = self.y[a2]
 42         a1_new = self.a[a1]
 43         a2_new = self.a[a2]
 44         b1_new = -self.E[a1] - y1 * self.K[a1][a1] * (a1_new - a1_old) - y2 * self.K[a2][a1] * (
 45             a2_new - a2_old) + self.b
 46         b2_new = -self.E[a2] - y1 * self.K[a1][a2] * (a1_new - a1_old) - y2 * self.K[a2][a2] * (
 47             a2_new - a2_old) + self.b
 48         if (0 < a1_new) and (a1_new < self.C) and (0 < a2_new) and (a2_new < self.C):
 49             return b1_new[0]
 50         else:
 51             return (b1_new[0] + b2_new[0]) / 2.0
 52
 53     def gx(self, x):  # 判别函数g(x)
 54         return np.dot(self.w, x) + self.b
 55
 56     def satisfy_kkt(self, a):  # 判断样本点是否满足kkt条件
 57         index = a[1]
 58         if a[0] == 0 and self.y[index] * self.gx(self.X[index]) > 1:
 59             return 1
 60         elif a[0] < self.C and self.y[index] * self.gx(self.X[index]) == 1:
 61             return 1
 62         elif a[0] == self.C and self.y[index] * self.gx(self.X[index]) < 1:
 63             return 1
 64         return 0
 65
 66     def clip_func(self, a_new, a1_old, a2_old, y1, y2):  # 拉格朗日乘子的裁剪函数
 67         if (y1 == y2):
 68             L = max(0, a1_old + a2_old - self.C)
 69             H = min(self.C, a1_old + a2_old)
 70         else:
 71             L = max(0, a2_old - a1_old)
 72             H = min(self.C, self.C + a2_old - a1_old)
 73         if a_new < L:
 74             a_new = L
 75         if a_new > H:
 76             a_new = H
 77         return a_new
 78
 79     def update_a(self, a1, a2):  # 更新a1,a2
 80         partial_a2 = self.K[a1][a1] + self.K[a2][a2] - 2 * self.K[a1][a2]
 81         if partial_a2 <= 1e-9:
 82             print "error:", partial_a2
 83         a2_new_unc = self.a[a2] + (self.y[a2] * ((self.E[a1] - self.E[a2]) / partial_a2))
 84         a2_new = self.clip_func(a2_new_unc, self.a[a1], self.a[a2], self.y[a1], self.y[a2])
 85         a1_new = self.a[a1] + self.y[a1] * self.y[a2] * (self.a[a2] - a2_new)
 86         if abs(a1_new - self.a[a1]) < self.delta:
 87             return 0
 88         self.a[a1] = a1_new
 89         self.a[a2] = a2_new
 90         self.is_update = 1
 91         return 1
 92
 93     def update(self, first_a):  # 更新拉格朗日乘子
 94         for second_a in range(0, self.N):
 95             if second_a == first_a:
 96                 continue
 97             a1_old = self.a[first_a]
 98             a2_old = self.a[second_a]
 99             if self.update_a(first_a, second_a) == 0:
100                 return
101             self.b= self.get_b(first_a, second_a, a1_old, a2_old)
102             self.w = self.get_w()
103             self.E = [self.gx(self.X[i]) - self.y[i] for i in range(0, self.N)]
104             self.stop=0
105
106     def train(self, x, y, max_iternum=100):  # SMO算法
107         x_len = len(x)
108         self.X = x
109         self.N = x_len
110         self.wn = len(x[0])
111         self.y = np.array(y).reshape((self.N, 1))
112         self.K = np.zeros((self.N, self.N))
113         self.kernel_matrix(self.X)
114         self.b = 0
115         self.a = np.zeros((self.N, 1))
116         self.w = self.get_w()
117         self.E = [self.gx(self.X[i]) - self.y[i] for i in range(0, self.N)]
118         self.is_update = 0
119         for i in range(0, max_iternum):
120             self.stop=1
121             data_on_bound = [[x,y] for x,y in zip(self.a, range(0, len(self.a))) if x > 0 and x< self.C]
122             if len(data_on_bound) == 0:
123                 data_on_bound = [[x,y] for x,y in zip(self.a, range(0, len(self.a)))]
124             for data in data_on_bound:
125                 if self.satisfy_kkt(data) != 1:
126                     self.update(data[1])
127             if self.is_update == 0:
128                 for data in [[x,y] for x,y in zip(self.a, range(0, len(self.a)))]:
129                     if self.satisfy_kkt(data) != 1:
130                         self.update(data[1])
131             if self.stop:
132                 break
133         return self.w, self.b
134
135     def fit(self,x, y):  # 训练模型
136         self.cls, y = np.unique(y, return_inverse=True)
137         self.k=len(self.cls)
138         for i in range(self.k):
139             for j in range(i):
140                 a,b=self.sub_data(x,y,i,j)
141                 self.train_result.append([i,j,self.train(a,b)])
142
143     def predict(self,x_new):  # 预测
144          p=np.zeros(self.k)
145          for i,j,w in self.train_result:
146              self.w=w[0]
147              self.b=w[1]
148              if self.classfy(x_new)==1:
149                  p[j]+=1
150              else:
151                  p[i]+=1
152          return self.cls[np.argmax(p)]
153
154     def sub_data(self,x,y,i,j):  # 数据分类
155         subx=[]
156         suby=[]
157         for a,b in zip(x,y):
158             if b==i:
159                  subx.append(a)
160                  suby.append(-1)
161             elif b==j:
162                  subx.append(a)
163                  suby.append(1)
164         return subx,suby
165
166     def classfy(self,x_new):  # 预测
167         y_new=self.gx(x_new)
168         cl = int(np.sign(y_new))
169         if cl == 0:
170             cl = 1
171         return cl
172
173
174 def load_data():
175     f = gzip.open(‘../data/mnist.pkl.gz‘, ‘rb‘)
176     training_data, validation_data, test_data = cPickle.load(f)
177     f.close()
178     return (training_data, validation_data, test_data)
179
180 if __name__ == "__main__":
181     svc = SVC()
182     np.random.seed(0)
183     l=1000
184     training_data, validation_data, test_data = load_data()
185     svc.fit(training_data[0][:l],training_data[1][:l])
186     predictions = [svc.predict(a) for a in test_data[0][:l]]
187     num_correct = sum(int(a == y) for a, y in zip(predictions, test_data[1][:l]))
188     print "%s of %s values correct." % (num_correct, len(test_data[1][:l]))  #72/100  #808/1000  #8194/10000(较慢)
时间: 2024-10-21 07:08:54

使用支持向量机训练mnist数据的相关文章

使用tensorflow操作MNIST数据

本节开始学习使用tensorflow教程,当然从最简单的MNIST开始.这怎么说呢,就好比编程入门有Hello World,机器学习入门有MNIST.在此节,我将训练一个机器学习模型用于预测图片里面的数字. MNIST 是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用做深度学习的入门样例.而Tensorflow的封装让MNIST数据集变得更加方便.MNIST是NIST数据集的一个子集,它包含了60000张图片作为训练数据,10000张图片作为测试数据.在MNIST数据集中的

【OpenCV】opencv3.0中的SVM训练 mnist 手写字体识别

前言: SVM(支持向量机)一种训练分类器的学习方法 mnist 是一个手写字体图像数据库,训练样本有60000个,测试样本有10000个 LibSVM 一个常用的SVM框架 OpenCV3.0 中的ml包含了很多的ML框架接口,就试试了. 详细的OpenCV文档:http://docs.opencv.org/3.0-beta/doc/tutorials/ml/introduction_to_svm/introduction_to_svm.html mnist数据下载:http://yann.l

CAFFE学习笔记(一)Caffe_Example之训练mnist

0.参考文献 [1]caffe官网<Training LeNet on MNIST with Caffe>; [2]薛开宇<读书笔记4学习搭建自己的网络MNIST在caffe上进行训练与学习>([1]的翻译版,同时还有作者的一些注解,很赞); 1.*.sh文件如何执行? ①方法一:有sh后缀名的是linux脚本文件,在windows下为了执行这个文件,应该下载Git.然后对于sh文件右键,打开方式,选择git-bash.exe. ②方法二:直接将后缀名改成“bat”然后双击. 2.

使用caffe训练mnist数据集 - caffe教程实战(一)

个人认为学习一个陌生的框架,最好从例子开始,所以我们也从一个例子开始. 学习本教程之前,你需要首先对卷积神经网络算法原理有些了解,而且安装好了caffe 卷积神经网络原理参考:http://cs231n.stanford.edu/syllabus.html Ubuntu安装caffe教程参考:http://caffe.berkeleyvision.org/install_apt.html 先讲解一下caffe设计的架构吧: 训练mnist数据集使用 build/tools/caffe 训练步骤:

python用K近邻(KNN)算法分类MNIST数据集和Fashion MNIST数据集

一.KNN算法的介绍 K最近邻(k-Nearest Neighbor,KNN)分类算法是最简单的机器学习算法之一,理论上比较成熟.KNN算法首先将待分类样本表达成和训练样本一致的特征向量:然后根据距离计算待测试样本和每个训练样本的距离,选择距离最小的K个样本作为近邻样本:最后根据K个近邻样本判断待分类样本的类别.KNN算法的正确选取是分类正确的关键因素之一,而近邻样本是通过计算测试样本与每个训练集样本的距离来选定的,故定义合适的距离是KNN正确分类的前提. 本文中在上述研究的基础上,将特征属性值

TensorFlow 训练 MNIST (1)—— softmax 单层神经网络

1.MNIST数据集简介 首先通过下面两行代码获取到TensorFlow内置的MNIST数据集: from tensorflow.examples.tutorials.mnist import input_data mnist = input_data.read_data_sets('./data/mnist', one_hot=True) MNIST数据集共有55000(mnist.train.num_examples)张用于训练的数据,对应的有55000个标签:共有10000(mnist.t

TensorFlow训练MNIST数据集(3) —— 卷积神经网络

前面两篇随笔实现的单层神经网络 和多层神经网络, 在MNIST测试集上的正确率分别约为90%和96%.在换用多层神经网络后,正确率已有很大的提升.这次将采用卷积神经网络继续进行测试. 1.模型基本结构 如下图所示,本次采用的模型共有8层(包含dropout层).其中卷积层和池化层各有两层. 在整个模型中,输入层负责数据输入:卷积层负责提取图片的特征:池化层采用最大池化的方式,突出主要特征,并减少参数维度:全连接层再将个特征组合起来:dropout层可以减少每次训练的计算量,并可以一定程度上避免过

tensorflow 全连接神经网络识别mnist数据

之前没有学过tensorflow,所以使用tensorflow来对mnist数据进行识别,采用最简单的全连接神经网络,第一层是784,(输入层),隐含层是256,输出层是10 ,相关注释卸载程序中. 1 #!/usr/bin/env python 3.6 2 #_*_coding:utf-8 _*_ 3 #@Time    :2020/2/12 15:34 4 #@Author  :hujinzhou  5 #@FileName: mnist.py 6 7 #@Software: PyCharm

百度DMLC分布式深度机器学习开源项目(简称“深盟”)上线了如xgboost(速度快效果好的Boosting模型)、CXXNET(极致的C++深度学习库)、Minerva(高效灵活的并行深度学习引擎)以及Parameter Server(一小时训练600T数据)等产品,在语音识别、OCR识别、人脸识别以及计算效率提升上发布了多个成熟产品。

百度为何开源深度机器学习平台? 有一系列领先优势的百度却选择开源其深度机器学习平台,为何交底自己的核心技术?深思之下,却是在面对业界无奈时的远见之举. 5月20日,百度在github上开源了其深度机器学习平台.此番发布的深度机器学习开源平台属于"深盟"的开源组织,其核心开发者来自百度深度学习研究院(IDL),微软亚洲研究院.华盛顿大学.纽约大学.香港科技大学,卡耐基·梅陇大学等知名公司和高校. 通过这一开源平台,世界各地的开发者们可以免费获得更优质和更容易使用的分布式机器学习算法源码,