pythonadaboost的简单实现

阳光玻璃杯 阳光玻璃杯     2022-12-15     785

关键词:

初学adaboost,自己尝试着写了下adaboost的实现,这个实现以几个简单的数字作为训练样本,当然,这些数字是带标签的。然后尝试着使用adaboost对其分类。对于10个带标签的数字,分类他们只需要3个左右的弱分类器级联,组成一个强分类器就可以完全正确的分类。如果代码本身没有bug的话,adaboost的表现的确惊艳。
另外,pathon也是初学,很多的编程思路和c,c++类似,总之,各方面有待提高。但是因为代码能很好的分类样本,其结果还是令人兴奋的。
adaboost的教程非常多了,再次就不多做废话了。
一下是完整的代码。python是3.5.2版本的,如果版本没什么问题,粘贴复制应该就可以运行。

import cv2
import numpy as np
import math
import matplotlib.pyplot as plt

def buildDatasAndLables():
    data =  [23,12,3,54,89,2,43,7,45,26]
    label = [1, 1,-1,-1,-1,1,1,  -1, -1,1,]
    return (data,label)

def calWeakClassfyOuput(input,weakClassy):
    # 在期望范围的数为1,否则为-1
    if weakClassy[0] == "left":
        # left的时候,如果小于阈值,则输出1,否则,输出0
        if input < weakClassy[1] :
            return 1
        elif input >= weakClassy[1]:
            return -1
    elif weakClassy[0] == "right":
        # right的时候,如果大于阈值,则输出1,否则,输出0
        if input > weakClassy[1] :
            return 1
        elif input <= weakClassy[1]:
            return -1

#训练弱分类器
def trainWeakClassfy(data,label,W):
    #训练若分类器的方式:找到一个阈值,把data分成两部分,使得错误率最小
    weakClassy = []
    #将每个data中的数据作为阈值,判断以该值作为阈值的误差率,这样需要判断len(data)次
    for m in data:
        for direct in ["left","right"]:
            i = 0
            error = 0
            for mm in data:
                #在期望范围的数为1,否则为-1
                if direct == "left":
                    #left的时候,如果小于阈值,则对应的label应该为1,如果为-1,则错了,需要增加错误率
                    if mm < m and label[i]==-1:
                        error += W[i]
                    elif mm >= m and label[i]==1:
                        error += W[i]
                elif direct == "right":
                    # right的时候,如果大于阈值,则对应的label应该为1,如果为-1,则错了,需要增加错误率
                    if mm > m and label[i]==-1:
                        error += W[i]
                    elif mm <= m and label[i]==1:
                        error += W[i]
                i += 1
            weakClassy.append([direct,m,error[0]])
    #从所有的弱分类器中选择出错误率最低的
    bestWeakClassfy = []
    for classfy in weakClassy:
        if not bestWeakClassfy:
            bestWeakClassfy = classfy
        else:
            if classfy[2]<bestWeakClassfy[2]:
                bestWeakClassfy = classfy
    return bestWeakClassfy





def adaboostTrain(desAccuracy,maxWeakClassfyNum):
    #首先获取训练数据
    data,label = buildDatasAndLables()
    #初始化权重为1/n
    W = np.ones((len(data),1))/len(data)
    weakClassfys = []
    accuracy = 0
    for num in range(maxWeakClassfyNum):
        #首先训练弱分类器
        weakClassfy = trainWeakClassfy(data, label, W)
        #其次,计算该分类器的话语权
        weight = 0.5*math.log(((1-weakClassfy[2])/weakClassfy[2]))
        print("weight",weight)
        print("weakClassfy",weakClassfy)
        weakClassfy.append(weight)
        weakClassfys.append(weakClassfy)

        #然后更新训练样本的权重
        midW = np.zeros(W.shape)
        for i in range(len(W)):
            midW[i] = W[i]*math.exp(-calWeakClassfyOuput(data[i],weakClassfy)*label[i]*weight)
        Zt = np.sum(midW)
        for i in range(len(W)):
            W[i] = midW[i]/Zt
        #左右检验输出是否达标
        i = 0
        accuracy = 0
        for d in data:
            result = 0
            for classfy in weakClassfys:
                result += classfy[3]*calWeakClassfyOuput(d,classfy)
            if result > 0 :
                result = 1
            else:
                result = -1
            if result == label[i]:
                accuracy += 1/len(data)
            i += 1
        print("accuracy",accuracy)
        print("num",num)
        if accuracy >= desAccuracy:
            break

adaboostTrain(0.98,10)


结果如下:

weight 0.6931471805599453
weakClassfy ['left', 45, 0.20000000000000001]
accuracy 0.7999999999999999
num 0
weight 0.5493061443340549
weakClassfy ['left', 3, 0.25]
accuracy 0.7999999999999999
num 1
weight 0.8047189562170503
weakClassfy ['right', 7, 0.16666666666666666]
accuracy 0.9999999999999999
num 2

pythonadaboost的示例代码。参考:机器学习在行动第7章。(代码片段)

查看详情

