首页 > 编程语言 >简单易学的机器学习算法——AdaBoost

简单易学的机器学习算法——AdaBoost

时间:2023-06-28 15:34:02浏览次数:45  
标签:mat bestClasEst classLabels 算法 AdaBoost alpha threshold dataMat 易学

简单易学的机器学习算法——AdaBoost_权重

简单易学的机器学习算法——AdaBoost_机器学习_02

是符号函数。具体过程可见下图所示:

简单易学的机器学习算法——AdaBoost_机器学习算法_03


(图片来自参考文件1)




三、AdaBoost算法流程


    上述为AdaBoost的基本原理,下面给出AdaBoost算法的流程:


简单易学的机器学习算法——AdaBoost_权重_04


(来自参考文献2)



四、实际的例子


    AdaBoost 算法是一种具有很高精度的分类器,其实 AdaBoost 算法提供的是一种框架,在这种框架下,我们可以使用不同的弱分类器,通过 AdaBoost 框架构建出强分类器。下面我们使用单层决策树构建一个分类器处理如下的分类问题:


简单易学的机器学习算法——AdaBoost_决策树_05


决策树算法主要有 ID3 , C4.5 和 CART ,其中 ID3 和 C4.5 主要用于分类, CART 可以解决回归问题。 ID3 算法可见博文“简单易学的机器学习算法——决策树之ID3算法”, CART 算法可见博文“简单易学的机器学习算法——CART之回归树”。对于单层决策树是无法求解上面这样的问题的。




Python 代码


#coding:UTF-8
'''
Created on 2015年6月15日

@author: zhaozhiyong

'''

from numpy import *

def loadSimpleData():
    datMat = mat([[1., 2.1],
                  [2., 1.1],
                  [1.3, 1.],
                  [1., 1.],
                  [2., 1.]])
    classLabels = mat([1.0, 1.0, -1.0, -1.0, 1.0])
    return datMat, classLabels

def singleStumpClassipy(dataMat, dim, threshold, thresholdIneq):
    classMat = ones((shape(dataMat)[0], 1))
    #根据thresholdIneq划分出不同的类,在'-1'和'1'之间切换
    if thresholdIneq == 'left':#在threshold左侧的为'-1'
        classMat[dataMat[:, dim] <= threshold] = -1.0
    else:
        classMat[dataMat[:, dim] > threshold] = -1.0
    
    return classMat

def singleStump(dataArr, classLabels, D):
    dataMat = mat(dataArr)
    labelMat = mat(classLabels).T
    m, n = shape(dataMat)
    numSteps = 10.0
    bestStump = {}
    bestClasEst = zeros((m, 1))
    minError = inf
    for i in xrange(n):#对每一个特征
        #取第i列特征的最小值和最大值,以确定步长
        rangeMin = dataMat[:, i].min()
        rangeMax = dataMat[:, i].max()
        stepSize = (rangeMax - rangeMin) / numSteps
        for j in xrange(-1, int(numSteps) + 1):
            #不确定是哪个属于类'-1',哪个属于类'1',分两种情况
            for inequal in ['left', 'right']:
                threshold = rangeMin + j * stepSize#得到每个划分的阈值
                predictionClass = singleStumpClassipy(dataMat, i, threshold, inequal)
                errorMat = ones((m, 1))
                errorMat[predictionClass == labelMat] = 0
                weightedError = D.T * errorMat#D是每个样本的权重
                if weightedError < minError:
                    minError = weightedError
                    bestClasEst = predictionClass.copy()
                    bestStump['dim'] = i
                    bestStump['threshold'] = threshold
                    bestStump['inequal'] = inequal
    
    return bestStump, minError, bestClasEst

def adaBoostTrain(dataArr, classLabels, G):
    weakClassArr = []
    m = shape(dataArr)[0]#样本个数
    #初始化D,即每个样本的权重
    D = mat(ones((m, 1)) / m)
    aggClasEst = mat(zeros((m, 1)))
    
    for i in xrange(G):#G表示的是迭代次数
        bestStump, minError, bestClasEst = singleStump(dataArr, classLabels, D)
        print 'D:', D.T
        #计算分类器的权重
        alpha = float(0.5 * log((1.0 - minError) / max(minError, 1e-16)))
        bestStump['alpha'] = alpha
        weakClassArr.append(bestStump)
        print 'bestClasEst:', bestClasEst.T
        
        #重新计算每个样本的权重D
        expon = multiply(-1 * alpha * mat(classLabels).T, bestClasEst)
        D = multiply(D, exp(expon))
        D = D / D.sum()
        
        aggClasEst += alpha * bestClasEst
        print 'aggClasEst:', aggClasEst
        aggErrors = multiply(sign(aggClasEst) != mat(classLabels).T, ones((m, 1)))
        errorRate = aggErrors.sum() / m
        print 'total error:', errorRate
        if errorRate == 0.0:
            break
    return weakClassArr

