AdaBoost算法讲解以及MATLAB实现

2023-11-01

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

李航统计学习adaboost算法例子(MATLAB)复现:https://blog.csdn.net/weixin_41146894/article/details/111316819


一、算法描述

AdaBoost,是英文"Adaptive Boosting"(自适应增强)的缩写,由Yoav Freund和Robert Schapire在1995年提出。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。

二、算法步骤是什么?

具体说来,整个Adaboost 迭代算法就3步:
1 初始化训练数据的权值分布。如果有N个样本,则每一个训练样本最开始时都被赋予相同的权值:1/N。
2 训练弱分类器。具体训练过程中,如果某个样本点已经被准确地分类,那么在构造下一个训练集中,它的权值就被降低;相反,如果某个样本点没有被准确地分类,那么它的权值就得到提高。然后,权值更新过的样本集被用于训练下一个分类器,整个训练过程如此迭代地进行下去。
3 将各个训练得到的弱分类器组合成强分类器。各个弱分类器的训练过程结束后,加大分类误差率小的弱分类器的权重,使其在最终的分类函数中起着较大的决定作用,而降低分类误差率大的弱分类器的权重,使其在最终的分类函数中起着较小的决定作用。换言之,误差率低的弱分类器在最终分类器中占的权重较大,否则较小。

三、数据集说明(可以自己增加数据集)

该数据集是参考网上设计的,数据量偏少,所以算法迭代次数只有几次。这里采用的数据集共有两个特征,X_1,X_2,对应的点组成一个具体的点,例如(5,2),(2,2) 其对应的类别为分别为1,1.
在这里插入图片描述

四、算法实现MATLAB

1.主函数

clc
clear
%数据集,自己设定,也可以输入,但是这里只适合二分类
X_2 = [5 2 1 6 8 5 9 7 8 2 1];
X_1 = [1 2 3 4 6 6 7 8 9 10 10];
%初始权重
w = [1 1 1 1 1 1 1 1 1 1 1];
%对应的输出
H = [];
%对应的目标函数
Y = [1 1 1 -1 -1 -1 1 1 1 -1 1];
Y_1 = Y;
% fprintf('目标分类:\n');
% fprintf('%4d',Y)
% fprintf('\n');
%对应的X
X = [0 1 2 3 4 5 6 7 8 9];
error = [];
%保存错误的个数
figure(1);
plot(X_1,X_2,'r*');
xlabel('X1');
ylabel('X2');




respose_1 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
respose_2 = [0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0];
%对应的切分点
cut = [0.5 1.5 2.5 3.5 4.5 5.5 6.5 7.5 8.5];
X_5 = [];
X_6 = [];
h_1 = [];
%用来保存误差
e = [];
%保存系数
a = [];
%设置最大的迭代步数
m = 20;
%开始迭代
for i=1:m
  [h1,h2,e1,e2] = small_adaboost_con( X_1, X_2, cut, w, respose_1, respose_2, Y);
  [Y_1,a(i),respose_1(i),respose_2(i),w] = cofficient_function(e1, e2, h1, h2, w, Y, respose_1, respose_2,cut);

   H(i,:) =a(i)*Y_1;
   sign(sum(H));
   %记录错误的个数
   error(i)=sum(abs(sign(sum(H))- Y))/2;
   fprintf('\n');
   fprintf('迭代第 %d 次, 错误率为: %f',i, error(i)/11);
   fprintf('\n');
   %判断是否还存在错误划分点
    if  sum(abs(sign(sum(H))- Y))==0
         break;
    end
end
fprintf('\n');
fprintf('迭代结束\n');
fprintf('所有弱分类函数对应的系数:\n');
fprintf('%16f',a);
fprintf('\n')


   figure(2);
   plot(error,'r*--');
   xlabel('iteration times');
   ylabel('error numbers');
   legend('error numbers');

2.找到误差率最小的弱函数

