(转载)基于 BP_Adaboost 的强分类器设计(matlab实现)

news2024/11/28 7:40:14

本博客的完整代码获取:

https://www.mathworks.com/academia/books/book106283.html

1案例背景

1.1 BP_Adaboost模型

        Adaboost算法的思想是合并多个“弱”分类器的输出以产生有效分类。其主要步骤为:首先给出弱学习算法和样本空间(x,y),从样本空间中找出m组训练数据,每组训练数据的权重都是1/m。然后用弱学习算法迭代运算T次,每次运算后都按照分类结果更新训练数据权重分布,对于分类失败的训练个体赋予较大权重,下一次迭代运算时更加关注这些训练个体。弱分类器通过反复迭代得到一个分类函数序列f,f2,…,fr,每个分类函数赋予一个权重,分类结果越好的函数,其对应权重越大。T次迭代之后,最终强分类函数F由弱分类函数加权得到。BP_Adaboost模型即把BP神经网络作为弱分类器,反复训练BP神经网络预测样本输出,通过 Adaboost算法得到多个BP神经网络弱分类器组成的强分类器。

1.2公司财务预警系统介绍

        公司财务预警系统是为了防止公司财务系统运行偏离预期目标而建立的报警系统,具有针对性和预测性等特点。它通过公司的各项指标综合评价并预测公司财务状况、发展趋势和变化,为决策者科学决策提供智力支持。
        财务危机预警指标体系中的指标可分为表内信息指标、盈利能力指标、偿还能力指标、成长能力指标,线性流量指标和表外信息指标六大指标,每项大指标又分为若干小指标,如盈利能力指标又可分为净资产收益率,总资产报酬率,每股收益、主营业务利润率和成本费用利润率等。在用于公司财务预警预测时,如果对所有指标都进行评价后综合,模型过于复杂,并且各指标间相关性较强,因此在模型建立前需要筛选指标。

        指标筛选分为显著性分析和因子分析两步。显著性分析通过T检验方法分析ST公司和非ST公司,在财务指标中找出差别较大、能够明显区分两类公司的财务指标因子分析在显著性分析基础上对筛选出来的指标计算主成分特征值,从中找出特征值大的指标作为公司危机预警方法的最终评价指标。最终找出成分费用利润率,资产营运能力、公司总资产,总资产增长率,流动比率、,营业现金流量,审计意见类型、每股收益、存货周转率和资产负债率十项指标作为评价指标,该十项指标能够比较全面地反映出公司的财务状况。

2模型建立

        基于BP_Adaboost模型的公司财务预警算法流程如图5-1所示。

d2b986cd20bb4df5b5977a6ce32e62cb.png

        算法步骤如下:

c10e31e58d324b65981caccfb2afbd4d.pngd4c635342d364a50bfbeae181b84a96c.png        对于本案例来说,共有1350组公司财务状况数据,每组数据的输入为10维,代表上述的10个指标,输出为1维,代表公司财务状况,为1时表示财务状况良好,为一1时表示财务状况出现问题。从中随机选取1000组数据作为训练数据,350组数据作为测试数据。根据数据维数,采用的BP神经网络结构为10—6—1,共训练生成10个BP神经网络弱分类器,最后用10个弱分类器组成强分类器对公司财务状况进行分类。

3编程实现

3.1matlab代码

        根据Adaboost 和 BP神经网络原理,编程实现基于 BP_ Adaboost算法的公司财务预警建模。
        首先,从样本空间中选择训练样本,测试样本,并对测试样本分配权重,其中训练数据和测试数据存储在data文件中,input_train,output_train为训练输入输出数据,input_test,output_test为预测输入输出数据。

        其次,把BP神经网络看作弱分类器,经过训练后分类训练样本,并且根据训练样本分类结果调整训练样本权重值,最终得出一系列弱分类器及其权重。为了体现出强分类器的分类效果,本例降低了BP神经网络训练次数以降低弱分类器分类能力。

        最后,由10组弱分类器BP网络组成强分类器对分析样本进行分类,并统计分类误差。

        完整matlab代码如下:

 

