0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

adaboost运行函数的算法怎么来的?基本程序代码实现详细

lviY_AI_shequ 2018-07-21 10:18 次阅读

一.Adaboost理论部分

1.1 adaboost运行过程

注释:算法是利用指数函数降低误差,运行过程通过迭代进行。其中函数的算法怎么来的,你不用知道!当然你也可以尝试使用其它的函数代替指数函数,看看效果如何。

1.2 举例说明算法流程

1.3 算法误差界的证明

注释:误差的上界限由Zm约束,然而Zm又是由Gm(xi)约束,所以选择适当的Gm(xi)可以加快误差的减小。

二.代码实现

2.1程序流程图

2.2基本程序实现

注释:真是倒霉玩意,本来代码全部注释好了,突然Ubuntu奔溃了,全部程序就GG了。。。下面的代码就是官网的代码,部分补上注释。现在使用Deepin桌面版了,其它方面都比Ubuntu好,但是有点点卡。

from numpy import *

def loadDataSet(fileName): #general function to parse tab -delimited floats

numFeat = len(open(fileName).readline().split(' ')) #get number of fields

dataMat = []; labelMat = []

fr = open(fileName)

for line in fr.readlines():

lineArr =[]

curLine = line.strip().split(' ')

for i in range(numFeat-1):

lineArr.append(float(curLine[i]))

dataMat.append(lineArr)

labelMat.append(float(curLine[-1]))

return dataMat,labelMat

def stumpClassify(dataMatrix,dimen,threshVal,threshIneq):#just classify the data

retArray = ones((shape(dataMatrix)[0],1))

if threshIneq == 'lt':

retArray[dataMatrix[:,dimen] <= threshVal] = -1.0

else:

retArray[dataMatrix[:,dimen] > threshVal] = -1.0

return retArray

def buildStump(dataArr,classLabels,D):

dataMatrix = mat(dataArr); labelMat = mat(classLabels).T

m,n = shape(dataMatrix)

numSteps = 10.0; bestStump = {}; bestClasEst = mat(zeros((m,1)))

minError = inf #init error sum, to +infinity

for i in range(n):#loop over all dimensions

rangeMin = dataMatrix[:,i].min(); rangeMax = dataMatrix[:,i].max();

stepSize = (rangeMax-rangeMin)/numSteps

for j in range(-1,int(numSteps)+1):#loop over all range in current dimension

for inequal in ['lt', 'gt']: #go over less than and greater than

threshVal = (rangeMin + float(j) * stepSize)

predictedVals = stumpClassify(dataMatrix,i,threshVal,inequal)#call stump classify with i, j, lessThan

errArr = mat(ones((m,1)))

errArr[predictedVals == labelMat] = 0

weightedError = D.T*errArr #calc total error multiplied by D

#print "split: dim %d, thresh %.2f, thresh ineqal: %s, the weighted error is %.3f" % (i, threshVal, inequal, weightedError)

if weightedError < minError:

minError = weightedError

bestClasEst = predictedVals.copy()

bestStump['dim'] = i

bestStump['thresh'] = threshVal

bestStump['ineq'] = inequal

return bestStump,minError,bestClasEst

def adaBoostTrainDS(dataArr,classLabels,numIt=40):

weakClassArr = []

m = shape(dataArr)[0]

D = mat(ones((m,1))/m) #init D to all equal

aggClassEst = mat(zeros((m,1)))

for i in range(numIt):

bestStump,error,classEst = buildStump(dataArr,classLabels,D)#build Stump

#print "D:",D.T

alpha = float(0.5*log((1.0-error)/max(error,1e-16)))#calc alpha, throw in max(error,eps) to account for error=0

bestStump['alpha'] = alpha

weakClassArr.append(bestStump) #store Stump Params in Array

#print "classEst: ",classEst.T

expon = multiply(-1*alpha*mat(classLabels).T,classEst) #exponent for D calc, getting messy

