随机森林原理及其用于分类问题的matlab实现

2023-11-13

随机森林

随机森林是多个决策树的集成学习,每个决策树用bagging的方法选数据集,并且在选择最佳属性划分的时候随机划分一些属性进行分类,比单个分类器效果更好,泛化能力更强。

代码解释

1.用结构体的嵌套实现树的结构。
2.makerandomtree递归的创建树。
3.可自动适应不同的类别标签,不同的属性个数和不同的类别个数。
4.函数ent(D)返回D的信息熵。

代 码

树的主体:

function tree=makerandomtree(D,a) 
tree=struct('isnode',1,'a',0.0,'mark',0.0,'child',{});%isnode判断是否是分支还是叶子,a表示节点属性,若节点是叶子,a表示分类结果,child是孩子
tree(1).a=1;%给tree分配一个确切的内存
if length(unique(D(:,end)))==1%D中样本属于同一类别
    tree.isnode=0;%把tree标记为树叶
    tree.a=D(1,end);%把tree的类别标记为D的类别
    return
end
if sum(a)==0 ||length(D)==0 %属性划分完毕
    tree.isnode=0;%把tree标记为树叶
    tree.a=mode(D(:,end));%把tree的类别标记为D出现最多的类别
    return
end
for i=1:length(a)
    if a(i)==1
        if length(unique(D(:,i)))==1
            tree.isnode=0;%把tree标记为树叶
            tree.a=mode(D(:,end));%把tree的类别标记为D出现最多的类别
            return
        end
    end
end
k=ceil(log2(sum(a)));%随机选k个属性进行学习
randomindices=zeros(length(a),1); %随机去掉属性的索引,结束之后要恢复随机去掉的属性
if k>1
i=1;
su=sum(a);
while 1 %随机去掉一些属性,使得剩下的属性是k个
    random1=randperm(length(a),1);
    if a(random1)==1
        randomindices(random1)=1;
        a(random1)=0;
        i=i+1;
    end
    if i==(su-k+1)
        break;
    end
end
end

gain=zeros(length(a),1); %保存每个属性的信息增益
best=zeros(length(a),1); %保存每个属性的最佳划分

for i=1:length(a)
    if a(i)==1
        t=D(:,i);
        t=sort(t);
    
        gain1=zeros(length(t)-1,1);
        for j=1:length(t)-1%二分划分
            ta=(t(j)+t(j+1))/2;
         
            Df=D(D(:,i)<=ta,:);
            Dz=D(D(:,i)>ta,:);
            gain1(j)=ent(D)-(ent(Df)*length(Df(:,end))/length(D(:,end))+ent(Dz)*length(Dz(:,end))/length(D(:,end)));
        end
     
        [gain(i),j]=max(gain1);
        ta=(t(j)+t(j+1))/2;
        best(i)=ta; 
    end
end
[~,m]=max(gain);%选择信息增益最大的属性
D1=D(D(:,m)<=best(m),:);
D2=D(D(:,m)>best(m),:);
a(m)=0;
for i=1:length(a)  %恢复随机去掉的属性
    if randomindices(i)==1
        a(i)=1;
    end
end
tree.a=best(m); %建立分支
tree.mark=m;
% disp('****************************')
% tree.a
% tree.mark
tree.isnode=1;
tree.child(1)=makerandomtree(D1,a);
tree.child(2)=makerandomtree(D2,a);

end

计算ent

function f=ent(D)%计算信息商
l=unique(D(:,end));
if length(D)==0
    f=0;
    return
end
f=0;
t=zeros(length(l),1);
for i=1:length(D(:,end))
    for j=1:length(l)
        if D(i,end)==l(j)
            t(j)=t(j)+1;
            break;
        end
    end
end
n=length(D(:,end));
for i=1:length(l)
    f=f+(t(i)/n)*log2(t(i)/n);
end
f=-f;
end

主函数

