机器学习:AdaBoost 算法及Python实现

AdaBoost算法

     Adaboost算法通过将多个弱学习器进行线性加权求和得到泛化能力较强的强学习器。对于该算法的数学基础以及推导过程很多书上都有讲到,不在赘述。这里主要说一下该算法的代码实现流程。
   1、构建基学习器。该基学习器为一单层决策树,对应代码中的stumpClassify()函数。该函数只能根据数据集中的某一维对数据进行分类。若一样本的该维数据小于阀值,则判定该样本为-1,若大于阀值判定样本为+1。
  2、选择能使加权错误率最小的维度与阀值。对数据集的所有维度和阀值遍历,计算每种情况下的误差,得出误差最小情况下的维度与阀值。这里的权重来自于样本权重向量D。
 3、进入主循环,设定最大基学习器的个数。当基学习器数量达到上限或者误差为0时循环停止。
 4、循环中先求出一个基学习器,根据该基学习的加权误差,来计算该基学习的权重以及更新权重向量D。具体公式如下:

                
# -*- coding: cp936 -*-
import numpy as np
from numpy import *
from math import *
def LoadData():
    data=matrix([[1.,2.1],
              [ 2. , 1.1],
              [ 1.3, 1. ],
              [ 1. , 1. ],
              [ 2. , 1. ]])
    label=np.mat([1.0,1.0,-1.0,-1.0,1.0]).T
    return data,label
def stumpClassify(dataSet,dim,thresholdValue):
    m,n=np.shape(dataSet)
    resultArray=zeros((m,1))
    for i in range(m):
        if dataSet[i,dim]>=  thresholdValue:
            resultArray[i]=1
        else:
            resultArray[i]=-1
    return resultArray
def bestStump(dataSet,label,D):#D is weight vector,cloum.label is cloum vector
    minErr=float(inf)
    numStep=10
    stump={}
    m,n=np.shape(dataSet)
    bestResult=mat(zeros((m,1)))
    for i in range(n):
        minValue=dataSet[:,i].min()
        maxValue=dataSet[:,i].max()
        minStep=float(maxValue-minValue)/numStep
        for j in range(-1,numStep+1):
            thresholdValue=minValue+float(j)*minStep
            resultArray=stumpClassify(dataSet,i,thresholdValue)
            error=mat(ones((m,1)))
            error[resultArray==label]=0
            weightError=D.T*error   #加权平均
            if weightError


你可能感兴趣的:(机器学习)