(self, iter = 100)
| 242 | return E2, maxIndex |
| 243 | |
| 244 | def train(self, iter = 100): |
| 245 | #iterStep:迭代次数,超过设置次数还未收敛则强制停止 |
| 246 | #parameterChanged:单次迭代中有参数改变则增加1 |
| 247 | iterStep = 0; parameterChanged = 1 |
| 248 | |
| 249 | #如果没有达到限制的迭代次数以及上次迭代中有参数改变则继续迭代 |
| 250 | #parameterChanged==0时表示上次迭代没有参数改变,如果遍历了一遍都没有参数改变,说明 |
| 251 | #达到了收敛状态,可以停止了 |
| 252 | while (iterStep < iter) and (parameterChanged > 0): |
| 253 | #打印当前迭代轮数 |
| 254 | print('iter:%d:%d'%( iterStep, iter)) |
| 255 | #迭代步数加1 |
| 256 | iterStep += 1 |
| 257 | #新的一轮将参数改变标志位重新置0 |
| 258 | parameterChanged = 0 |
| 259 | |
| 260 | #大循环遍历所有样本,用于找SMO中第一个变量 |
| 261 | for i in range(self.m): |
| 262 | #查看第一个遍历是否满足KKT条件,如果不满足则作为SMO中第一个变量从而进行优化 |
| 263 | if self.isSatisfyKKT(i) == False: |
| 264 | #如果下标为i的α不满足KKT条件,则进行优化 |
| 265 | |
| 266 | #第一个变量α的下标i已经确定,接下来按照“7.4.2 变量的选择方法”第二步 |
| 267 | #选择变量2。由于变量2的选择中涉及到|E1 - E2|,因此先计算E1 |
| 268 | E1 = self.calcEi(i) |
| 269 | |
| 270 | #选择第2个变量 |
| 271 | E2, j = self.getAlphaJ(E1, i) |
| 272 | |
| 273 | #参考“7.4.1两个变量二次规划的求解方法” P126 下半部分 |
| 274 | #获得两个变量的标签 |
| 275 | y1 = self.trainLabelMat[i] |
| 276 | y2 = self.trainLabelMat[j] |
| 277 | #复制α值作为old值 |
| 278 | alphaOld_1 = self.alpha[i] |
| 279 | alphaOld_2 = self.alpha[j] |
| 280 | #依据标签是否一致来生成不同的L和H |
| 281 | if y1 != y2: |
| 282 | L = max(0, alphaOld_2 - alphaOld_1) |
| 283 | H = min(self.C, self.C + alphaOld_2 - alphaOld_1) |
| 284 | else: |
| 285 | L = max(0, alphaOld_2 + alphaOld_1 - self.C) |
| 286 | H = min(self.C, alphaOld_2 + alphaOld_1) |
| 287 | #如果两者相等,说明该变量无法再优化,直接跳到下一次循环 |
| 288 | if L == H: continue |
| 289 | |
| 290 | #计算α的新值 |
| 291 | #依据“7.4.1两个变量二次规划的求解方法”式7.106更新α2值 |
| 292 | #先获得几个k值,用来计算事7.106中的分母η |
| 293 | k11 = self.k[i][i] |
| 294 | k22 = self.k[j][j] |
| 295 | k21 = self.k[j][i] |
| 296 | k12 = self.k[i][j] |
| 297 | #依据式7.106更新α2,该α2还未经剪切 |
| 298 | alphaNew_2 = alphaOld_2 + y2 * (E1 - E2) / (k11 + k22 - 2 * k12) |
| 299 | #剪切α2 |
| 300 | if alphaNew_2 < L: alphaNew_2 = L |
| 301 | elif alphaNew_2 > H: alphaNew_2 = H |
no test coverage detected