【机器学习-决策树模块-基础算法-1)ID3算法】

在线体验各类最新模型,更有模型 免费Token 额度领取!
立即体验
简介: 【机器学习-决策树模块-基础算法-1)ID3算法】

决策树最最最基础的三个算法:

对于什么是决策树,决策树的基本概念网上已经多的不能再多了这里不再赘述,直接切入正题,决策树的算法以及实现。

至于遇到的必须要掌握的信息论相关知识,我会在这篇文章里根据自己遇到的知识来持续更新:

点击打开链接:(http://blog.csdn.net/qq_36396104/article/details/79275836)

-------------------------------------------------------------------------------------------------------------------------

一.ID3

· ID3算法是由Quinlan首先提出的,该算法以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。首先,ID3算法需要解决的问题是如何选择特征作为划分数据集的标准。在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。就是对各个feature信息计算信息增益,然后选择信息增益最大的feature作为决策点将数据分成两部分然后再对这两部分分别生成决策树。

 ·通过迭代的方式,我们可以得到决策树模型。

网络异常,图片无法展示
|
   
网络异常,图片无法展示
|
 

 

·至于什么是ID3决策树的终止条件以及其它的问题,还是放到例子里进行理解:(最近数学建模需要,用matlab代码,   python代码需要的可以看这篇博客:机器学习实战_初识决策树算法_理解其python代码(一)

----------------------------------------------------------------------------------------------------------------------------

·实例:

  实例:通过这几个指标(age,income,等等)来判断是否买电脑。

网络异常,图片无法展示
|

共14条记录,目标属性是,是否买电脑,共有两个情况,yes或者no。

首先需要对数据处理,例如age属性,我们用0表示youth,1表示middle_aged,2表示senior等。


网络异常,图片无法展示
|

·实例的MATLAB代码:

%% Decision Tree
% ID3

·1、导入数据

%data = [1,1,1;1,1,1;1,0,0;0,1,0;0,1,0]; 
data = [0,2,0,0,0;
    0,2,0,1,0;
    1,2,0,0,1;
    2,1,0,0,1;
    2,0,1,0,1;
    2,0,1,1,0;
    1,0,1,1,1;
    0,1,0,0,0;
    0,0,1,0,1;
    2,1,1,0,1;
    0,1,1,1,1;
    1,1,0,1,1;
    1,2,1,0,1;
    2,1,0,1,0];
% 生成决策树createTree(data);

·2、开始创建决策树

%CREATTREE 此处显示有关此函数的摘要
%   此处显示详细说明
function [ output_args ] = createTree( data )
    [m,n] = size(data);%m行n列
    disp('original data:');
    disp(data);%显示导入的数据
    classList = data(:,n);
    %记录第一个类的个数:
    classOne = 1;
    for i = 2:m
        if classList(i,:) == classList(1,:)
            classOne = classOne+1;
        end
    end
    % 类别全相同
    if classOne == m
        disp('final data: ');
        disp(data);
        return;
    end
    % 特征全部用完
    if n == 1
        disp('final data: ');
        disp(data);
        return;
    end
    bestFeat = chooseBestFeature(data);%% 选择信息增益最大的特征
    disp(['bestFeat: ', num2str(bestFeat)]);
    featValues = unique(data(:,bestFeat));
    numOfFeatValue = length(featValues);
    for i = 1:numOfFeatValue
        createTree(splitData(data, bestFeat, featValues(i,:)));
        disp('-------------------------');
    end
end

·3、选择信息增益最大的特征

%% 选择信息增益最大的特征
function [ bestFeature ] = chooseBestFeature( data )
    [m,n] = size(data);% 得到数据集的大小
    % 统计特征的个数
    numOfFeatures = n-1;%最后一列是类别
    % 得到原始的熵
    baseEntropy = calEntropy(data);
    bestInfoGain = 0;%初始化信息增益
    bestFeature = 0;% 初始化最佳的特征位
    % 挑选最佳的特征位
    for j = 1:numOfFeatures
        featureTemp = unique(data(:,j));%得到每个feature的属性
        numF = length(featureTemp);%属性的个数
        newEntropy = 0;%划分之后的熵
        for i = 1:numF
            subSet = splitData(data, j, featureTemp(i,:));
            [m_1, n_1] = size(subSet);
            prob = m_1./m;
            newEntropy = newEntropy + prob * calEntropy(subSet);%计算划分之后的熵,此时的subSet里的变量只有一个值(这样复用函数对计算的效率会有点影响)
        end
        %计算信息增益(熵 - 条件熵)
        infoGain = baseEntropy - newEntropy;
        if infoGain > bestInfoGain
            bestInfoGain = infoGain;
            bestFeature = j;
        end
    end
end
4、一些基础的计算函数


function [ entropy ] = calEntropy( data )
    [m,n] = size(data);
    % 得到类别的项
    label = data(:,n);
    % 处理label
    label_deal = unique(label);%得到所有的类别
    numLabel = length(label_deal);
    prob = zeros(numLabel,2);%存储每个标签的个数
    % 统计每个标签的个数
    for i = 1:numLabel
        prob(i,1) = label_deal(i,:);
        for j = 1:m
            if label(j,:) == label_deal(i,:)
                prob(i,2) = prob(i,2)+1;
            end
        end
    end
    % 计算熵
    prob(:,2) = prob(:,2)./m;%存储每个标签的概率
    entropy = 0;
    for i = 1:numLabel
        entropy = entropy - prob(i,2) * log2(prob(i,2));
    end
end
function [ subSet ] = splitData( data, axis, value )  
    [m,n] = size(data);%得到待划分数据的大小  
    subSet = data;  
    %除去第axis个feature,得到剩下的满足第axis列值为value的data 
    subSet(:,axis) = []; 
    k = 0;  
    for i = 1:m  
        if data(i,axis) ~= value  
            subSet(i-k,:) = [];  
            k = k+1;  
        end  
    end

从这个例子来看,ID3决策树还是很简单的,就是通过计算信息增益来得到最有价值的那个feature,这样不断迭代,直到遍历完所有的features,从而得到决策树。

决策树ID3算法的不足:

    ID3算法虽然提出了新思路,但是还是有很多值得改进的地方。  

    a)ID3没有考虑连续特征,比如长度,密度都是连续值,无法在ID3运用。这大大限制了ID3的用途。

    b)ID3采用信息增益大的特征优先建立决策树的节点。很快就被人发现,在相同条件下,取值比较多的特征比取值少的特征信息增益大。比如一个变量有2个值,各为1/2,另一个变量为3个值,各为1/3,其实他们都是完全不确定的变量,但是取3个值的比取2个值的信息增益大。如果校正这个问题呢?

    c) ID3算法对于缺失值的情况没有做考虑

    d) 没有考虑过拟合的问题