%% 该代码为基于BP-Adaboost的强分类器分类
%
% <html>
% <table border="0" width="600px" id="table1">	<tr>		<td><b><font size="2">该案例作者申明:</font></b></td>	</tr>	<tr><td><span class="comment"><font size="2">1:本人长期驻扎在此<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html"><font color="#0000FF">板块</font></a>里,对该案例提问,做到有问必答。本套书籍官方网站为:<a href="http://video.ourmatlab.com">video.ourmatlab.com</a></font></span></td></tr><tr>		<td><font size="2">2:点此<a href="http://union.dangdang.com/transfer/transfer.aspx?from=P-284318&backurl=http://www.dangdang.com/">从当当预定本书</a>:<a href="http://union.dangdang.com/transfer/transfer.aspx?from=P-284318&backurl=http://www.dangdang.com/">《Matlab神经网络30个案例分析》</a>。</td></tr><tr>	<td><p class="comment"></font><font size="2">3</font><font size="2">:此案例有配套的教学视频,视频下载方式<a href="http://video.ourmatlab.com/vbuy.html">video.ourmatlab.com/vbuy.html</a></font><font size="2">。 </font></p></td>	</tr>			<tr>		<td><span class="comment"><font size="2">		4:此案例为原创案例,转载请注明出处(《Matlab神经网络30个案例分析》)。</font></span></td>	</tr>		<tr>		<td><span class="comment"><font size="2">		5:若此案例碰巧与您的研究有关联,我们欢迎您提意见,要求等,我们考虑后可以加在案例里。</font></span></td>	</tr>		</table>
% </html>
%% 清空环境变量
clc
clear

%% 下载数据
load data input_train output_train input_test output_test

%% 权重初始化
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;

%% 弱分类器分类
K=10;
for i=1:K
    
    %训练样本归一化
    [inputn,inputps]=mapminmax(input_train);
    [outputn,outputps]=mapminmax(output_train);
    error(i)=0;
    
    %BP神经网络构建
    net=newff(inputn,outputn,6);
    net.trainParam.epochs=5;
    net.trainParam.lr=0.1;
    net.trainParam.goal=0.00004;
    
    %BP神经网络训练
    net=train(net,inputn,outputn);
    
    %训练数据预测
    an1=sim(net,inputn);
    test_simu1(i,:)=mapminmax('reverse',an1,outputps);
    
    %测试数据预测
    inputn_test =mapminmax('apply',input_test,inputps);
    an=sim(net,inputn_test);
    test_simu(i,:)=mapminmax('reverse',an,outputps);
    
    %统计输出效果
    kk1=find(test_simu1(i,:)>0);
    kk2=find(test_simu1(i,:)<0);
    
    aa(kk1)=1;
    aa(kk2)=-1;
    
    %统计错误样本数
    for j=1:nn
        if aa(j)~=output_train(j);
            error(i)=error(i)+D(i,j);
        end
    end
    
    %弱分类器i权重
    at(i)=0.5*log((1-error(i))/error(i));
    
    %更新D值
    for j=1:nn
        D(i+1,j)=D(i,j)*exp(-at(i)*aa(j)*test_simu1(i,j));
    end
    
    %D值归一化
    Dsum=sum(D(i+1,:));
    D(i+1,:)=D(i+1,:)/Dsum;
    
end

%% 强分类器分类结果
output=sign(at*test_simu);

%% 分类结果统计
%统计强分类器每类分类错误个数
kkk1=0;
kkk2=0;
for j=1:350
    if output(j)==1
        if output(j)~=output_test(j)
            kkk1=kkk1+1;
        end
    end
    if output(j)==-1
        if output(j)~=output_test(j)
            kkk2=kkk2+1;
        end
    end
end

kkk1
kkk2
disp('第一类分类错误  第二类分类错误  总错误');
% 窗口显示
disp([kkk1 kkk2 kkk1+kkk2]);

plot(output)
hold on
plot(output_test,'g')

%统计弱分离器效果
for i=1:K
    error1(i)=0;
    kk1=find(test_simu(i,:)>0);
    kk2=find(test_simu(i,:)<0);
    
    aa(kk1)=1;
    aa(kk2)=-1;
    
    for j=1:350
        if aa(j)~=output_test(j);
            error1(i)=error1(i)+1;
        end
    end
end
disp('统计弱分类器分类效果');
error1

disp('强分类器分类误差率')
(kkk1+kkk2)/350

disp('弱分类器分类误差率')
(sum(error1)/(K*350))

3.2结果分析

        分析样本共有350组数据,采用10个BP弱分类器组成的强分类器分类公司财务运行状况,分类误差统计如表5-1所列。

