1. 程式人生 > >SVM numpy版本——深度學習

SVM numpy版本——深度學習

#!python
#encoding=utf-8
from numpy import *
def loadDataSet(filename):
    dataMat = [];labelMat = []
    fr = open(filename)
    for line in fr.readlines():
        lineArr = line.strip().split('\t')
        dataMat.append([float(lineArr[0]),float(lineArr[1])])
        labelMat.append(float(lineArr[2]))
    return dataMat,labelMat
 
#i為alpha下標,m是所有alpha的數目,
#意思為確定一個第i個alpha,然後在剩下的所有alpha中任選一個
def selectJrand(i,m):
    j=i
    while(j == i):
        j = int(random.uniform(0,m))
    return j
 
#用於防止alpha越過上下界h,l
def clipAlpha(aj,H,L):
    if aj > H:
        aj = H
    if L > aj:
        aj = L
    return aj
 
#簡化版的SMO演算法
'''
虛擬碼如下:
建立一個alpha向量並將其初始化為0向量
當迭代次數下雨最大迭代次數時(外迴圈)
    對資料集中的每個資料向量(內迴圈):
        如果該資料向量可以被優化:
            隨機選擇另外一個數據向量
            同時優化這兩個向量
            如果這兩個向量都不能被優化,推出內迴圈
    如果所有的向量都沒被優化,增加迭代數目,繼續下一次迴圈
'''
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
    dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose()
    b = 0; m,n = shape(dataMatrix)
    alphas = mat(zeros((m,1)))
    iter = 0
    while (iter < maxIter):
        alphaPairsChanged = 0
        for i in range(m):
            fXi = float(multiply(alphas,labelMat).T*\
                        (dataMatrix*dataMatrix[i,:].T)) + b
            Ei = fXi - float(labelMat[i])
            if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or \
                ((labelMat[i]*Ei > toler) and \
                (alphas[i] > 0)):
                j = selectJrand(i,m)
                fXj = float(multiply(alphas,labelMat).T*\
                            (dataMatrix*dataMatrix[j,:].T)) + b
                Ej = fXj - float(labelMat[j])
                alphaIold = alphas[i].copy();
                alphaJold = alphas[j].copy();
                if(labelMat[i] != labelMat[j]):
                    L = max(0, alphas[j] + alphas[i])
                    H = min(C, alphas[j] + alphas[i])
                else:
                    L = max(0, alphas[j] + alphas[i] - C)
                    H = min(C, alphas[j] + alphas[i])
                if L == H: print ("L==H");continue
                eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - \
                      dataMatrix[i,:]*dataMatrix[i,:].T - \
                      dataMatrix[j,:]*dataMatrix[j,:].T
                if eta >= 0: print ("eta>=0");continue
                alphas[j] -= labelMat[j]*(Ei - Ej)/eta
                alphas[j] = clipAlpha(alphas[j],H,L)
                if (abs(alphas[j] - alphaJold) < 0.00001 ):
                    print("j not moving enough");continue
                alphas[i] += labelMat[j]*labelMat[i]*\
                             (alphaJold - alphas[j])
                b1 = b - Ei - labelMat[i] * (alphas[i] - alphaIold)*\
                     dataMatrix[i,:]*dataMatrix[i,:].T - \
                     labelMat[j]*(alphas[j] - alphaJold)*\
                     dataMatrix[i,:]*dataMatrix[j,:].T
                b2 = b - Ej - labelMat[i]*(alphas[i] - alphaIold)*\
                     dataMatrix[i,:]*dataMatrix[j,:].T - \
                     labelMat[j]*(alphas[j] - alphaJold)*\
                     dataMatrix[j,:]*dataMatrix[j,:].T
                if (0 < alphas[i]) and (C > alphas[i]): b =b1
                elif (0 < alphas[j]) and (C > alphas[j]): b = b2
                else:
                    b=(b2 + b2)/2.0
                    alphaPairsChanged += 1
                print("iter: %d i:%d, pairs changed %d" % \
                      (iter,i,alphaPairsChanged))
        if (alphaPairsChanged == 0):iter += 1
        else: iter = 0
        print("iteration number: %d" % iter)
    return b,alphas
 
#利用完整Platt SMO演算法加速優化