end

-------------------------------------------------------------------------------------------------------------------------

ID3 算法的作者昆兰基于上述不足,对ID3算法做了改进,这就是C4.5算法:

http://blog.csdn.net/qq_36396104/article/details/79291740


AIEarth是一个由众多领域内专家博主共同打造的学术平台,旨在建设一个拥抱智慧未来的学术殿堂!【平台地址:https://devpress.csdn.net/aiearth】 很高兴认识你!加入我们共同进步!

目录
相关文章
|
9月前
|
存储 机器学习/深度学习 监控
网络管理监控软件的 C# 区间树性能阈值查询算法
针对网络管理监控软件的高效区间查询需求,本文提出基于区间树的优化方案。传统线性遍历效率低,10万条数据查询超800ms,难以满足实时性要求。区间树以平衡二叉搜索树结构,结合节点最大值剪枝策略,将查询复杂度从O(N)降至O(logN+K),显著提升性能。通过C#实现,支持按指标类型分组建树、增量插入与多维度联合查询,在10万记录下查询耗时仅约2.8ms,内存占用降低35%。测试表明,该方案有效解决高负载场景下的响应延迟问题,助力管理员快速定位异常设备,提升运维效率与系统稳定性。
368 4
|
存储 机器学习/深度学习 算法
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty 敏感词
KMP、Trie树 、AC自动机‌ ,三大算法实现 优雅 过滤 netty  敏感词
|
监控 算法 安全
基于 C# 基数树算法的网络屏幕监控敏感词检测技术研究
随着数字化办公和网络交互迅猛发展,网络屏幕监控成为信息安全的关键。基数树(Trie Tree)凭借高效的字符串处理能力,在敏感词检测中表现出色。结合C#语言,可构建高时效、高准确率的敏感词识别模块,提升网络安全防护能力。
301 2
|
监控 算法 数据处理
基于 C++ 的 KD 树算法在监控局域网屏幕中的理论剖析与工程实践研究
本文探讨了KD树在局域网屏幕监控中的应用,通过C++实现其构建与查询功能,显著提升多维数据处理效率。KD树作为一种二叉空间划分结构,适用于屏幕图像特征匹配、异常画面检测及数据压缩传输优化等场景。相比传统方法,基于KD树的方案检索效率提升2-3个数量级,但高维数据退化和动态更新等问题仍需进一步研究。未来可通过融合其他数据结构、引入深度学习及开发增量式更新算法等方式优化性能。
320 17
|
存储 监控 算法
局域网上网记录监控的 C# 基数树算法高效检索方案研究
在企业网络管理与信息安全领域,局域网上网记录监控是维护网络安全、规范网络行为的关键举措。随着企业网络数据量呈指数级增长,如何高效存储和检索上网记录数据成为亟待解决的核心问题。基数树(Trie 树)作为一种独特的数据结构,凭借其在字符串处理方面的卓越性能,为局域网上网记录监控提供了创新的解决方案。本文将深入剖析基数树算法的原理,并通过 C# 语言实现的代码示例,阐述其在局域网上网记录监控场景中的具体应用。
283 7
|
人工智能 算法 语音技术
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
清华大学与腾讯联合推出的Video-T1技术,通过测试时扩展(TTS)和Tree-of-Frames方法,显著提升视频生成的连贯性与文本匹配度,为影视制作、游戏开发等领域带来突破性解决方案。
544 4
Video-T1:视频生成实时手术刀!清华腾讯「帧树算法」终结闪烁抖动
|
算法 Java
算法系列之数据结构-Huffman树
Huffman树(哈夫曼树)又称最优二叉树,是一种带权路径长度最短的二叉树,常用于信息传输、数据压缩等方面。它的构造基于字符出现的频率,通过将频率较低的字符组合在一起,最终形成一棵树。在Huffman树中,每个叶节点代表一个字符,而每个字符的编码则是从根节点到叶节点的路径所对应的二进制序列。
470 3
 算法系列之数据结构-Huffman树
|
机器学习/深度学习 算法 搜索推荐
决策树算法如何读懂你的购物心理?一文看懂背后的科学
"你为什么总能收到刚好符合需求的商品推荐?你有没有好奇过,为什么刚浏览过的商品就出现了折扣通知?
372 0
|
存储 算法 测试技术
【C++数据结构——树】二叉树的遍历算法(头歌教学实验平台习题) 【合集】
本任务旨在实现二叉树的遍历,包括先序、中序、后序和层次遍历。首先介绍了二叉树的基本概念与结构定义,并通过C++代码示例展示了如何定义二叉树节点及构建二叉树。接着详细讲解了四种遍历方法的递归实现逻辑,以及层次遍历中队列的应用。最后提供了测试用例和预期输出,确保代码正确性。通过这些内容,帮助读者理解并掌握二叉树遍历的核心思想与实现技巧。
738 3
|
算法
树的遍历算法有哪些?
不同的遍历算法适用于不同的应用场景。深度优先搜索常用于搜索、路径查找等问题;广度优先搜索则在图的最短路径、层次相关的问题中较为常用;而二叉搜索树的遍历在数据排序、查找等方面有重要应用。
551 2

热门文章

最新文章