(dataMatIn, classLabels, C, toler, maxIter)
| 24 | return aj |
| 25 | |
| 26 | def smoSimple(dataMatIn, classLabels, C, toler, maxIter): |
| 27 | dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose() |
| 28 | b = 0; m,n = shape(dataMatrix) |
| 29 | alphas = mat(zeros((m,1))) |
| 30 | iter = 0 |
| 31 | while (iter < maxIter): |
| 32 | alphaPairsChanged = 0 |
| 33 | for i in range(m): |
| 34 | fXi = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b |
| 35 | Ei = fXi - float(labelMat[i]) |
| 36 | if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): |
| 37 | j = selectJrand(i,m) |
| 38 | fXj = float(multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b |
| 39 | Ej = fXj - float(labelMat[j]) |
| 40 | alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy(); |
| 41 | if (labelMat[i] != labelMat[j]): |
| 42 | L = max(0, alphas[j] - alphas[i]) |
| 43 | H = min(C, C + alphas[j] - alphas[i]) |
| 44 | else: |
| 45 | L = max(0, alphas[j] + alphas[i] - C) |
| 46 | H = min(C, alphas[j] + alphas[i]) |
| 47 | if L==H: print("L==H"); continue |
| 48 | eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T |
| 49 | if eta >= 0: print("eta>=0"); continue |
| 50 | alphas[j] -= labelMat[j]*(Ei - Ej)/eta |
| 51 | alphas[j] = clipAlpha(alphas[j],H,L) |
| 52 | if (abs(alphas[j] - alphaJold) < 0.00001): print("j not moving enough"); continue |
| 53 | alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j]) |
| 54 | b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T |
| 55 | b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T |
| 56 | if (0 < alphas[i]) and (C > alphas[i]): b = b1 |
| 57 | elif (0 < alphas[j]) and (C > alphas[j]): b = b2 |
| 58 | else: b = (b1 + b2)/2.0 |
| 59 | alphaPairsChanged += 1 |
| 60 | print("iter: %d i:%d, pairs changed %d" % (iter,i,alphaPairsChanged)) |
| 61 | if (alphaPairsChanged == 0): iter += 1 |
| 62 | else: iter = 0 |
| 63 | print("iteration number: %d" % iter) |
| 64 | return b, alphas |
| 65 | |
| 66 | |
| 67 | dataArr, labelArr = loadDataSet('testSet.txt') |
no test coverage detected