def innerL(i, oS): Ei = calcEk(oS, i) 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)): #improve from simple SMP j, Ej = selectJ(i, oS, Ei) alphaIold = oS.alphas[i].copy() alphaJold = oS.alphas[j].copy() if (oS.labelMat[i] != oS.labelMat[j]): L = max(0, oS.alphas[j] - oS.alphas[i]) H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i]) else: L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C) H = min(oS.C, oS.alphas[j] + oS.alphas[i]) if L == H: #print "L==H" return 0 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 oS.alphas[j] -= oS.labelMat[j] * (Ei - Ej) / eta oS.alphas[j] = smo.clipAlpha(oS.alphas[j], H, L) updateEk(oS, j) if (abs(oS.alphas[j] - alphaJold) < 0.00001): #print "j not moving enough" return 0 oS.alphas[i] += oS.labelMat[j] * oS.labelMat[i] * (alphaJold - oS.alphas[j]) updateEk(oS, i) #update constant b 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 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 0
def innerL(i, oS): Ei = calcEk(oS,i) 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)): #improve from simple SMP j, Ej = selectJ(i, oS, Ei) alphaIold = oS.alphas[i].copy() alphaJold = oS.alphas[j].copy() if(oS.labelMat[i] != oS.labelMat[j]): L = max(0, oS.alphas[j] - oS.alphas[i]) H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i]) else: L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C) H = min(oS.C, oS.alphas[j] + oS.alphas[i]) if L==H: #print "L==H" return 0 #Code different from plattSMO.py eta = 2.0*oS.K[i,j] - oS.K[i,i] - oS.K[j,j] if eta >= 0: #print "eta>=0" return 0 oS.alphas[j] -= oS.labelMat[j]*(Ei - Ej)/eta oS.alphas[j] = smo.clipAlpha(oS.alphas[j], H, L) updateEk(oS,j) if(abs(oS.alphas[j] - alphaJold) < 0.00001): #print "j not moving enough" return 0 oS.alphas[i] += oS.labelMat[j]*oS.labelMat[i]*(alphaJold - oS.alphas[j]) updateEk(oS,i) #update constant b b1 = oS.b - Ei- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,i] - oS.labelMat[j]*(oS.alphas[j]- alphaJold)*oS.K[i,j] b2 = oS.b - Ej- oS.labelMat[i]*(oS.alphas[i]-alphaIold)*oS.K[i,j] - oS.labelMat[j]*(oS.alphas[j]- alphaJold)*oS.K[j,j] 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 0
def innerL(i, oS): Ei = calcEk(oS, i) 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 = selectJ(i, oS, Ei) #选择alphaJ alphaIold = oS.alphas[i].copy() alphaJold = oS.alphas[j].copy() #对最有值的边界确定 if (oS.labelMat[i] != oS.labelMat[j]): L = max(0, oS.alphas[j] - oS.alphas[i]) H = min(oS.C, oS.C + oS.alphas[j] - oS.alphas[i]) else: L = max(0, oS.alphas[j] + oS.alphas[i] - oS.C) H = min(oS.C, oS.alphas[j] + oS.alphas[i]) if L == H: print("L==H") return 0 #eta = 2.0*oS.X[i,:]*oS.X[j,:].T-oS.X[i,:]*oS.X[i,:].T- oS.X[j,:]*oS.X[j,:].T eta = 2.0 * oS.K[i, j] - oS.K[i, i] - oS.K[j, j] #<统计学习方法>Page128 if eta >= 0: print("eta>=0") return 0 oS.alphas[j] -= oS.labelMat[j] * (Ei - Ej) / eta oS.alphas[j] = SMO.clipAlpha(oS.alphas[j], H, L) #将alphaJ限定在[L,H]之间 更新alphas[j] updateEk(oS, j) if (abs(oS.alphas[j] - alphaJold) < 0.00001): print("j not moving enough!") return 0 oS.alphas[i] += oS.labelMat[j] * oS.labelMat[i] * ( alphaJold - oS.alphas[j]) #更新alpha[i] updateEk(oS, i) b1 = oS.b - Ei - oS.labelMat[i] * (oS.alphas[i] - alphaIold) * oS.K[ i, i] - oS.labelMat[j] * (oS.alphas[j] - alphaJold) * oS.K[i, j] b2 = oS.b - Ej - oS.labelMat[i] * (oS.alphas[i] - alphaIold) * oS.K[ i, j] - oS.labelMat[j] * (oS.alphas[j] - alphaJold) * oS.K[j, j] # 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 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 0