#the same as simple smodefselectJrand(i, m):"""
随机选择一个整数
Args:
i 第一个alpha的下标
m 所有alpha的数目
Returns:
j 返回一个不为i的随机数,在0~m之间的整数值
"""
j = i
while j == i:
j =int(random.uniform(0, m))return j
#the same as simple smodefclipAlpha(aj, H, L):"""clipAlpha(调整aj的值,使aj处于 L<=aj<=H)
Args:
aj 目标值
H 最大值
L 最小值
Returns:
aj 目标值
"""if aj > H:
aj = H
if L > aj:
aj = L
return aj
#EK计算较多,所以单独拎出来defcalcEk(oS, k):"""calcEk(求 Ek误差:预测值-真实值的差)
该过程在完整版的SMO算法中陪出现次数较多,因此将其单独作为一个方法
Args:
oS optStruct对象
k 具体的某一行
Returns:
Ek 预测结果与真实结果比对,计算误差Ek
"""
fXk =float(multiply(oS.alphas, oS.labelMat).T *(oS.X * oS.X[k,:].T))+ oS.b
Ek = fXk -float(oS.labelMat[k])return Ek
#platt-smo重点#在选择第2个alphas参数时(也就是进行SMO的内循环时),不再是随机选择,而是选择最长步长的那个(就是选择|E_i-Ej|最大的)defselectJ(i, oS, Ei):# this is the second choice -heurstic, and calcs Ej"""selectJ(返回最优的j和Ej)
内循环的启发式方法。
选择第二个(内循环)alpha的alpha值
这里的目标是选择合适的第二个alpha值以保证每次优化中采用最大步长。
该函数的误差与第一个alpha值Ei和下标i有关。
Args:
i 具体的第i一行
oS optStruct对象
Ei 预测结果与真实结果比对,计算误差Ei
Returns:
j 随机选出的第j一行
Ej 预测结果与真实结果比对
,计算误差Ej
"""
maxK =-1
maxDeltaE =0
Ej =0# 首先将输入值Ei在缓存中设置成为有效的。这里的有效意味着它已经计算好了。
oS.eCache[i]=[1, Ei]# print 'oS.eCache[%s]=%s' % (i, oS.eCache[i])# print 'oS.eCache[:, 0].A=%s' % oS.eCache[:, 0].A.T# """# # 返回非0的:行列值