function randomforest()
clc
clear all
T=3;%bagging采样的次数
M = importdata('D:\毕业设计\数据集1\australian.txt');  %读取数据
[sm,sn]=size(M);
% for i=1:sm             %归一化
%     mins=min(M(i,1:sn-1));
%     maxs=max(M(i,1:sn-1));
%     for j=1:sn-1
%         M(i,j)=2*(M(i,j)-mins)/(maxs-mins)-1;
%     end
% end
indices=crossvalind('Kfold',M(1:sm,sn),10); %十折交叉,划分训练集和测试集
testindices=(indices==1); %测试集索引
trainindices=~testindices;%训练集索引
trainset=M(trainindices,:); %获取训练集
testset=M(testindices,:);%获取测试集
[testm,~]=size(testset);
[trainm,trainn]=size(trainset);

predict=zeros(trainm,T);
for t=1:T %开始bagging采样
    D=[];%训练集
    for i=1:trainm%采样
        k=randperm(trainm,1);
        D=[D;trainset(k,:)];
    end
    [~,sn]=size(D);
    a=ones(sn-1,1);%属性集合a,1代表该属性未被划分
    
    tree=makerandomtree(D,a);%递归构造简单决策树
    
    for i=1:trainm
        treet=tree;
        while 1
           
            if treet.isnode==0
                predict(i,t)=treet.a;
                break;
            end
            if trainset(i,treet.mark)<=treet.a
                treet=treet.child(1);
            else
                treet=treet.child(2);
            end
          
        end
    end
    
end
acc=0;
for i=1:trainm
    if trainset(i,end)==mode(predict(i,:))
        acc=acc+1;
    end
end
acc=acc/trainm
end

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

随机森林原理及其用于分类问题的matlab实现 的相关文章

