支持向量机《机器学习实战》读书笔记(数据分析学习DAY8)

今天把SMO的代码部分理解了一下,代码的理解不难,主要还是数学关系的推导。个人对于最优化方法的学习可能还远远不够。
代码和这位dalao的文章适配
https://blog.csdn.net/hx14301009/article/details/79762666
仔细阅读这位大佬的文章后确实受益匪浅。

def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
    dataMatrix = mat(dataMatIn); labelMat = mat(classLabels).transpose() #将训练数据和类别变成矩阵形式
    b = 0; m,n = shape(dataMatrix) #初始化数据,初始常数值为0,获取数据的维度
    alphas = mat(zero((m,1)))#得到数据有m条数据,个设置m个alpha的初始值
    iter = 0 #设置iter变量,当alpha遍历一次没有发生改变时,iter会加一
    while (iter < maxIter):#最外部循环,设置当几次alpha未改变的循环发生后,alpha的修正结束
        alphaPairsChanged = 0 #标记alpha是否发生变化的标签,设置初始值为0,则表示没有发生变化
        for i in range(m):#对每一个权重进行遍历修正
            fXi = float(multiply(alphas,labelMat).T*(dataMatrix[i,:].T))+b #计算当前alpha和b所得到f(x)
            Ei = fXi - float(labelMat[i])#计算得到误差
            if((labelMat[i]*Ei < -toler) and (alphas[i] < C) or ((labelMat[i]*Ei > toler) and (alphas[i] > 0)) ):#判断alpha是否满足KTT条件
                j = selectJrand(i,m)#选择第二个alpha算子
                fXj = float(multiply(alphas, labelMat).T*(dataMatrix*dataMatrix[j,:].T)) + b
                Ej = fXj - float(labelMat[j])
                alphaIold = alphas[i].copy();
                alphaJold = alphas[j].copy();
                if (labelMat[i] != labelMat[j]): #计算上下界
                    L = max(0, alphas[j] - alphas[i]);
                    H = min(C, C + alphas[j] - alphas[i]);
                else:
                    L = max(0, alphas[j] - alphas[i] - C);
                    H = min(C, alphas[j] - alphas[i]);
                if L == H: print(" L == H"); continue
                eta = 2.0 * dataMatrix[i,:]*dataMatrix[j,:].T - dataMatrix[i,:]*dataMatrix[i,:].T - dataMatrix[j,:]*dataMatrix[j,:].T#计算学习速率
                if eta >= 0 : print(" eta >= 0");continue
                alphas[j] -= labelMat[j]*(Ei - Ej)/eta#计算更新后的算子alpha
                alphas[j] = clipAlpha(alphas[j],H,L)#判断是否超出上下界
                if (abs(alphas[j] - alphaJold) < 0.00001): print("J not moving enough");continue#过少的修正也被认为没有修正发生
                alphas[i] += labelMat[j]*labelMat[i]*(alphaJold - alphas[j])
                b1 = b - Ei -labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[i,:].T - labelMat[j]*(alphas[j] - alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                b2 = b - Ej -labelMat[i]*(alphas[i]-alphaIold)*dataMatrix[i,:]*dataMatrix[j,:].T - labelMat[j]*(alphas[j] - alphaJold)*dataMatrix[i,:]*dataMatrix[j,:].T
                if((0 < alphas[i]) and (C > alphas[i])): b = b1
                elif((0 < alphas[j]) and (C > alphas[i])):b = b2
                else: b = (b1+b2)/2.0#完成b的计算
                alphaPairsChanged += 1 #发生了修正,标记为1
                print ("iter: %d i: %d , pairs changed %d" %(iter, i, alphaPairsChanged))
            if(alphaPairsChanged == 0): iter += 1
            else : iter = 0
            print ("iteration number: %d" % iter)
        return b, alphas

本文代码来源:
代码原出版书籍方已公开
https://www.manning.com/books/machine-learning-in-action

不作任何参考,仅为个人读书笔记,方便未来复习查看。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值