最小二乘支持向量机的分析与改进及Python实现
生活随笔
收集整理的這篇文章主要介紹了
最小二乘支持向量机的分析与改进及Python实现
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
WLSSVM最小二乘支持向量機(jī)
- 1. LSSVM的簡單理解
- 2. WLSSVM
- 3. WLSSVM的Python實(shí)現(xiàn)
1. LSSVM的簡單理解
LSSVM通過訓(xùn)練數(shù)據(jù)學(xué)習(xí)回歸方程,將自變量映射到更高維特征空間。
LSSVM回歸模型的優(yōu)化思想是使離回歸平面距離最大的樣本與回歸平面之間的距離最小。
優(yōu)化問題就轉(zhuǎn)化為:
因此,LSSVM回歸模型輸出為:
LSSVM模型的缺點(diǎn):缺少稀疏性,對于每一次預(yù)測都需要所有訓(xùn)練數(shù)據(jù)參與。
因?yàn)長SSVM模型求解中的Lagrange乘子都是非零數(shù)值,只有當(dāng)誤差變量ei的分布符合高斯分布時(shí),支持向量數(shù)值的估計(jì)才是最優(yōu)的。
2. WLSSVM
1.求解LSSVM模型的優(yōu)化問題,求解出Lagrange乘子序列和誤差ei序列。
2.將誤差ei序列變?yōu)楦咚狗植嫉拿恳粋€(gè)誤差ei的權(quán)重vi。
3.代入Vi序列,并求解WLSSVM的優(yōu)化模型。
4.模型的稀疏化。
3. WLSSVM的Python實(shí)現(xiàn)
from numpy import *def loadDataSet(filename):'''導(dǎo)入數(shù)據(jù)input: filename:文件名'''dataMat = []labelMat = []fr = open(filename)for line in fr.readlines():lineArr = line.strip().split('\t')dataMat.append(float(lineArr[0]))labelMat.append(float(lineArr[1]))return mat(dataMat).T,mat(labelMat).Tdef kernelTrans(X,A,kTup):'''數(shù)據(jù)集中每一個(gè)數(shù)據(jù)向量與A的核函數(shù)值input: X--特征數(shù)據(jù)集A--輸入向量kTup--核函數(shù)參量定義output: K--數(shù)據(jù)集中每一個(gè)數(shù)據(jù)向量與A的核函數(shù)值組成的矩陣'''X = mat(X)m,n = shape(X)K = mat(zeros((m,1)))if kTup[0] == 'lin':K = X * A.Telif kTup[0] == 'rbf':for j in range(m):deltaRow = X[j] - AK[j] = deltaRow * deltaRow.TK = exp(K/(-1 * kTup[1] ** 2))else: raise NameError('Houston We Have a Problem ,That Kernel is not recognized')return Kclass optStruct:def __init__(self,dataMatIn,classLabels,C,kTup):self.X = dataMatInself.labelMat = classLabelsself.C = Cself.m = shape(dataMatIn)[0]self.alphas = mat(zeros((self.m,1)))self.b = 0self.K = mat(zeros((self.m,self.m))) #特征數(shù)據(jù)集合中向量兩兩核函數(shù)值組成的矩陣,[i,j]表示第i個(gè)向量與第j個(gè)向量的核函數(shù)值for i in range(self.m):self.K[:,i] = kernelTrans(self.X, self.X[i,:], kTup)def leastSquares(dataMatIn,classLabels,C,kTup):'''最小二乘法求解alpha序列input:dataMatIn:特征數(shù)據(jù)集classLabels:分類標(biāo)簽集C:參數(shù),(松弛變量,允許有些數(shù)據(jù)點(diǎn)可以處于分隔面的錯(cuò)誤一側(cè))kTup: 核函數(shù)類型和參數(shù)選擇 output:b--w.T*x+b=y中的balphas:alphas序列 '''##1.參數(shù)設(shè)置oS = optStruct(dataMatIn,classLabels,C,kTup)unit = mat(ones((oS.m,1))) #[1,1,...,1].TI = eye(oS.m)zero = mat(zeros((1,1)))upmat = hstack((zero,unit.T))downmat = hstack((unit,oS.K + I/float(C)))##2.方程求解completemat = vstack((upmat,downmat)) #lssvm中求解方程的左邊矩陣rightmat = vstack((zero,oS.labelMat)) # lssvm中求解方程的右邊矩陣b_alpha = completemat.I * rightmat##3.導(dǎo)出偏置b和Lagrange乘子序列oS.b = b_alpha[0,0]for i in range(oS.m):oS.alphas[i,0] = b_alpha[i+1,0]e = oS.alphas/Creturn oS.alphas,oS.b,edef weights(e):'''計(jì)算權(quán)重序列input:e(mat):LSSVM誤差矩陣output:v(mat):權(quán)重矩陣'''##1.參數(shù)設(shè)置c1 = 2.5c2 = 3m = shape(e)[0]v = mat(zeros((m,1)))v1 = eye(m)q1 = int(m/4.0)q3 = int((m*3.0)/4.0)e1 = []shang = mat(zeros((m,1)))##2.誤差序列從小到大排列for i in range(m):e1.append(e[i,0])e1.sort()##3.計(jì)算誤差序列第三四分位與第一四分位的差IQR = e1[q3] - e1[q1]##4.計(jì)算s的值s = IQR/(2 * 0.6745)##5.計(jì)算每一個(gè)誤差對應(yīng)的權(quán)重for j in range(m):shang[j,0] = abs(e[j,0]/s)for x in range(m):if shang[x,0] <= c1:v[x,0] = 1.0if shang[x,0] > c1 and shang[x,0] <= c2:v[x,0] = (c2 - shang[x,0])/(c2 - c1)if shang[x,0] > c2:v[x,0] = 0.0001v1[x,x] = 1/float(v[x,0])return v1def weightsleastSquares(dataMatIn,classLabels,C,kTup,v1):'''最小二乘法求解alpha序列input:dataMatIn:特征數(shù)據(jù)集classLabels:分類標(biāo)簽集C:參數(shù),(松弛變量,允許有些數(shù)據(jù)點(diǎn)可以處于分隔面的錯(cuò)誤一側(cè))kTup: 核函數(shù)類型和參數(shù)選擇 output:b--w.T*x+b=y中的balphas:alphas序列 '''##1.參數(shù)設(shè)置oS = optStruct(dataMatIn,classLabels,C,kTup)unit = mat(ones((oS.m,1))) #[1,1,...,1].T#I = eye(oS.m)gamma = kTup[1]zero = mat(zeros((1,1)))upmat = hstack((zero,unit.T))downmat = hstack((unit,oS.K + v1/float(C)))##2.方程求解completemat = vstack((upmat,downmat)) #lssvm中求解方程的左邊矩陣rightmat = vstack((zero,oS.labelMat)) # lssvm中求解方程的右邊矩陣b_alpha = completemat.I * rightmat##3.導(dǎo)出偏置b和Lagrange乘子序列oS.b = b_alpha[0,0]for i in range(oS.m):oS.alphas[i,0] = b_alpha[i+1,0]e = oS.alphas/Creturn oS.alphas,oS.bdef predict(alphas,b,dataMat):'''預(yù)測結(jié)果input:alphas(mat):WLSSVM模型的Lagrange乘子序列b(float):WLSSVM模型回歸方程的偏置dataMat(mat):測試樣本集output:predict_result(mat):測試結(jié)果'''m,n = shape(dataMat)predict_result = mat(zeros((m,1)))for i in range(m):Kx = kernelTrans(dataMat,dataMat[i,:],kTup) #可以對alphas進(jìn)行稀疏處理找到更準(zhǔn)確的值 predict_result[i,0] = Kx.T * alphas + b return predict_resultdef predict_average_error(predict_result,label):'''計(jì)算平均預(yù)測誤差input:predict_result(mat):預(yù)測結(jié)果label(mat):實(shí)際結(jié)果output:average_error(float):平均誤差'''m,n = shape(predict_result)error = 0.0for i in range(m):error += abs(predict_result[i,0] - label[i,0])average_error = error / mreturn average_errorif __name__ == '__main__':##1.數(shù)據(jù)導(dǎo)入print('--------------------Load Data------------------------')dataMat,labelMat = loadDataSet('sine.txt')##2.參數(shù)設(shè)置print('--------------------Parameter Setup------------------')C = 0.6k1 = 0.3kernel = 'rbf'kTup = (kernel,k1)##3.求解LSSVM模型print('-------------------Save LSSVM Model-----------------')alphas,b,e = leastSquares(dataMat,labelMat,C,kTup)##4.計(jì)算誤差權(quán)重print('----------------Calculate Error Weights-------------')v1 = weights(e)##5.求解WLSSVM模型print('------------------Save WLSSVM Model--------------- -')alphas1,b1 = weightsleastSquares(dataMat,labelMat,C,kTup,v1)##6.預(yù)測結(jié)果print('------------------Predict Result------------------ -')predict_result = predict(alphas1,b1,dataMat)##7.平均誤差print('-------------------Average Error------------------ -')average_error = predict_average_error(predict_result,labelMat)總結(jié)
以上是生活随笔為你收集整理的最小二乘支持向量机的分析与改进及Python实现的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV中的随机数
- 下一篇: 监督学习 | ID3 决策树原理及Pyt