D = multiply(D,exp(expon)) #Calc New D for next iteration

D = D/D.sum()

#calc training error of all classifiers, if this is 0 quit for loop early (use break)

aggClassEst += alpha*classEst

#print "aggClassEst: ",aggClassEst.T

aggErrors = multiply(sign(aggClassEst) != mat(classLabels).T,ones((m,1)))

errorRate = aggErrors.sum()/m

print ("total error: ",errorRate)

if errorRate == 0.0: break

return weakClassArr,aggClassEst

def adaClassify(datToClass,classifierArr):

dataMatrix = mat(datToClass)#do stuff similar to last aggClassEst in adaBoostTrainDS

m = shape(dataMatrix)[0]

aggClassEst = mat(zeros((m,1)))

for i in range(len(classifierArr)):

classEst = stumpClassify(dataMatrix,classifierArr[i]['dim'],

classifierArr[i]['thresh'],

classifierArr[i]['ineq'])#call stump classify

aggClassEst += classifierArr[i]['alpha']*classEst

#print aggClassEst

return sign(aggClassEst)

def plotROC(predStrengths, classLabels):

import matplotlib.pyplot as plt

cur = (1.0,1.0) #cursor

ySum = 0.0 #variable to calculate AUC

numPosClas = sum(array(classLabels)==1.0)#标签等于1的和(也等于个数)

yStep = 1/float(numPosClas); xStep = 1/float(len(classLabels)-numPosClas)

sortedIndicies = predStrengths.argsort()#get sorted index, it's reverse

sortData = sorted(predStrengths.tolist()[0])

fig = plt.figure()

fig.clf()

ax = plt.subplot(111)

#loop through all the values, drawing a line segment at each point

for index in sortedIndicies.tolist()[0]:

if classLabels[index] == 1.0:

delX = 0; delY = yStep;

else:

delX = xStep; delY = 0;

ySum += cur[1]

#draw line from cur to (cur[0]-delX,cur[1]-delY)

ax.plot([cur[0],cur[0]-delX],[cur[1],cur[1]-delY], c='b')

cur = (cur[0]-delX,cur[1]-delY)

ax.plot([0,1],[0,1],'b--')

plt.xlabel('False positive rate'); plt.ylabel('True positive rate')

plt.title('ROC curve for AdaBoost horse colic detection system')

ax.axis([0,1,0,1])

plt.show()

print ("the Area Under the Curve is: ",ySum*xStep)

注释:重点说明一下非均衡分类的图像绘制问题,想了很久才想明白!

都是相对而言的,其中本文说的曲线在左上方就为好,也是相对而言的,看你怎么定义个理解!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 算法
    +关注

    关注

    23

    文章

    4612

    浏览量

    92883
  • 代码
    +关注

    关注

    30

    文章

    4788

    浏览量

    68601

原文标题:《机器学习实战》AdaBoost算法(手稿+代码)

