资源简介
这是一份基于支持向量机(SVM)的手写字体识别源代码(Python版本),目前只支持二分类识别。实现了快速SMO算法。
代码片段和文件信息
# coding=gbk
from numpy import *
import datetime
from os import listdir
from PIL import Image
# 随机选取
def selectJrand(i m):
j = i
while j == i:
j = int(random.uniform(0 m))
return j
# 剪切 alpha 使其符合取值范围
def clipAlpha(aj H L):
if aj > H:
aj = H
if L > aj:
aj = L
return aj
# 核函数 X,A:输入向量 kTup:核函数类型
def kernelTrans(X A kTup):
m n = shape(X)
K = mat(zeros((m 1)))
if kTup[0] == ‘lin‘:
K = X * A.T # 线性核 计算内积
elif kTup[0] == ‘rbf‘:
for j in range(m): # 径向基核函数
deltaRow = X[j :] - A
K[j] = deltaRow * deltaRow.T
K = exp(K / (-1 * kTup[1] ** 2))
else:
raise NameError(‘Kernel is not recognized‘)
return K
class optStruct:
def __init__(self dataMatIn classLabels C toler kTup):
self.X = dataMatIn
self.labelMat = classLabels
self.C = C
self.tol = toler
self.m = shape(dataMatIn)[0]
self.alphas = mat(zeros((self.m 1)))
self.b = 0
self.eCache = mat(zeros((self.m 2))) # 第一列是有效的标志位 第二列是实际偏差值
self.K = mat(zeros((self.m self.m)))
for i in range(self.m):
self.K[: i] = kernelTrans(self.X self.X[i :] kTup)
# 计算误差 计算值-标签值
def calcEk(oS k):
fXk = float(multiply(oS.alphas oS.labelMat).T * oS.K[: k] + oS.b)
Ek = fXk - float(oS.labelMat[k])
return Ek
# 查询alpha2 使得 alpha1 与 alpha2 的 △E 最大
def selectJ(i oS Ei):
maxK = -1
maxDeltaE = 0
Ej = 0
oS.eCache[i] = [1 Ei]
validEcacheList = nonzero(oS.eCache[: 0].A)[0] # 得到E值有效的位置
if (len(validEcacheList)) > 1:
for k in validEcacheList:
if k == i: continue
Ek = calcEk(oS k)
deltaE = abs(Ei - Ek)
if deltaE > maxDeltaE:
maxK = k
maxDeltaE = deltaE
Ej = Ek
return maxK Ej
else: # 第一次循环时 没有E值有效 随机选择一个J
j = selectJrand(i oS.m)
Ej = calcEk(oS j)
return j Ej
# alpha 改变后 更新E值
def updateEk(oS k):
Ek = calcEk(oS k)
oS.eCache[k] = [1 Ek]
# alpha 内循环 有 alpha 成功改变 返回1 否则返回0
def innerL(i oS):
Ei = calcEk(oS i)
if ((oS.labelMat[i] * Ei < -oS.tol) and (oS.alphas[i] < oS.C)) or (
(oS.labelMat[i] * Ei > oS.tol) and (oS.alphas[i] > 0)):
j Ej = selectJ(i oS Ei)
alphaIold = oS.alphas[i].copy()
alphaJold = oS.alphas[j].copy()
if oS.labelMat[i] != oS.labelMat[j]:
L = max(0 oS.alphas[j] - oS.alphas[i])
H = min(oS.C oS.C + oS.alphas[j] - oS.alphas[i])
else:
L = max(0 oS.alphas[j] + oS.alphas[i] - oS.C)
H = min(oS.C oS.alphas[j] + oS.alphas[i])
if L == H:
return 0
eta = 2.0 * oS.K[i j] - oS.K[i i] - oS.K[j j]
if eta >= 0:
return 0
oS.alpha
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
目录 0 2017-09-07 20:08 SVM\
目录 0 2017-09-04 15:10 SVM\.idea\
目录 0 2017-08-25 17:10 SVM\.idea\inspectionProfiles\
文件 410 2017-08-25 17:10 SVM\.idea\inspectionProfiles\Project_Default.xm
文件 213 2017-08-25 16:36 SVM\.idea\misc.xm
文件 258 2017-08-25 16:34 SVM\.idea\modules.xm
文件 398 2017-08-25 16:36 SVM\.idea\SVM.iml
文件 18335 2017-09-04 15:10 SVM\.idea\workspace.xm
文件 8614 2017-09-07 19:53 SVM\SMO.py
文件 8206 2017-09-07 19:53 SVM\SMO.pyc
文件 167 2017-09-07 20:08 SVM\SVM.py
相关资源
- SVM实现文本分类代码
- LSSVM_python_example.zip
- python中使用libsvm库64位libsvm.dll文件
- 支持向量机SVM求解鸢尾花分类问题(
- python svm算法源码
- 基于Python的SVM解决异或问题
- ga_aco_opt_on_anfis_svm-master 采用GA、ACO分
- python粒子群算法优化svm模型
- pima_data.csv印第安人糖尿病数据集
- SVM支持向量机(python)
- python Support Vector Machine(SVM)
- svm-simple.py(matplotlib)
- 机器学习实战python2SVM与核函数 训练数
- sift_kmeans_svm
- SVM代码_python
- Python实现基于SVM的有效手写识别程序
- 粒子群优化SVM.rar
- SVM算法Python实现
- 机器学习经典分类算法
- 对泰坦尼克号数据集的简单分析决策
- 简单SVM支持向量机Python代码
- libsvm gridregression.py
评论
共有 条评论