381a1fd874d0411eb928a7b11c667c74.png

        从表5-1可以看出,强分类器分类误差率低于弱分类器分类误差率,表明BP_Adaboost分类算法取得了良好的效果。

4案例扩展

        Adaboost方法不仅可以用于设计强分类器,还可以用于设计强预测器。强预测器设计思路与强分类器设计类似,都是先赋予测试样本权重,然后根据弱预测器预测结果调整测试样本权重并确定弱预测器权重,最后把弱预测器序列作为强预测器。不同的是在强分类器中增加预测错类别样本的权重,在强预测器中增加预测误差超过阈值的样本权重。采用BP_Ada-boost强预测器预测第2章中非线性函数输出﹐函数形式为

21d3c1b351d74dc4a00f51eba83a03f9.png

4.1matlab代码

         matlab程序如下: 

%% 该代码为基于BP_Adaboost的强预测器预测
%
% <html>
% <table border="0" width="600px" id="table1">	<tr>		<td><b><font size="2">该案例作者申明:</font></b></td>	</tr>	<tr><td><span class="comment"><font size="2">1:本人长期驻扎在此<a target="_blank" href="http://www.ilovematlab.cn/forum-158-1.html"><font color="#0000FF">板块</font></a>里,对该案例提问,做到有问必答。本套书籍官方网站为:<a href="http://video.ourmatlab.com">video.ourmatlab.com</a></font></span></td></tr><tr>		<td><font size="2">2:点此<a href="http://union.dangdang.com/transfer/transfer.aspx?from=P-284318&backurl=http://www.dangdang.com/">从当当预定本书</a>:<a href="http://union.dangdang.com/transfer/transfer.aspx?from=P-284318&backurl=http://www.dangdang.com/">《Matlab神经网络30个案例分析》</a>。</td></tr><tr>	<td><p class="comment"></font><font size="2">3</font><font size="2">:此案例有配套的教学视频,视频下载方式<a href="http://video.ourmatlab.com/vbuy.html">video.ourmatlab.com/vbuy.html</a></font><font size="2">。 </font></p></td>	</tr>			<tr>		<td><span class="comment"><font size="2">		4:此案例为原创案例,转载请注明出处(《Matlab神经网络30个案例分析》)。</font></span></td>	</tr>		<tr>		<td><span class="comment"><font size="2">		5:若此案例碰巧与您的研究有关联,我们欢迎您提意见,要求等,我们考虑后可以加在案例里。</font></span></td>	</tr>		</table>
% </html>
%% 清空环境变量
clc
clear

%% 下载数据
load data1 input output

%% 权重初始化
k=rand(1,2000);
[m,n]=sort(k);

%训练样本
input_train=input(n(1:1900),:)';
output_train=output(n(1:1900),:)';

%测试样本
input_test=input(n(1901:2000),:)';
output_test=output(n(1901:2000),:)';

%样本权重
[mm,nn]=size(input_train);
D(1,:)=ones(1,nn)/nn;

%训练样本归一化
[inputn,inputps]=mapminmax(input_train);
[outputn,outputps]=mapminmax(output_train);

K=10;
for i=1:K
    
    %弱预测器训练
    net=newff(inputn,outputn,5);
    net.trainParam.epochs=20;
    net.trainParam.lr=0.1;
    net=train(net,inputn,outputn);
    
    %弱预测器预测
    an1=sim(net,inputn);
    BPoutput=mapminmax('reverse',an1,outputps);
    
    %预测误差
    erroryc(i,:)=output_train-BPoutput;
    
    %测试数据预测
    inputn1=mapminmax('apply',input_test,inputps);
    an2=sim(net,inputn1);
    test_simu(i,:)=mapminmax('reverse',an2,outputps);
    
    %调整D值
    Error(i)=0;
    for j=1:nn
        if abs(erroryc(i,j))>0.2  %较大误差
            Error(i)=Error(i)+D(i,j);
            D(i+1,j)=D(i,j)*1.1;
        else
            D(i+1,j)=D(i,j);
        end
    end
    
    %计算弱预测器权重
    at(i)=0.5/exp(abs(Error(i)));
    
    %D值归一化
    D(i+1,:)=D(i+1,:)/sum(D(i+1,:));
    
end