文章出处:【微信号:AI_shequ,微信公众号:人工智能爱好者社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    基于NXP MCXA153 MCU实现RT-Thread的MTD NOR Flash驱动

    在嵌入式系统中,片上Flash存储器是一个关键组件,用于存储程序代码和关键数据。本文将详细介绍如何在NXPMCXA153 MCU上实现RT-Thread的MTD (Memory Technology Device) NOR Fl
    的头像 发表于 11-09 14:00 457次阅读
    基于NXP MCXA153 MCU<b class='flag-5'>实现</b>RT-Thread的MTD NOR Flash驱动

    【RA-Eco-RA2E1-48PIN-V1.0开发板试用】原创测量代码运行时间

    详细说明。最后通过串口打印输出算法模块函数的执行时间,展示给大家。 1.打开我之前的项目工程FPU文件夹目录,打开keil 打开pack insall 安装管理器,安装perf_c
    发表于 11-06 15:32

    Pure path studio内能否自己创建一个component,实现特定的算法,例如LMS算法

    TLV320AIC3254EVM-K评估模块, Pure path studio软件开发环境。 问题:1.Pure path studio 内能否自己创建一个component,实现特定的算法
    发表于 11-01 08:25

    单片机烧录程序的线比单片机上的少还能烧录吗

    单片机烧录原理 单片机烧录是指将编写好的程序代码通过一定的方式传输到单片机的存储器中,使其能够按照程序的指令运行。这个过程通常需要使用烧录器或者编程器等设备,通过一定的接口与单片机进行通信。 单片机
    的头像 发表于 09-02 09:54 501次阅读

    LKT(LCS)代码移植芯片优势

    所谓代码移植就是客户可以把自定义的程序一部分关键代码函数移植到加密芯片中运行。用户采用标准C语言编写代码
    的头像 发表于 08-22 10:03 774次阅读

    怎样用Arduino测试锂电池容量

    本文详细介绍了如何用Arduino测量锂电池的容量。并附有电路图和Arduino的程序代码
    的头像 发表于 07-30 09:14 891次阅读
    怎样用Arduino测试锂电池容量

    ESP32C3通过QSPI flash片外运行代码,如果频繁地存储录音音频数据,会影响程序运行吗?

    ESP32C3通过QSPI flash 片外运行代码,如果频繁地存储录音音频数据,会影响程序运行吗?有这个风险吗?
    发表于 06-20 08:28

    运动控制器的代码运行顺序是什么

    运动控制器是一种用于控制机械运动的设备,它可以接收输入信号并根据这些信号控制机械的运动。运动控制器的代码运行顺序对于实现精确的运动控制至关重要。本文将详细介绍运动控制器的
    的头像 发表于 06-13 09:25 479次阅读

    探讨AI编写代码技术,以及提高代码质量的关键:静态代码分析工具Perforce Helix QAC &amp; Klocwork

    的过程,并回答这个问题: AI会取代程序员吗? 什么是AI代码生成? 近年来,生成式AI的应用呈爆炸式增长,这主要因为现在有足够的计算能力运行深度学习
    的头像 发表于 06-05 14:10 405次阅读

    在stm32的运行程序中,初始函数明明没有在while函数里面,为什么能反复运行

    在stm32的运行程序中,好多初始函数明明没有在while函数里面,但是,他却能反复的,不断地去运行,这是为什么呢? 就像是这个程序,对于设
    发表于 04-08 08:15

    verilog function函数的用法

    Verilog 中被广泛用于对电路进行模块化设计,以简化和组织代码。 本文将详细介绍 Verilog 函数的用法,并探讨函数在硬件设计中的重要性和实际应用场景。 一. Verilog
    的头像 发表于 02-22 15:49 5693次阅读

    如何使用exit()、_exit()和_Exit()终止程序运行呢?

    在Linux系统下,你可以使用 exit()、_exit() 和 _Exit() 终止程序运行,特别是在出现错误或执行失败的情况下。
    的头像 发表于 02-22 12:20 931次阅读

    TC275用STM做定时器中断,主函数中while (1) rifeace 的代码无法运行怎么解决?

    TC275 芯片段,用STM做定时器中断。中断里面的程序可以正常执行,但是主函数中while (1) rifeace 的代码无法运行。求助,非常感谢!
    发表于 01-23 08:23

    mini57系列运行算法库的程序,编译没有错误但无法运行是为什么?

    我用mini57系列的芯片跑做一个心率检测的产品。加入心率算法库后,发现程序无法运行,但是编译没有报错。我在线仿真发现无法进入main函数程序
    发表于 01-15 08:33

    程序运行后为什么没有结果

    在进行开发过程中,可能会出现程序运行后没有结果的情况。这可能是由于多种原因导致的,下面将详细介绍可能的原因以及解决方法。 首先,可能是代码有错误或逻辑错误导致
    的头像 发表于 01-09 11:00 3431次阅读