机器学习实战 支持向量机
来源:互联网 发布:业务流程图的软件 编辑:程序博客网 时间:2024/04/30 23:43
#!/usr/bin/env python# -*- coding: utf-8 -*-from numpy import *'''#######********************************Non-Kernel VErsions below#######********************************'''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,labelMatdef selectJrand(i,m): j=i #we want to select any J not equal to i while (j==i): j = int(random.uniform(0,m)) return jdef clipAlpha(aj,H,L): # 考虑无约束条件0<=a2<=C的解 # a2(new)= H, a2(new,unc) > H # = a2(new,unc), L <= a2(new,unc) <= H # = L, a2(new,unc) < L if aj > H: aj = H if L > aj: aj = L return ajclass optStructK: def __init__(self,dataMatIn, classLabels, C, toler): # Initialize the structure with the parameters 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))) #误差缓存 #first column is valid flag#第一列为是否有效标志位 def calcEkK(oS, k): # 分类函数 # F(X)= W.T * X + b # W.T=∑(aj*yj) X = ∑(Xj*Xi.T) # F(Xi)= ∑((aj*yj)*(Xj*Xi.T)) + b fXk = float(multiply(oS.alphas,oS.labelMat).T*(oS.X*oS.X[k,:].T)) + oS.b Ek = fXk - float(oS.labelMat[k])#误差 return Ek def selectJK(i, oS, Ei): #寻找满足条件max|E1-E2|的乘子a2 #this is the second choice -heurstic, and calcs Ej maxK = -1; maxDeltaE = 0; Ej = 0 oS.eCache[i] = [1,Ei] #set valid #choose the alpha that gives the maximum delta E validEcacheList = nonzero(oS.eCache[:,0].A)[0] if (len(validEcacheList)) > 1: for k in validEcacheList: #loop through valid Ecache values and find the one that maximizes delta E if k == i: continue #don't calc for i, waste of time Ek = calcEkK(oS, k) deltaE = abs(Ei - Ek) if (deltaE > maxDeltaE): maxK = k; maxDeltaE = deltaE; Ej = Ek return maxK, Ej else:#第一次循环 随机选择 #in this case (first time around) we don't have any valid eCache values j = selectJrand(i, oS.m) Ej = calcEkK(oS, j) return j, Ejdef updateEkK(oS, k):#after any alpha has changed update the new value in the cache Ek = calcEkK(oS, k) oS.eCache[k] = [1,Ek] def innerLK(i, oS): Ei = calcEkK(oS, i) # 第一个约束条件,存在不满足KKT条件的ai,需要更新这些ai # 不满足KKT条件的情况:yi*ui<=1且ai<C, yi*ui>=1且ai>0, yi*ui=1且ai=C 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 = selectJK(i, oS, Ei) #this has been changed from selectJrand alphaIold = oS.alphas[i].copy(); alphaJold = oS.alphas[j].copy(); # 由第二个约束条件 ∑ai*yi = 0 得 a1(new)*y1+a2(new)*y2 = a1(old)*y1+a2(odl)*y2 = ζ if (oS.labelMat[i] != oS.labelMat[j]): #当y1 != y2 ,则alphas[j] - alphas[i] = ζ L = max(0, oS.alphas[j] - oS.alphas[i]) #L = max(0,-ζ) H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i])#H = min(C,C-ζ) else: #当y1 = y2,则alphas[j] + alphas[i] = ζ L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C) #L = max(0,ζ-C) H = min(oS.C, oS.alphas[j] + oS.alphas[i]) #H = min(C,ζ) if L==H: print "L==H"; return 0 # eta是alpha[j]的最优修改量 # eta = η = 2*k(x1,x2)-k(x1,x1)-k(x2,x2) eta = 2.0 * oS.X[i,:]*oS.X[j,:].T - oS.X[i,:]*oS.X[i,:].T - oS.X[j,:]*oS.X[j,:].T if eta >= 0: print "eta>=0"; return 0 #更新a2 #a2(new,unc)=a2(old)-y2*(E1-E2)/η #无约束条件0<=a2<=C的解,即未经剪辑时的解 oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta # 考虑有约束条件0<=a2<=C的解 # a2(new)= H, a2(new,unc) > H # = a2(new,unc), L <= a2(new,unc) <= H # = L, a2(new,unc) < L oS.alphas[j] = clipAlpha(oS.alphas[j],H,L) updateEkK(oS, j) #added this for the Ecache if (abs(oS.alphas[j] - alphaJold) < 0.00001): print "j not moving enough"; return 0 # 更新a1 # a1(new) = a1(old)+y1*y2*(a2(old)-a2(new)) oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j])#update i by the same amount as j updateEkK(oS, i) #added this for the Ecache #the update is in the oppostie direction # 更新b # b1=b(old) - E1 - y1*(a1(new)-a1(old))k(x1,x1) - y2(a2(new)-a2(old))k(x1,x2) # b2=b(old) - E2 - y1*(a1(new)-a1(old))k(x1,x2) - y2(a2(new)-a2(old))k(x2,x2) b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[i,:].T - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[i,:]*oS.X[j,:].T b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.X[i,:]*oS.X[j,:].T - oS.labelMat[j]*(oS.alphas[j]-alphaJold)*oS.X[j,:]*oS.X[j,:].T # b = b1, 0<a1(new)<C # = b2, 0<a2(new)<C # = (b1+b2)/2,其他 if (0 < oS.alphas[i]) and (oS.C > oS.alphas[i]): oS.b = b1 elif (0 < oS.alphas[j]) and (oS.C > oS.alphas[j]): oS.b = b2 else: oS.b = (b1 + b2)/2.0 return 1 else: return 0def smoPK(dataMatIn, classLabels, C, toler, maxIter): #数据集 类别标签 常数C 容错律 最大循环数 #full Platt SMO oS = optStructK(mat(dataMatIn),mat(classLabels).transpose(),C,toler) iter = 0 entireSet = True; alphaPairsChanged = 0 while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)): alphaPairsChanged = 0 if entireSet: #go over all for i in range(oS.m):#self.m = shape(dataMatIn)[0]=100 alphaPairsChanged += innerLK(i,oS) print "fullSet, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged) iter += 1 else:#go over non-bound (railed) alphas nonBoundIs = nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0] for i in nonBoundIs: alphaPairsChanged += innerLK(i,oS) print "non-bound, iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged) iter += 1 if entireSet: entireSet = False #toggle entire set loop elif (alphaPairsChanged == 0): entireSet = True print "iteration number: %d" % iter return oS.b,oS.alphasdef calcWs(alphas,dataArr,classLabels): X = mat(dataArr); labelMat = mat(classLabels).transpose() m,n = shape(X) w = zeros((n,1)) for i in range(m): w += multiply(alphas[i]*labelMat[i],X[i,:].T) return wif __name__ == '__main__': dataArr, labelArr = loadDataSet('testSet.txt') b, alphas = smoPK(dataArr, labelArr, 0.6, 0.001, 40)#数据集 类别标签 常数C 容错律 最大循环数 print 'b:',b print 'alphas[alphas>0]:',alphas[alphas>0] for i in range(100): if alphas[i]>0.0: print '支持向量:', dataArr[i], labelArr[i] ws = calcWs(alphas, dataArr, labelArr) print ws datMat = mat(dataArr) print datMat[0]*mat(ws)+b, labelArr[0]
testSet.txt:
3.542485 1.977398 -1
3.018896 2.556416 -1
7.551510 -1.580030 1
2.114999 -0.004466 -1
8.127113 1.274372 1
7.108772 -0.986906 1
8.610639 2.046708 1
2.326297 0.265213 -1
3.634009 1.730537 -1
0.341367 -0.894998 -1
3.125951 0.293251 -1
阅读全文
0 0
- 机器学习实战之支持向量机
- 机器学习实战-支持向量机
- 机器学习实战 支持向量机
- 机器学习实战_06支持向量机
- 机器学习实战笔记-支持向量机
- 机器学习实战-6支持向量机
- 《机器学习实战》学习笔记:支持向量机
- Python学习-机器学习实战-ch06 支持向量机
- 《机器学习实战》学习笔记-[6]-支持向量机SMO
- 机器学习实战——第六章:支持向量机
- 【机器学习实战】第6章 支持向量机
- python机器学习实战5:支持向量机
- 机器学习实战-第六章(支持向量机)
- PYTHON机器学习实战——SVM支持向量机
- 机器学习实战【5】(SVM-支持向量机)
- 机器学习-支持向量机
- 机器学习--支持向量机
- 机器学习-支持向量机
- 变量-类型推断
- Caffe下自个儿的数据训练和测试
- POJ 2229 Sumsets 动态规划 详解
- 翻转单词顺序
- 机器人技术(8)AtdRobot摄像头开发教程
- 机器学习实战 支持向量机
- Ubuntu 14.04中docker入门之Tomcat
- git从码云上下载、更新、提交代码
- 简单的EF Code First
- 计算机角度的加减法
- jQuery——选择器,操作DOM
- 上海市2017落户政策
- Android H.265硬解码&EasyPlayerPro
- TEST()