%% 强预测器预测
at=at/sum(at);

%% 结果统计
%强分离器效果
output=at*test_simu;
error=output_test-output;
plot(abs(error),'-*')
hold on
for i=1:8
error1(i,:)=test_simu(i,:)-output;
end
plot(mean(abs(error1)),'-or')

title('强预测器预测误差绝对值','fontsize',12)
xlabel('预测样本','fontsize',12)
ylabel('误差绝对值','fontsize',12)
legend('强预测器预测','弱预测器预测')

4.2结果分析

        预测样本共有350组,共有10个BP神经网络构成弱预测器序列,强预测器分类误差绝对值和弱预测器预测平均误差绝对值如图5-2所示。

824fff7da4bd429ea4dcbd9ea9a43051.png         从图5-2可以看出,强预测器预测误差低于弱预测器预测误差,BP_Adaboost强预测器预测算法取得了良好的效果。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/777854.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman传递对象参数(包含有集合对象)

postman通常需要传递各式各样的参数&#xff0c;本文主要介绍了Postman传递对象参数(包含有集合对象)&#xff0c;具有一定的参考价值&#xff0c;感兴趣的小伙伴们可以参考一下 项目场景&#xff1a; postman通常需要传递各式各样的参数&#xff0c;这样的话&#xff0c;进行…

自然语言处理与词嵌入

1、词表特征 前面介绍过表征单词的方式是首先建立一个较大的词汇表&#xff08;例如10000&#xff09;&#xff0c;然后使用one-hot的方式对每个单词进行编码。例如单词Man&#xff0c;Woman&#xff0c;King&#xff0c;Queen&#xff0c;Apple&#xff0c;Orange分别出现在词…

Docker数据管理和网络通信 dockerfile

Docker数据管理和网络通信 dockerfile 一&#xff1a;Docker 的数据管理1&#xff0e;数据卷2&#xff0e;数据卷容器 二&#xff1a;端口映射三&#xff1a;容器互联&#xff08;使用centos镜像&#xff09;四&#xff1a;Docker 镜像的创建1&#xff0e;基于现有镜像创建2&am…

C++入门先填坑

C是在C的基础之上&#xff0c;容纳进去了面向对象编程思想&#xff0c;并增加了许多有用的库&#xff0c;以及编程范式等。熟悉C语言之后&#xff0c;对C学习也有一定的帮助。 C入门先填坑系列主要内容会围绕以下方面 补充C语言语法的不足&#xff0c;以及C是如何对C语言设计不…

servlet Filter与spring的OncePerRequestFilter

servlet 规范 javax.servlet Filter 任何的servlet容器都要实现的&#xff0c;例如tomcat、undertow、jetty等等。类似于jdbc规范&#xff0c;制定好了一个约束&#xff0c;各家数据库厂商根据规范开发对应的驱动来实现访问自己的数据库。 spring 对于Filter的自定义实现 所…

NLP(六十)Baichuan-13B-Chat模型使用体验

2023年7月11日&#xff0c;百川智能正式发布参数量130亿的通用大语言模型Baichuan-13B-Base、对话模型Baichuan-13B-Chat及其INT4/INT8两个量化版本。   本文将介绍大模型BaiChuan-13B-Chat的使用体验&#xff0c;其HuggingFace网址为&#xff1a;https://huggingface.co/bai…

【C语言day02】

转义字符 \\ 表示字符\&#xff0c;\123表示字符{&#xff0c;\t表示制表符&#xff0c;这些都是一个字符宏只是替换 替换后NUM的样子是(211)*21/2常量指针与指针常量 const和* 来区别&#xff0c;如果是const * 这样的顺序就是常量指针&#xff0c;所以说他的本质是指针&am…

uni-app:请求后端数据uni.request

完整代码&#xff1a; onLoad() {uni.request({url: getApp().globalData.position Produce/select_employee,data: {username: getApp().globalData.username,},method: POST,dataType: json,success: res > {this.employee_name res.data.info.employee_name;// consol…

uniapp 之 微信小程序、支付宝小程序 对于自定义导航栏的不同

目录 前言 微信小程序 代码 支付宝小程序 首页配置文件 二级菜单页面 配置 总结 不同 相同 前言 小程序都是 uni-app 写的 不是原生 微信小程序 代码 pages.json文件中配置 重点&#xff1a; "navigationStyle": "custom", // 导航栏样式…

