• 大小: 11KB
    文件类型: .zip
    金币: 1
    下载: 0 次
    发布日期: 2021-05-16
  • 语言: Python
  • 标签: SVM  

资源简介

这是一份基于支持向量机(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.xml
     文件         213  2017-08-25 16:36  SVM\.idea\misc.xml
     文件         258  2017-08-25 16:34  SVM\.idea\modules.xml
     文件         398  2017-08-25 16:36  SVM\.idea\SVM.iml
     文件       18335  2017-09-04 15:10  SVM\.idea\workspace.xml
     文件        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

评论

共有 条评论