function [ Y1,a1,respose1,respose2,w] = cofficient_function(e1, e2, h1, h2, w, Y, respose_1,respose_2,cut)
%{
    函数功能:找到误差率最小的弱函数
    输入: h1:对应X_1的弱分类函数
           h2:对应X_2的弱分类函数
           e1:对应X_1弱函数的误差率
           e2:对应X_2弱函数的误差率
           cut:划分点,这里是二分类
           w:当前的权值
           repose_1:记录X_1的划分点
           repose_2:记录X_2的划分点
           Y:期望输出
     输出: Y1:误差率最小的弱函数
            a1: 对应其系数
            respose1:当前X_1使用的划分点,为了防止重复使用同一划分点
            rrespose2:当前X_2使用的划分点         
%}
%找出e1最小误差
  minE_1 = min(e1);
  %算弱分类器前的系数
  minI_1 = find(e1 == minE_1);
  %判断是否有两个或则更多的最小误差
  if (size(minI_1,2) > 1)
    minI_1 = minI_1(1);
  end

  minE_1;
  minI_1;
  %找出最小e2误差
  minE_2 = min(e2);
  %算弱分类器前的系数
  minI_2 = find(e2 == minE_2);
  %判断是否有两个或则更多的最小误差

  if (size(minI_2,2) > 1)
    minI_2 = minI_2(1);
  end

  minE_2;
  minI_2;

  if  minE_2< minE_1
      minI = minE_2;
      minI_Y = minI_2;
      minI_X = 0;
  else
     minI = minE_1;
     minI_X = minI_1;
     minI_Y = 0;
  end

    
   if  minI_X == 0
         %得到系数
%       fprintf('Y')
      a = log((1 - minE_2)/minE_2)/2;
      %更新权值
      Y_1 = h2(minI_Y,:);
      Z = sum(w.*exp(-a * h2(minI_Y,:).*Y));
      w = w/Z .* exp(-a * h2(minI_Y,:).*Y);
      respose_2 = minI_Y;
      
      %保存已经使用过的判断点
         hold on;
         plot([0,10],[cut(minI_Y),cut(minI_Y)]);
 
   else
       respose_2 = 0;
       
          
   end
    if  minI_Y == 0
%         fprintf('X')
         %得到系数
      a = log((1 - minE_1)/minE_1)/2;
      %更新权值
      Y_1 = h1(minI_X,:);
      Z = sum(w.*exp(-a * h1(minI_X,:).*Y));
      w = w/Z .* exp(-a * h1(minI_X,:).*Y);
      %保存已经使用过的判断点
      respose_1 = minI_X; 
      hold on;
      plot([cut(minI_X),cut(minI_X)],[0,10]);
    else
       respose_1=0;
        
    end
    Y1=Y_1;
    a1 = a;
    respose1 = respose_1; 
    respose2 = respose_2;
    w1 = w;

3.分别计算弱分类函数,并计算其误差率

function [h1, h2,e1,e2] = small_adaboost_con( label_1, label_2, cut, w, repose_1, repose_2, Y)
%{
       %函数功能:分别计算弱分类函数,并计算其误差率
       %输入:label_1:X_1的特征值
              label_2;X_2的特征值
              cut:划分点,这里是二分类
              w:当前的权值
              repose_1:记录X_1的划分点
              repose_2:记录X_2的划分点
              Y:期望输出
    
       %输出:
             h1:对应X_1的弱分类函数
             h2:对应X_2的弱分类函数
             e1:对应X_1弱函数的误差率
             e2:对应X_2弱函数的误差率
%}
    
  %初始化权值大小,归一化到(0,1)
  sumW = sum(w);
  w = w ./ sumW;
  for j=1:length(cut)
      for k=1:length(label_1)
          if label_1(k) <  cut(j)
              h_1(j,k) = 1;
          else
              h_1(j,k) = -1;
          end
          if label_2(k) <  cut(j)
              h_2(j,k) = 1;
          else
              h_2(j,k) = -1;
          end
      end
  end
  