随机推荐

  • 理解 spring 事务传播行为与数据隔离级别

    本文是为了个人学习使用 原文章链接 https www jianshu com p 760399781b78 https blog csdn net m0 37524661 article details 84935117 注 1 事务的隔
  • vite和webpack的区别

    vite和webpack的区别 1 前言 2 Webpack 2 1 Webpack简述 2 2 Webpack常用插件 3 Vite 3 1 Vite简述 3 2 Vite插件推荐 4 区别 4 1 开发模式不同 4 2 打包效率不同 4
  • 管理中计算机系统的应用论文,浅谈计算机数据库的管理与应用论文

    浅谈计算机数据库的管理与应用论文 摘要 随着社会经济的快速发展 信息化网络技术手段不断进步 信息技术在人们日常生活 工作及学习中的广泛渗透 不仅给人们生活带来了极大便利 还极大的提升了人们工作与学习效率 为社会各领域的发展起到了巨大的推动作
  • 类属性和实例属性名字冲突怎么办

    修改类属性会导致所有实例访问到的类属性全部都受影响 但是 如果在实例变量上修改类属性会发生什么问题呢 class Person object address Earth def init self name self name name p
  • 数据仓库工程师面经(未完)

    HIVE Hive row number dense rank rank三个函数的区别 Hive 窗口函数如何设置窗口大小 Hive order by sort by distribute by cluster by 区别 Hive map
  • 《Java Web开发框架——MyEclipse的安装、配置》

    Java Web程序设计 MyEclipse的安装 配置 具体安装 配置过程请参考下面的博客 MyEclipse安装 配置 测试 博客园 原博客中所需文件均存放于百度网盘中 如下载速度较慢 可使用下面的云盘进行下载 天翼云盘 不限速 访问码
  • HR:“最喜欢阿里出来的程序员了,技术又好又耐艹!” 我:???

    面试造火箭 进厂拧螺丝 真的是这样吗 缘起 估计不少同学都是被标题吸引进来的 事先声明 这句话不是我虚构的 而是我实实在在从同事的口中听到的 而且还不止一次 当时的场景就是很正常的交谈 别人也并没有故意尖酸刻薄的成分 完全就是正常的谈天的口
  • 三种常见的文件共享服务--ftp,nfs,samba

    FTP File Transfer Protocol 文件传输协议 是一种应用层协议 可以实现很好的实现跨平台 但是无法实现一些其他的功能 像如文件系统挂载等功能 NFS Network File System 网路文件系统 是工作在内核模
  • codisQ&A

    Codis 是什么 Codis 是 Wandoujia Infrastructure Team 开发的一个分布式 Redis 服务 用户可以看成是一个无限内存的 Redis 服务 有动态扩 缩容的能力 对偏存储型的业务更实用 如果你需要 S
  • git中将某一分支代码完全覆盖另一分支

    如果需要将分支1的代码覆盖到分支2上 只需要如下操作 1 切换到分支2 git checkout 分支2 2 设置代码给远程的分支1 git reset hard origin 分支1 3 本地已覆盖 推送到远程分支上 git push f
  • 【Github】查看项目时可以清晰明了的看到项目的结构以及具体代码

    效果如下 Octotree通过左侧面板中的目录轻松浏览仓库的源代码 如下图 Octotree安装步骤 1 下载octotree 路径 https dl pconline com cn download 2561546 html 如果下载不成
  • 7-11 计算天数 (15 分)

    本题要求编写程序计算某年某月某日是该年中的第几天 输入格式 输入在一行中按照格式 yyyy mm dd 即 年 月 日 给出日期 注意 闰年的判别条件是该年年份能被4整除但不能被100整除 或者能被400整除 闰年的2月有29天 输出格式
  • 解决brew卡在Updating Homebrew...的正确姿势

    Updating的终端不要关 新开一个标签页 直接输入后续命令即可
  • Android 页面倒计时跳转 微博启动页为例

    首先创建项目 然后在右键再创一个empty avtivity xml布局中的图片自己去找然后复制进去 可复制进drawable中
  • 00 数组基础知识

    1 数组的存储方式 数组是存放在连续内存空间上的相同类型数据的集合 数组可以方便的通过下表索引的方式获取到下表下对应的数据 注意 数组的下标都是从0开始的 数组内存空间的地址是连续的 数组中存放的数据类型相同 正是因为数组的在内存空间的地址
  • 逆向爬虫07 requests进阶(反爬)

    逆向爬虫07 requests进阶 反爬 1 有些网站会在被访问时 检查客户端是否为浏览器 如果不是浏览器则拒绝访问 该问题可以通过在requests请求中 添加浏览器header参数 装成浏览器 import requests url h
  • BadImageFormatException,如果在安装32位oracle客户端组件的情况下以64位模式运行,将出现此问题

    今天开发人员发过来个问题 如题 现场是64位oracle 64位数据库主机 32 64位 具体不能确定 应用 64位应用中间件服务器 32位oracle客户端 这个问题按照字面来理解 就是安装了32位oracle客户端 但是试图以64位模式
  • Flask-SQLAlchemy插件

    Flask SQLALchemy插件 另外一个框架 叫Flask SQLAlchemy Flask SQLAlchemy是对SQLAlchemy进行了一个简单的封装 使得我们在flask中使用sqlalchemy更加的简单 可以通过 pip
  • 【RouterOS】利用ros搭建×××(PPTP)服务器要点

    关于拨号 与此对应的还有SiteToSite 的用途 我想不必多说 举几个例子 1 公司员工出差在外 需要收取公司内网的邮件 就需要 拨号进入公司内网收发邮件 2 网吧的技术人员在家休假时 需要远程维护网吧服务器 也需要 拨号进入网吧的网络
  • 随机森林原理及其用于分类问题的matlab实现

    随机森林 随机森林是多个决策树的集成学习 每个决策树用bagging的方法选数据集 并且在选择最佳属性划分的时候随机划分一些属性进行分类 比单个分类器效果更好 泛化能力更强 代码解释 1 用结构体的嵌套实现树的结构 2 makerandom