(dataMatIn, classLabels, C, toler, maxIter)
| 131 | 2017-09-23 |
| 132 | """ |
| 133 | def smoSimple(dataMatIn, classLabels, C, toler, maxIter): |
| 134 | #转换为numpy的mat存储 |
| 135 | dataMatrix = np.mat(dataMatIn); labelMat = np.mat(classLabels).transpose() |
| 136 | #初始化b参数,统计dataMatrix的维度 |
| 137 | b = 0; m,n = np.shape(dataMatrix) |
| 138 | #初始化alpha参数,设为0 |
| 139 | alphas = np.mat(np.zeros((m,1))) |
| 140 | #初始化迭代次数 |
| 141 | iter_num = 0 |
| 142 | #最多迭代matIter次 |
| 143 | while (iter_num < maxIter): |
| 144 | alphaPairsChanged = 0 |
| 145 | for i in range(m): |
| 146 | #步骤1:计算误差Ei |
| 147 | fXi = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[i,:].T)) + b |
| 148 | Ei = fXi - float(labelMat[i]) |
| 149 | #优化alpha,设定一定的容错率。 |
| 150 | if ((labelMat[i]*Ei < -toler) and (alphas[i] < C)) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)): |
| 151 | #随机选择另一个与alpha_i成对优化的alpha_j |
| 152 | j = selectJrand(i,m) |
| 153 | #步骤1:计算误差Ej |
| 154 | fXj = float(np.multiply(alphas,labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b |
| 155 | Ej = fXj - float(labelMat[j]) |
| 156 | #保存更新前的aplpha值,使用深拷贝 |
| 157 | alphaIold = alphas[i].copy(); alphaJold = alphas[j].copy(); |
| 158 | #步骤2:计算上下界L和H |
| 159 | if (labelMat[i] != labelMat[j]): |
| 160 | L = max(0, alphas[j] - alphas[i]) |
| 161 | H = min(C, C + alphas[j] - alphas[i]) |
| 162 | else: |
| 163 | L = max(0, alphas[j] + alphas[i] - C) |
| 164 | H = min(C, alphas[j] + alphas[i]) |
| 165 | if L==H: print("L==H"); continue |
| 166 | #步骤3:计算eta |
| 167 | eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T |
| 168 | if eta >= 0: print("eta>=0"); continue |
| 169 | #步骤4:更新alpha_j |
| 170 | alphas[j] -= labelMat[j]*(Ei - Ej)/eta |
| 171 | #步骤5:修剪alpha_j |
| 172 | alphas[j] = clipAlpha(alphas[j],H,L) |
| 173 | if (abs(alphas[j] - alphaJold) < 0.00001): print("alpha_j变化太小"); continue |
| 174 | #步骤6:更新alpha_i |
| 175 | alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j]) |
| 176 | #步骤7:更新b_1和b_2 |
| 177 | b1 = b - Ei- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T |
| 178 | b2 = b - Ej- labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j]-alphaJold)*dataMatrix[j,:]*dataMatrix[j,:].T |
| 179 | #步骤8:根据b_1和b_2更新b |
| 180 | if (0 < alphas[i]) and (C > alphas[i]): b = b1 |
| 181 | elif (0 < alphas[j]) and (C > alphas[j]): b = b2 |
| 182 | else: b = (b1 + b2)/2.0 |
| 183 | #统计优化次数 |
| 184 | alphaPairsChanged += 1 |
| 185 | #打印统计信息 |
| 186 | print("第%d次迭代 样本:%d, alpha优化次数:%d" % (iter_num,i,alphaPairsChanged)) |
| 187 | #更新迭代次数 |
| 188 | if (alphaPairsChanged == 0): iter_num += 1 |
| 189 | else: iter_num = 0 |
| 190 | print("迭代次数: %d" % iter_num) |
no test coverage detected