SVM 好难理解,之前看吴恩达的教程就一知半解的。
现在学习了《机器学习实战》,实现了一下 SMO 算法
简单版本的代码如下
def selectJRand(i, m):
j = i
while j == i:
j = int(random.uniform(0, m))
return j
def clipAlpha(aj, H, L):
if aj > H:
return H
elif aj < L:
return L
else:
return aj
def smoSimple(dataMatIn, classLabels, C, tolerateVal, maxIter):
"""
简化版 SMO 算法
:param dataMatIn: 数据集
:param classLabels: 类别标签
:param C: 常数
:param tolerateVal: 容错率、容忍值
:param maxIter: 最大循环次数
"""
dataMatrix = mat(dataMatIn)
labelMatrix = mat(classLabels).transpose()
b = 0
m, n = shape(dataMatrix)
alphas = mat(zeros((m, 1)))
iterNum = 0
while iterNum < maxIter:
alphaPairsChanged = False
for i in range(m):
# f(x_i) = w^T * x_i + b
fXi = float(multiply(alphas, labelMatrix).T * dataMatrix * dataMatrix[i, :].T) + b
Ei = fXi - float(labelMatrix[i]) # 误差
# 判断 alpha 是否可以优化,先选取违背