linux主机实现简单的路由转发功能

只要在Linux主机上添加一些简单的路由条目,这些Linux主机就可以充当简单路由器的功能。在实际生产坏境中,当我们需要一台路由器简单作为转发数据,但是手上却没有路由器的话,我们就可以指定一台Linux主机充当一个简单的... 查看详情

socket编程的简单实现

关于socket编程的简单实现,主要分成客户端、服务端两个部分。实现如下:1.服务端代码如下,注意:server端要优先于client端启动2.client端代码,以及启动后客户端和服务端之间的简单连接 (自学使用) 查看详情

一个极为简单的requirejs实现

skyweaver 一个极为简单的requirejs实现require和sea的源码分析,我之前的博客有写过,今天我想分享的是一个很简单的核心代码(不带注释和空行大概60行),没有容错判断。require.jsrequire函数实现用一句话概括:依次加载require的... 查看详情

简单的前端校验框架实现

前端表单在提交前总是要进行校验的,而这些工作是繁琐的,所以这儿写了一个简单的校验框架,代码实现如下:functionValidate(id){if(arguments.length!=1){thrownewError("Argumentisrequired");}this.errors=[];this.id=id;this.container=$("#"+id);}Validate.prototy 查看详情

栈的简单实现-数组实现

...一端称作栈底(bottom);示意图如下: 此文借助数组简单地实现栈及其基本操作。代码如下:#defineMaxSize100typedefstruct{int 查看详情

简单的链表实现

JavaLinkedList底层是基于双向链表来实现的,为了更好的理解其实现原理,自己对简单的链表结构做了Java实现,代码如下classMyLinkedListpublicMyLinkedList(){this.size=0;this.last=null;this.first=null;head=first;}publicbooleanadd(Ee){linkLast(e);returntrue 查看详情

C ++中的简单哈希图实现

】C++中的简单哈希图实现【英文标题】:SimplehashmapimplementationinC++【发布时间】:2010-09-2022:34:18【问题描述】:我对C++比较陌生。在Java中,我很容易实例化和使用hashmap。我想知道如何在C++中以简单的方式实现它,因为我看到了... 查看详情

springboot实现简单的文件上传

承接上一篇,这里记录一下简单的springboot文件上传的方式首先,springboot简单文件上传不需要添加额外的jar包和配置这里贴一下后端controller层的实现代码补一份前台的HTML代码补充,这里实现的是简单的单文件上传,没有指定存... 查看详情

栈的简单实现-单链表实现

...端称作栈底(bottom);示意图如下: 此文借助单链表简单地实现栈及其基本操作。代码如下:typedefstructstack{intdata;struct 查看详情

实现简单页面

 这次主要做一个简单的页面,语法很简单主要用HTML,css,JavaScript,jquery。页面的实现。JavaScript的方式实现登录页面的编写。css来做页面的修饰。 时间:陆陆续续已经做了很久这个页面了,但是一直没做完,这个用了一... 查看详情

spring自己实现一个简单的springioc自己实现简单的spring(代码片段)

1.概述你有自己实现过简单的Spring吗?Spring的IOC本质就是一个大工厂,我们想想一个工厂是怎么运行的呢?生产产品:一个工厂最核心的功能就是生产产品。在Spring里,不用Bean自己来实例化,而是交给Spring... 查看详情

实现简单的时间显示

实现一个简单的时间: <body> <divid="time"style="color=red"> </div> <script> vartime=document.getElementById("time"); setInterval("time.innerHTML=newDate().toLocaleString()+‘星期‘+‘ 查看详情

一个简单的hashmapc语言实现

一个简单的HashMapC语言实现cheungmine 用C语言实现一个简单实用的hashmap,具有一定的实际意义。尤其我们不想使用STL里面的map<...>类的时候。我实现的这个hashmap,用来做key---value的映射,key必须是有效的字符串࿰... 查看详情

jsplitpane的简单实现

importjava.awt.Color;importjavax.swing.ImageIcon;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JList;importjavax.swing.JSplitPane;publicclassfenye1extendsJFrame{JLabeljl;JListjs; 查看详情

一个简单代码的不简单实现

前几天看有人贴了一个java代码的问题,实在有意思,今天拿出来和大家分享分享。题目是这样的:给定两个Integer类型的变量a和b,要求实现一个函数swap,交换他们的值。代码如下:  ====想一... 查看详情

简单的线程runnable实现线程的测试

/* 需求: 写一个简单的线程测试,采用实现的Runnable的run() 打印一句句简单自定义线程名字的语句ThreadWorldWecomeYou!! 和默认的线程名字的语句:ThisisdefalutThreadName:默认的线程名字*/  classTEST_ThreadimplementsRun... 查看详情

一个基于注解的orm简单实现:实现思路

先来看一段常见的数据库操作代码:``` protectedUsergetDataFromDatabase(longid){ Stringsql="selectfirstnamefromuserwhereid=?";//1 Connectionconn=DBConnectionFactory.getConnection(); PreparedStatementstat;Useruser;//2 查看详情