def adaBoostClassify(testData, weakClassify):
    dataMat = mat(testData)
    m = shape(dataMat)[0]
    aggClassEst = mat(zeros((m, 1)))
    for i in xrange(len(weakClassify)):#weakClassify是一个列表
        classEst = singleStumpClassipy(dataMat, weakClassify[i]['dim'], weakClassify[i]['threshold'], weakClassify[i]['inequal'])
        aggClassEst += weakClassify[i]['alpha'] * classEst
        print aggClassEst
    return sign(aggClassEst)
            
if __name__ == '__main__':
    datMat, classLabels = loadSimpleData()
    weakClassArr = adaBoostTrain(datMat, classLabels, 30)
    print "weakClassArr:", weakClassArr
    #test
    result = adaBoostClassify([1, 1], weakClassArr)
    print result




weakClassArr: [{'threshold': 1.3, 'dim': 0, 'inequal': 'left', 'alpha': 0.6931471805599453}, {'threshold': 1.0, 'dim': 1, 'inequal': 'left', 'alpha': 0.9729550745276565}, {'threshold': 0.90000000000000002, 'dim': 0, 'inequal': 'left', 'alpha': 0.8958797346140273}]




参考


1、机器学习实战


2、A Short Introduction to Boosting

标签:mat,bestClasEst,classLabels,算法,AdaBoost,alpha,threshold,dataMat,易学
From: https://blog.51cto.com/u_16161414/6572492

相关文章

  • 优化算法——截断梯度法(TG)
    一、L1正则的表达形式  在机器学习中,几乎无人不知无人不晓L1正则与L2正则,L1正则与L2正则都有参数控制的作用,对模型起到约束的作用,防止过拟合。但是L1正则与L2正则也有区别,L1正则更容易产生稀疏解,使得某些参数等于0,而L2正则却没有这样的优势,只能使得参数趋近于0。利用这样的优势......
  • ​​动态规划算法
    以下是一个用C++实现的动态规划算法来解决最长子序列问题(LongestCommonSubsequence)的示例代码:#include<iostream>#include<vector>#include<algorithm>usingnamespacestd;intlongestCommonSubsequence(stringtext1,stringtext2){intm=text1.length();......
  • 【算法】根据输入的正整数,重新排列生成一个更大的数字
    需求:创建一个函数,该函数取一个正整数,并返回下一个较大的数字,该数字可以通过重新排列其数字来形成。例如:12===>21513==>5312017===>2071如果数字不能重新排列以形成更大的数字,则返回-1:9===>-1111=>-1531=>-1......
  • YBTOJ 1.2贪心算法
    A.奶牛晒衣服......
  • 强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟
    强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解1.核心词汇深度确定性策略梯度(deepdeterministicpolicygradient,DDPG):在连续控制领域经典的强化学习算法,是深度Q网络在处定性”表示其输出的是一个确定的动作,......
  • 强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定
    强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战1、定义算法1.1定义模型!pipuninstall-yparl!pipinstallparlimportparlimportpaddleimportpaddle.nnasnnimportpaddle.nn.functionalasFcl......
  • 强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟
    强化学习从基础到进阶-常见问题和面试必知必答[7]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解1.核心词汇深度确定性策略梯度(deepdeterministicpolicygradient,DDPG):在连续控制领域经典的强化学习算法,是深度Q网络在处定性”表示其输出的是一个确定的动作,可......
  • 强化学习从基础到进阶–案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定
    强化学习从基础到进阶--案例与实践[7.1]:深度确定性策略梯度DDPG算法、双延迟深度确定性策略梯度TD3算法详解项目实战1、定义算法1.1定义模型!pipuninstall-yparl!pipinstallparlimportparlimportpaddleimportpaddle.nnasnnimportpaddle.nn.functionalasFcla......
  • 算法:给定 n 个不同元素的数组,设计算法等概率取 m 个不同的元素
      有几种算法可以实现从n个不同元素的数组中等概率地取出m个不同元素,其中一种是Knuth-DurstenfeldShuffle算法,它的思想是:将1到n的数字存到数组中从数组中取一个1到剩下数字个数的随机数k从低位开始,将数组第k个数字取出,并保存到结果数组末尾重复第2步,直到取出m个数字......
  • 算法
    枚举 前缀和,差分前缀和:sum[i]=a[i]+sum[i-1] 前i个数的求和。差分:delta[i]=a[i]-a[i-1]第i个数-第i-1个数。例题:https://ac.nowcoder.com/acm/problem/166491#include<bits/stdc++.h>2usingnamespacestd;3/**4对于......