%   %计算特征值1的误差率
  for j = 1:size(h_1,1)
    if isempty(find( repose_1==j))==0
        e_1(j) = 999;
    else
        %误差率大于0.5,
        e_1(j) = sum(w.*((Y - h_1(j,:)).*Y) / 2); 
        if e_1(j) > 0.5
            e_1(j) = 1 - e_1(j);
             for k=1:length(label_1)
                if label_1(k) <  cut(j)
                    h_1(j,k) = -1;
                else
                    h_1(j,k) = 1;
                end
             end        
        end  
    end
  end    
  %计算特征值2的误差率
  for j = 1:size(h_2,1)
    if isempty(find( repose_2==j))==0
        e_2(j) = 999;
    else
        %误差率大于0.5,
        e_2(j) = sum(w.*((Y - h_2(j,:)).*Y) / 2); 
        if e_2(j) > 0.5
            e_2(j) = 1 - e_2(j);
             for k=1:length(label_2)
                if label_2(k) <  cut(j)
                    h_2(j,k) = -1;
                else
                    h_2(j,k) = 1;
                end
             end        
        end  
    end
  end    
  h1 = h_1;
  h2 = h_2;
  e1 = e_1;
  e2 = e_2;

该处使用的url网络请求的数据。


六、结果演示

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

AdaBoost算法讲解以及MATLAB实现 的相关文章

  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • MATLAB:将当前文件夹设置为脚本位置

    我在不同的文件夹中有一些脚本和数据 我使用addpath和相对路径经常 我的问题是 只有当我的当前文件夹是我执行的脚本所在的位置时 这才有效 例如 如果我执行添加路径 X 的脚本 A 然后执行位于路径 X 中的脚本 B 则 Matlab 不
  • 保存符号方程以供以后使用?

    From here http www mathworks com help releases R2011a toolbox symbolic brvfu8o 1 html brvfxem 1 我正在尝试求解这样的符号方程组 syms x y
  • MATLAB 变量传递和惰性赋值

    我知道在 Matlab 中 当将新变量分配给现有变量时 会进行 惰性 评估 例如 array1 ones 1 1e8 array2 array1 的价值array1不会被复制到array2除非元素array2被修改 由此我推测Matlab中
  • 2D 网格的纹理贴图

    我有一组点 x y meshgrid 1 N 1 M 在常规二维上定义 N x M网格 我还有另一组要点 u v 这是原始网格的一些变形 即 u v f x y 但是我没有实际的f导致变形 如何将纹理映射到由定义的 变形 网格u v 即 给
  • 氡变换线检测

    我正在尝试检测灰度图像中的线条 为此 我在 MATLAB 中使用 Radon 变换 我的 m 文件的示例如下所示 我可以使用此代码检测多行 我还使用线条的移位和旋转属性来绘制线条 但是 我不明白在获取rho和theta值后如何获取检测线的起
  • Matlab strcat 不返回字符串?

    imgstr 无法识别 strcat 的输出字符串 homedir C Users images for img 01 bmp 02 bmp 03 bmp imgstr strcat homedir img I imread imgstr
  • 如何在Matlab中将图像从笛卡尔坐标更改为极坐标?

    我正在尝试将图像的像素从 x y 坐标转换为极坐标 但我遇到了问题 因为我想自己编写该函数 这是我到目前为止所做的代码 function newImage PolarCartRot read and show the image image
  • 霍夫变换检测和删除线

    我想使用霍夫变换检测图像中的线条 但是我不想绘制线条 而是想删除原始图像中检测到的每条线条 image imread image jpg image im2bw image BW edge image canny imshow BW fig
  • matlab中优先级队列的实现方法

    matlab中有没有提供minpriorityqueue功能的库 import java util PriorityQueue import java util public class MyQueue Comparator
  • 计算给出数组中最小标准差的子集

    让我们有一个大小的向量N 例如 x rand N 1 我想计算长度子集的最小标准差K在向量中 When N and K很小 很容易找到最好的子集 因为我可以使用nchoosek N K 枚举所有可能的子集 但是当值N and K比我们说的要
  • Matlab 中的 3D 堆叠条形图

    我想在一个图中绘制多个堆叠条形图 detached 条形图 例如 准确地想象一下bar http mathworks com help matlab ref bar3 detached png绘图 但堆叠在一起 而不是单一颜色 Set up
  • 将值从 C++ MEX 文件返回到 MATLAB

    我正在编写一个从 C 代码中检索数据的 MATLAB 程序 为此 我在 MATLAB 中创建了一个 MEX 文件和一个网关 mexFunction 虽然可以在 MATLAB 中读取读取值 但我无法检索它来使用它 如果不清楚 我有与这里完全相
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • MATLAB 符号替换

    我知道在 MATLAB 中如果声明了 syms x y f x 2 y 2 grad gradient f 然后grad会存储值 2 x 2 y 如果我想评估梯度 2 2 I use subs f x y 2 2 这返回 4 4 我正在编写
  • 在matlab中融合2个以上的图像

    在 MATLAB 中 如何融合两个以上的图像 例如 我想要做什么imfuse但对于超过 2 个图像 使用两张图像 这是我的代码 A imread file1 jpg B imread file2 jpg C imfuse A B blend
  • Python 中的 eig(a,b) 给出错误“需要 1 个位置参数,但给出了 2 个”

    根据https docs scipy org doc numpy 1 15 0 user numpy for matlab users html https docs scipy org doc numpy 1 15 0 user nump
  • matlab 中的 for 或 while 循环

    我刚刚开始在编程课的 matlab 中使用 for 循环 基本的东西对我来说很好 但是我被要求 使用循环创建一个 3 x 5 矩阵 其中每个元素的值是其行号其列号除以行号和列号之和的幂 例如元素 2 3 的值为 2 3 2 3 1 6 那么
  • 覆盖 MATLAB 默认静态 javaclasspath 的最佳方法

    MATLAB 配置为在搜索用户可修改的动态路径之前搜索其静态 java 类路径 不幸的是 静态路径包含相当多非常旧的公共库 因此如果您尝试使用新版本 您可能最终会加载错误的实现并出现错误 例如 静态路径包含 google collectio
  • Matlab 中是否有相当于 R 的 dput() 的函数?

    Matlab 中是否有相当于 R 的 dput 的函数 dput 将 R 对象的 ASCII 文本表示形式写入文件或连接 UPDATE 1 添加了递归和对单元格的支持 UPDATE 2 添加了对结构的支持 UPDATE 3 增加了对逻辑 整

