1 2 3 4 5 6 | yI = diyObj.yMat[alphaI] EI = calcE(alphaI, diyObj) diyObj.E[alphaI] = [1, EI] # if alpha1 violates KKT if((yI * EI > diyObj.toler and diyObj.alphas[alphaI] > 0) or (yI * EI < - diyObj.toler and diyObj.alphas[alphaI] < diyObj.C)): |
1 2 3 4 5 6 7 8 | for j in nonzeroEIndex: if alphaI == j: continue EJtemp = calcE(j, diyObj) deltaE = abs(EI - EJtemp) if(deltaE > maxDelta): maxDelta = deltaE alphaJ = j EJ = EJtemp |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | alpha1old = diyObj.alphas[alphaI].copy() alpha2old = diyObj.alphas[alphaJ].copy() eta = diyObj.K[alphaI,alphaI] + diyObj.K[alphaJ, alphaJ] - 2 * diyObj.K[alphaI, alphaJ] if eta <= 0: return 0 alpha2newUnclip = alpha2old + yJ * (EI - EJ) / eta if(yI == yJ): L = max(0, alpha1old + alpha2old - diyObj.C) H = min(diyObj.C, alpha1old + alpha2old) else: L = max(0, alpha2old - alpha1old) H = min(diyObj.C, diyObj.C - alpha1old + alpha2old) if L == H: return 0 alpha2new = clipAlpha(alpha2newUnclip, L, H) if abs(alpha2new - alpha2old) < 0.00001: return 0 alpha1new = alpha1old + yI * yJ * (alpha2old - alpha2new) b1new = - EI - yI * diyObj.K[alphaI,alphaI] * (alpha1new - alpha1old) \ - yJ * diyObj.K[alphaJ, alphaI] * (alpha2new - alpha2old) + diyObj.b b2new = - EJ - yI * diyObj.K[alphaI,alphaJ] * (alpha1new - alpha1old) \ - yJ * diyObj.K[alphaJ, alphaJ] * (alpha2new - alpha2old) + diyObj.b b = calcb(b1new, b2new) |
1 2 3 4 5 6 7 8 9 10 | def transfer2Kernel(X, Xi, kernelParam): m = shape(X)[0] Ktemp = mat(zeros((m, 1))) if kernelParam[0]=="rbf": for i in range(m): xdelta = X[i,:] - Xi Ktemp = xdelta * xdelta.T Ktemp = exp(-Ktemp/kernelParam[1]**2) else: raise NameError("undefined kernel name!") return Ktemp |
1 2 3 4 5 6 7 8 9 10 11 | dataMat,yMat = loadDataset("bloodTransfusion.txt") alphas,b = smo(dataMat, yMat, 200, 0.0001,100, ("rbf",20)) #yi of testData: 1,1,1,-1,-1,-1,-1,1,1,-1 testData = [[2,50,12500,98],[0,13,3250,28],[1,16,4000,35],[1,24,6000,77],[4,4,1000,4] ,[1,12,3000,35],[4,23,5750,58],[2,7,1750,14],[2,10,2500,28],[1,13,3250,47]] m, n = shape(testData) testmat = mat(testData) for i in range(m): kernelEval = transfer2Kernel(mat(dataMat), testmat[i,:],("rbf",20)) predict = kernelEval.T * multiply(mat(yMat).transpose(), alphas) + b print(sign(predict)) |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |