SVM-SMO算法python实现
生活随笔
收集整理的這篇文章主要介紹了
SVM-SMO算法python实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
支持向量機SMO算法可參照李航《統計學習方法論》一書,博客可參考:
https://blog.csdn.net/willbkimps/article/details/54697698
https://www.cnblogs.com/pinard/p/6111471.html
參考寫了一個簡易的python代碼:
# -*- coding: utf-8 -*- ''' Created on 2018年4月16日@author: Jason.F @summary: SVM -序列最小優化(Sequential Minimal Optimization,SMO),將大優化問題分解為多個小優化問題來求解。 ''' import time import os import numpy as np import randomclass SMO:def __init__(self,C,toler,maxIter):self.C=C #常數self.toler=toler#容錯率self.maxIter=maxIter#退出迭代的最大循環次數def loadDataSet(self,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,labelMatdef selectJrand(self,i,m):#隨機選擇j=iwhile (j==i):j = int(random.uniform(0,m))return jdef clipAlpha(self,aj,H,L):#最小不能超過L,最大不能超過Hif aj>H:aj = Hif L>aj:aj=Lreturn ajdef smoSimple(self,dataMatIn,classLabels):dataMatrix = np.mat(dataMatIn)labelMat = np.mat(classLabels).transpose()b=0m,n=np.shape(dataMatrix)alphas = np.mat(np.zeros((m,1)))iter=0while (iter<self.maxIter):alphaPairsChanged=0for i in range(m):fXi = float(np.multiply(alphas,labelMat).T * (dataMatrix * dataMatrix[i,:].T))+bEi = fXi- float(labelMat[i])#誤差if ( (labelMat[i]*Ei < -self.toler) and (alphas[i]<self.C)) or ((labelMat[i]*Ei >self.toler) and (alphas[i]>0)):j = self.selectJrand(i,m)fXj = float(np.multiply(alphas,labelMat).T * (dataMatrix * dataMatrix[j,:].T))+bEj = 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(self.C,self.C+alphas[j]-alphas[i]) else:L = max(0,alphas[j]+alphas[i]-self.C)H = min(self.C,alphas[j]+alphas[i]) if L==H:print 'L==H'continueeta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].Tif eta>=0:print 'eta>=0'continuealphas[j] -= labelMat[j] *(Ei - Ej)/etaalphas[j] = self.clipAlpha(alphas[j], H, L)if (abs(alphas[j]-alphaJold)<0.00001):print 'j not moving enough.'continuealphas[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,:].Tb2 = b - Ej - labelMat[i] * (alphas[i] - alphaIold) * dataMatrix[i,:]*dataMatrix[j,:].T-labelMat[j] * (alphas[j] - alphaJold) * dataMatrix[j,:]*dataMatrix[j,:].Tif (0<alphas[i]) and (self.C > alphas[i]):b =b1elif (0<alphas[j]) and (self.C >alphas[j]):b=b2else :b =(b1+b2)/2.0alphaPairsChanged +=1print 'iter: %d i: %d, pairs changed %d' % (iter,i,alphaPairsChanged)if (alphaPairsChanged ==0 ) :iter +=1else:iter =0print 'iteration number:%d'%iterreturn b,alphasif __name__ == "__main__": start = time.clock() homedir = os.getcwd()#獲取當前文件的路徑smo=SMO(C=0.6,toler=0.001,maxIter=50)#傳遞方法dataArr,labelArr = smo.loadDataSet(homedir+'/testSet.txt')b,alphas =smo.smoSimple(dataArr, labelArr)print (b)print (alphas)end = time.clock() print('finish all in %s' % str(end - start))算法的思想以及更多優化待進一步深入研究。總結
以上是生活随笔為你收集整理的SVM-SMO算法python实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【正一专栏】扶不上墙的大巴黎和自信过度的
- 下一篇: 【Deep Learning】深度学习中