随机推荐

  • DEDE调用指定文章ID来调用特定文档

    指定文章的id来调用特定文档在某些情况下还是比较实用的 下面有个示例 需要的朋友可以了解下 代码如下 dede arclist row 1 idlist 6 li a href field description a li dede arc
  • 【C++】STL——vector的使用、 vector增删查改函数的介绍和使用、push_back和pop_back、operator[]

    文章目录 1 vector的使用 2 vector的增删查改 1 push back 尾插 2 pop back 尾删 3 find 查找 4 insert 在position之前插入val 5 erase 删除指定位置的数据 6 swap
  • Python项目代码结构详解

    目录结构组织方式 简要解释一下 bin 存放项目的一些可执行文件 当然你可以起名script 之类的也行 luffy 存放项目的所有源代码 1 源代码中的所有模块 包都应该放在此目录 不要置于顶层目录 2 其子目录tests 存放单元测试代
  • QML 中播放PPT文件

    效果 一 思路 MFC 操作PPT 然年将MFC封装成dll 供Qt使用 案例分享 Qt的PPT播放器 长沙红胖子Qt的博客 CSDN博客 qt 打开ppt Qt将mfc中的句柄 加载到QWidget中 QML 通过 QQuickWidge
  • 用户态和内核态的区别

    1 操作系统需要两种CPU状态 内核态 Kernel Mode 运行操作系统程序 操作硬件 用户态 User Mode 运行用户程序 2 指令划分 特权指令 只能由操作系统使用 用户程序不能使用的指令 举例 启动I O 内存清零 修改程序状
  • 计网

    实验目的和要求 熟悉交换机各种命令模式和基本命令 学习交换机的基本配置 制作网络拓扑图 1台交换机 2台PC 2台PC能够ping通 截图 截图网络拓扑图 2台PC 2台pc机分别用连通线和交叉线连接 然后测试其连通性 学习交换机VLAN的
  • 【crypto】基于crypto.js的web前端加解密系统实现

    文章目录 一 概念介绍 1 1 crypto js介绍 1 2 加密 哈希 编码 1 2 1 加密 解密 1 2 2 散列 哈希 1 2 3 BASE64编解码 二 加解密思想 以md5为例 三 前端加密系统实现代码 3 1 加解密 3 2
  • C++称硬币(枚举)

    有12枚硬币 其中有11枚真币和1枚假币 假币和真币重量不同 但不知道假币比真币轻还是重 现在 用一架天平称了这些币三次 告诉你称的结果 请你找出假币并且确定假币是轻是重 数据保证一定能找出来 输入 第一行是测试数据组数 每组数据有三行 每
  • java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES)报错原因

    1 第一个 用户名和密码不匹配 或者是在连接池里多打了空格之类的 就是配置文件的问题 2 第二个 可能是用户的权限不够 给他添加权限 授予权限 grant all privileges on databasename tablename t
  • 关于键盘盲打的一些小技巧

    当然也是很久以前在某个网站搜索一下 然后保存的 个人觉得比较有用 具体的也不太清了 电脑键盘指法作为使用电脑的基本功 在初期养成正确的键盘指法十分重要 很多朋友由于初期没有养成正确键盘指法的习惯 导致后期习惯了错误的键盘指法 要更正已经相当
  • No module named ‘tensorflow.contrib‘问题解析以及tensorflow的卸载安装和向下兼容

    0 问题原因 TensorFlow 2 0中contrib被弃用 1 卸载原Tensorflow 重新安装 卸载 在开始安装前 如果你的电脑装过tensorflow 请先把他们卸载干净 包括依赖的包 tensorflow estimator
  • Github Fork 使用详解

    Fork 是对一个仓库的克隆 克隆一个仓库允许你自由试验各种改变 而不影响原始的项目 一般来说 forks 被用于去更改别人的项目 贡献代码给已经开源的项目 或者使用别人的项目作为你自己想法的初始开发点 提出更改别人的项目 使用 forks
  • 【React】函数组件 hooks-useState

    React 函数组件 hooks useState 使用hooks理由 useState 保存组件状态 切换数值 实现todolist增加和删除 最终结果 使用hooks理由 高阶组件为了复用 导致代码层级复杂 生命周期的复杂 写成func
  • angular4 通过httpclient调http接口,出现access-control-allow-origin跨域问题解决办法

    最近项目中在用angular4 在调试后台http接口时 会出现跨域问题 在chrom浏览器控制台报错如下 在浏览器属性中增加几行命令 即可解决该问题 具体做法如下 右击浏览器 选择属性 目标那一栏中增加如下命令 args disable
  • MQTT异步使用

    目录 1 结构体 1 1 MQTTAsync 1 2 MQTTAsync connectOptions 1 3 MQTTAsync disconnectOptions 1 4 MQTTAsync responseOptions 1 5 MQ
  • Nginx 基本优化

    一 一般来说nginx 配置文件中对优化比较有作用的为以下几项 1 worker processes 8 nginx 进程数 建议按照cpu 数目来指定 一般为它的倍数 如 2个四核的cpu计为8 2 worker cpu affinity
  • Linux常用的命令

    Linux常用的命令 1 常用的系统工作命令 1 1 执行查看帮助命令 man 命令 man 命令用来查看man命令自身的帮助信息 MAN 1 Manual pager utils MAN 1 NAME man an interface t
  • 浅谈unsigned与signed的区别

    在我们写c语言的程序中 总是能看见unsigned的关键字 unsigned的作用是声明无符号的整形类型 与signed对应 这个关键字是挺常见的 unsigned 用来声明无符号的整形变量 signed 用来声明有符号的整形变量 我们以
  • 毕业设计 2023-2024年最新计算机专业毕设选题题目推荐汇总

    文章目录 0 前言 1 java web 管理系统 毕设选题 2 java web 平台 业务系统 毕设选题 3 游戏设计 动画设计类 毕设选题 适合数媒的同学 4 算法开发 5 数据挖掘 毕设选题 6 大数据处理 云计算 区块链 毕设选题
  • AdaBoost算法讲解以及MATLAB实现

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 算法描述 二 算法步骤是什么 三 数据集说明 可以自己增加数据集 四 算法实现MATLAB 1 主函数 2 找到误差率最小的弱函数 3 分别计算弱分类函数 并计