SVM numpy版本——深度學習
阿新 • • 發佈:2018-11-07
#!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演算法加速優化