MCPcopy Index your code
hub / github.com/Dod-o/Statistical-Learning-Method_Code / train

Method train

SVM/SVM.py:244–340  ·  view source on GitHub ↗
(self, iter = 100)

Source from the content-addressed store, hash-verified

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

Callers 1

SVM.pyFile · 0.80

Calls 3

isSatisfyKKTMethod · 0.95
calcEiMethod · 0.95
getAlphaJMethod · 0.95

Tested by

no test coverage detected