安卓开发日记问题记录(隐藏标题栏中的应用名称)

当我们设置了显示标题栏&#xff0c;应用名也会显示出来&#xff0c;这对设置标题栏内容很不方便 可以在activity里的onCreate部分设置这句代码隐藏APP名字 getSupportActionBar().setDisplayShowTitleEnabled(false);或者改变它 getSupportActionBar().setTitle("new …

疲劳驾驶检测和识别1: 疲劳驾驶检测和识别数据集(含下载链接)

疲劳驾驶检测和识别1&#xff1a; 疲劳驾驶检测和识别数据集(含下载链接) 目录 疲劳驾驶检测和识别1&#xff1a; 疲劳驾驶检测和识别数据集(含下载链接) 1. 前言 2. 疲劳驾驶类别说明 3. 疲劳驾驶检测数据集&#xff1a; &#xff08;1&#xff09;Drowsy-Driving-Det1 …

hadoop安全保护机制(kerberos + ldap)

信息安全理论&#xff1a; CIA模型&#xff1a;机密性、完整性和可用性 CIA模型能够帮助建议一些信息安全原则&#xff0c;但该模型并不是一个需要严格遵守的规则 hadoop平台可能设计多个CIA模型组件&#xff0c;也kennel一个也不涉及 机密性&#xff1a; 信息只应该被期望的…

高压放大器的增益和偏压是什么意思

高压放大器是一种广泛应用的电子元器件&#xff0c;主要用于放大高压信号和驱动负载等方面。在实际应用中&#xff0c;了解高压放大器的增益和偏压是非常重要的&#xff0c;下面安泰电子将详细介绍它们的意义和作用。 高压放大器的增益 增益是指放大器输入信号与输出信号之间的…

iClient3D for CesiumWebGL入门之使用vscode以服务方式运行调试

作者&#xff1a;超图研究院技术支持中心-于丁 iClient3D for Cesium&WebGL入门之使用vscode以服务方式运行调试 相信大家第一次使用SuperMap iClient3D for Cesium或SuperMap iClient3D for WebGL的时候&#xff0c;都遇到过和我一样的事情&#xff1a; 在文件夹中直接打…

二极管钳位电路的原理与实际应用

写在前面 本文参考了什么是二极管钳位的作用及原理&#xff1f; - 知乎 针对一些文章讲述错误的地方进行了更正&#xff0c;在讲述不清楚的地方进行了详细的解释&#xff0c;还请各位两篇文章结合而看&#xff0c;效果更佳。 钳位电路说明 1.我们都知道二极管具有单向导电性&a…

【Ajax】笔记-Ajax重复发送请求

问题的产生 用户频繁地点击一个发送请求的按钮&#xff0c;服务器就会频繁地处理请求&#xff0c;而且处理的内容是一样的&#xff0c;这样会导致服务器的压力很大。 这种情况下服务器就没有必要处理每一个请求。 解决方案 发送请求的时候先查看有没有正在请求的相同请求&am…

docker - prometheus+grafana监控与集成到spring boot 服务

一、Prometheus 介绍 1.数据收集器&#xff0c;它以配置的时间间隔定期通过HTTP提取指标数据。 2.一个时间序列数据库&#xff0c;用于存储所有指标数据。 3.一个简单的用户界面&#xff0c;您可以在其中可视化&#xff0c;查询和监视所有指标。二、Grafana 介绍 Grafana 是一…

Android图形系统之ANativeWindow与Surface关系(十二)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

Unity 之 错误的停止协程的方式

相信很多人都会这样开启一个协程 StartCoroutine(Cor_1()); 这样确实没啥毛病&#xff0c;那么怎么关掉这个协程呢&#xff0c;是不是在想也是一样的传cor_1()这个参数&#xff0c;然后start对应stop,试着输入stopCor....诶&#xff0c;代码提示有这个方法喔&#xff0c;然后…

【计算机网络】socket编程基础

文章目录 1. 源IP地址和目的IP地址2. 理解MAC地址和目的MAC地址3. 理解源端口号和目的端口号4. PORT与PID5. 认识TCP协议和UDP协议6. 网络字节序7. socket编程接口7.1 socket常见API7.2 sockaddr结构 1. 源IP地址和目的IP地址 因特网上的每台计算机都有一个唯一的IP地址&#…