adaBoosting

from numpy import *
def loadSimpleData():
    datMat=matrix(
        [[1.,2.1],
         [2.,1.1],
         [1.3,1.],
         [1.,1.],
         [2.,1.]])
    classLabels=[1.0,1.0,-1.0,-1.0,1.0]
    return datMat,classLabels

#预测分类结果,
#dataMatrix:数据集,dimen 指的是哪个feature,threshVal:在该feature上的门限,threshIneq:
def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):
    retArray=ones((shape(dataMatrix)[0],1))#返回的分类结果
    if threshIneq=='lt':
        retArray[dataMatrix[:,dimen]<=threshVal]=-1.0
    else:
        retArray[dataMatrix[:,dimen]>threshVal]=-1.0
    return retArray#返回分类结果
#dataArr:数据集
#classLabels:标签集
#D:数据集合的样本的权重
def buildStump(dataArr,classLabels,D):
    dataMatrix=mat(dataArr)
    labelMat=mat(classLabels).T
    m,n=shape(dataMatrix)
    numSteps=10.0
    bestStump={}#最好划分的各种信息:比如按照哪个feature划分,划分feature的门限,不等式,以及分类器权重alpha
    bestClasEst=mat(zeros((m,1)))#最好划分的各个样本的预测类别
    minError=inf
    for i in range(n):#在数据集的所有feature上遍历
        rangeMin=dataMatrix[:,i].min()#找到当前feature的最小值
        rangeMax=dataMatrix[:,i].max()#当前feature的最大值
        stepSize=(rangeMax-rangeMin)/numSteps#每步骤的步长
        for j in range(-1,int(numSteps)+1):
            for inequal in ['lt','gt']:
                threshVal=(rangeMin+float(j)*stepSize)
                #预测分类结果到predictedVals
                predictedVals=stumpClassify(dataMatrix,i,threshVal,inequal)
                #计算分类错误
                errArr=mat(ones((m,1)))
                errArr[predictedVals==labelMat]=0
                weightError=D.T*errArr
                if weightError<minError:
                    minError=weightError
                    bestClasEst=predictedVals.copy()#最好的分类结果
                    bestStump['dim']=i
                    bestStump['thresh']=threshVal
                    bestStump['ineq']=inequal
    #返回分类错误率minError,最佳分类信息bestStump,最佳分类结果
    return bestStump,minError,bestClasEst
#adaBoosting算法
def adaBoostTrainDS(dataArr,classLabels,numIt=40):#numIt最多有多少个弱分类器
    weakClassArr=[]#弱分类器的集合
    m=shape(dataArr)[0]
    D=mat(ones((m,1))/m)#最初的数据集中的数据的权重
    aggClassEst=mat(zeros((m,1)))
    for i in range(numIt):
        #使用弱分类器分类数据集
        bestStump,error,classEst=buildStump(dataArr,classLabels,D)
        #计算分类器的权重
        alpha=float(0.5*log((1.0-error)/max(error,1e-16)))
        bestStump['alpha']=alpha
        weakClassArr.append(bestStump)#增加新的弱分类器到集合中
        #更新数据集中数据的权重
        expon=multiply(-1*alpha*mat(classLabels).T,classEst)
        D=multiply(D,exp(expon))
        D=D/D.sum()
        #aggClassEst:表示最终的分类结果
        aggClassEst+=alpha*classEst#alpha表示分类器的权重
        #分类器的错误率
        aggErrors=multiply(sign(aggClassEst)!=mat(classLabels).T,ones((m,1)))
        errorRate=aggErrors.sum()/m#errorRage是分类的错误率
        if errorRate==0.0:#若分类错误率为0就reurn
            break;
    return weakClassArr
#adaBoosting测试数据
def adaClassify(datToClass,classfierArr):#datToClass:测试的数据集合,classifierArr:弱分类器的数组
    dataMatrix=mat(datToClass)
    m=shape(dataMatrix)[0]
    aggClassEst=mat(zeros((m,1)))
    for i in range(len(classfierArr)):
        classEst=stumpClassify(dataMatrix,classfierArr[i]['dim'],
                               classfierArr[i]['thresh'],
                               classfierArr[i]['ineq'])
        aggClassEst+=classfierArr[i]['alpha']*classEst
    return sign(aggClassEst)
dataArr,classLabels=loadSimpleData()
print dataArr
print classLabels
weakArr=adaBoostTrainDS(dataArr,classLabels)
print weakArr
print adaClassify([[5,5],[0,0]],weakArr)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值