ID3很不错的讲解(matlab程序实现)

1)决策树之ID3

决策树算法是分类算法的一种,基础是ID3算法,C4.5、C5.0都是对ID3的改进。ID3算法的基本思想是,选择信息增益最大的属性作为当前的分类属性。

看Tom M. Mitchell老师的《Machine Learing》第三章中的例子:

我们先解释一下这张表,表中有14条实例数据,就是我们的训练数据,其中 Outlook,Temperature,Humidity ,Wind 称作条件属性PlayTennis 称作是决策属性(标签)

每一个属性都有各自的值记做:Value(Outlook)={Sunny,OverCast,Rain},Value(Temperature)={Hot,Mild,Cool},Value(Humidity)={High,Normal},Value(Wind)={Strong,Weak},Value(PlayTennis)={NO,Yes}。

第一个重要的概念:Entropy。

我们数一下  决策属性PlayTennis,一共有两个类别:Yes,No。Yes的实例数是 9,No的实例数是 5。计算决策属性的Entropy(熵):计算结果为:0.940286

这里的决策属性S的值只有两个值(Yes,No),当然可以有多个值(s1,s2,s3,...,sk),这些决策属性的值的概率分别为:p1,p2,p3,...,pk所以决策属性的Entroy的计算公式:

第二个重要的概念:information gain(信息增益)

我们只拿Outlook条件属性举例,其他的属性一样:

Value(Outlook)={Sunny,OverCast,Rain}:Outlook是sunny的实例数为5(其中Yes的个数为2,No的个数为3),占总的实例数为5/14,那么针对sunny的Entropy:

Entropy(Sunny)=,计算结果为:0.97095

Outlook是OverCast的实例数为4(其中Yes的个数为4,No的个数为0),占总的实例数为4/14,那么针对Overcast的Entropy:

,计算结果为:0

Outlook是Rain的实例数为5(其中Yes的个数为3,No的个数为2),占总的实例数为5/14,那么针对Rain的Entropy,

,计算结果为:0.97095

那么最后针对Outlook条件属性的information gain为:

,计算结果为:0.24675

所以针对某一条件属性的information gain为:

那么其他三个条件属性Temperature、Humidity、Wind的信息增益为:

我们看到Outlook的信息增益是最大的,所以作为决策树的一个根节点。即:

然后,从Outlook下面出来三个树枝,最左边的Sunny,我们从Outlook是Sunny的实例数据中,找到信息增益最大的那一个,依次类推。(注释:http://blog.csdn.net/mmc2015/article/details/42525655;而下面程序本人写的)
clc;
clear all;
close all;

%% 导入数据
%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];
% data = {‘sunny‘,‘hot‘,‘high‘,‘week‘,‘no‘;
%              ‘sunny‘,‘hot‘,‘high‘,‘strong‘,‘no‘;
%              ‘overcast‘,‘hot‘,‘high‘,‘week‘,‘yes‘;
%              ‘rain‘,‘midd‘,‘high‘,‘week‘,‘yes‘;
%              ‘rain‘,‘cool‘,‘nomal‘,‘week‘,‘yes‘;
%              ‘rain‘,‘cool‘,‘nomal‘,‘strong‘,‘no‘;
%              ‘overcast‘,‘cool‘,‘nomal‘,‘strong‘,‘yes‘;
%              ‘sunny‘,‘midd‘,‘high‘,‘week‘,‘no‘;
%              ‘sunny‘,‘cool‘,‘nomal‘,‘week‘,‘yes‘;
%              ‘rain‘,‘midd‘,‘nomal‘,‘week‘,‘yes‘;
%              ‘sunny‘,‘midd‘,‘nomal‘,‘strong‘,‘yes‘;
%              ‘overcast‘,‘midd‘,‘high‘,‘strong‘,‘yes‘;
%              ‘overcast‘,‘hot‘,‘nomal‘,‘week‘,‘yes‘;
%              ‘rain‘,‘midd‘,‘high‘,‘strong‘,‘no‘};
%sunuy-0,overcast-1,rain-2;--hot-2,midd-1,cool-2---high-0,nomal-1--week-0,strong-1,no-0,yes-1

%% 生成决策树
make_tree(data);

function  make_tree(train_data)
%input                 train_data          训练数据
%output               

[m,n] = size(train_data);
disp(‘original data‘);
disp(train_data);
class_list = train_data(:,n);
class_first = 1;

for i = 2:m
   if train_data(i,n) ==  class_list(1,:)
%    if strcmp(train_data(i,n),class_list(1,:))
        class_first = class_first + 1;
    end
end

%% 退出程序条件
if class_first == m || n == 1
    disp(‘final data‘);
    disp(train_data);
    return;
end

%% 建立决策树
bestfeat = choose_bestfeat(train_data);

disp([‘bestfeature:‘,num2str(bestfeat)]);

featvalue = unique(train_data(:,bestfeat));

featvalue_num = length(featvalue);

for i = 1:featvalue_num
    make_tree(splitData(train_data,bestfeat,featvalue(i,:)));
    disp(‘--------------------------------------------‘);
end
end

function [best_feature] = choose_bestfeat(data)
%input                 data                        输入数据
%output               bestfeature             选择特征值

[m,n] = size(data);
feature_num = n - 1;
baseentropy = calc_entropy(data);

best_gain = 0;
best_feature = 0;

%% 挑选最佳特征位
for j =1:feature_num
    feature_temp = unique(data(:,j));
    num_f = length(feature_temp);
    new_entropy = 0;
    for i = 1:num_f
        subSet = splitData(data, j, feature_temp(i,:));
        [m_s,n_s] = size(subSet);
        prob = m_s./m;
        new_entropy = new_entropy + prob * calc_entropy(subSet);
    end
    inf_gain = baseentropy - new_entropy;
    if inf_gain > best_gain
        best_gain = inf_gain;
        best_feature = j;
    end
end
end

function [entropy] = calc_entropy(train_data)
%input                 train_data          训练数据
%output               entropy             熵值

[m,n] = size(train_data);

%% 得到类的项并统计每个类的个数
label_value = train_data(:,n);
label = unique(label_value);
label_number = zeros(length(label),2);
label_number(:,1) = label‘;
for i = 1:length(label)
    label_number(i,2) = sum(label_value == label(i));
end

%% 计算熵值
label_number (:,2) = label_number(:,2) ./ m;
entropy = 0;
entropy = sum(-label_number(:,2).*log2 (label_number(:,2)));

end

function [subSet] = splitData(data, j, value)
%input                 data              训练数据
%input                  j                   对应第j个属性
%input                 value             第j个属性对应的特征值
%output               sunset              熵值

subSet = data;
subSet(:,j) = [];
k = 0;
for i = 1:size(data,1)
    if data(i,j) ~= value
        subSet(i-k,:) =[];
        k = k + 1;
    end
end
end

function [subSet] = splitData(data, j, value)
%input                 data              训练数据
%input                  j                   对应第j个属性
%input                 value             第j个属性对应的特征值
%output               sunset              熵值

subSet = data;
subSet(:,j) = [];
k = 0;
for i = 1:size(data,1)
    if data(i,j) ~= value
        subSet(i-k,:) =[];
        k = k + 1;
    end
end
end
时间: 2024-11-10 03:29:14

ID3很不错的讲解(matlab程序实现)的相关文章

SQL注入原理讲解,很不错!

SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员社区CSDN网站的用户数据库被黑客公开发布,600万用户的登录名及密码被公开泄露,随后又有多家网站的用户密码被流传于网络,连日来引发众多网民对自己账号.密码等互联网信息被盗取的普遍担忧. 网络安全成为了现在互联网的焦点,这也恰恰触动了每一位用户的神经,由于设计的漏洞导致了不可收拾的恶果,验证了一句话

信息安全行业里面一些很不错的书

http://bbs.byr.cn/#!article/Focus/45726 发信人: RSA (RSA), 信区: Security 标  题: 信息安全行业里面一些很不错的书 发信站: 北邮人论坛 (Thu Mar  1 12:25:17 2012), 站内   A Practical Guide to Federal Enterprise Architecture.pdf FEA架构的书,内容不错,可惜不大适用于企业,更适用于我国政务网结构:  A Supply Chain Manage

matlab 程序发布

将matlab程序发布为可执行程序包 说明,这种可执行程序包可以在没有安装matlab的计算机上运行. 1. 打开Applicaiton Compler 如果下拉列表中没有这个APPLICATIONDEPLOYMENT的话,可能是没有安装此组件.请通过添加Addons的方式,或者利用Matlab的安装程序安装. 在matlab 命令窗口中可以输入 deploytool 打开Application Compiler窗口. 2. 添加相关文件,并给出描述. 在打开的Application Compi

TinyShop 最近发现的一个很不错的系统,最近会好好研究一下。

最近下载体验了一下,感觉很不错,特别是扩展起来非常的方便,和高效.正好最近也在考虑电商的更高一层次的研究. 给大家一些截图分享一下. 以下是他们的一些介绍,也能对它有一个大概的了解 TinyShop功能介绍: 1.强大的框架支持 TinyShop基于Tiny框架开发,使系统更加高效.稳定.快捷.安全. 2.强大的后台定制化管理 后台管理,通过角色进行权限分配,权限可以控制每一个执行动作,时时性权限控制可及时控制角色的权限,即使用户在线,亦可瞬间使角色增加和减少权限且即使生效,最大程序的保护程序的

二值法方法综述及matlab程序

在某些图像处理当中一个关键步是二值法,二值化一方面能够去除冗余信息,另一方面也会使有效信息丢失.所以有效的二值化算法是后续的处理的基础.比如对于想要最大限度的保留下面图的中文字,以便后续的定位处理. 二值化算法包括全局二值化和局部二值化, 全局二值化具有速度快但效果相对差的特点, 局部二值化算法具有速度慢效果好的特点. 原图 全局阈值              方法一:直接采用im2bw ;手动阈值 方法二:迭代法求阈值 迭代式阈值选取的基本思路是:首先根据图像中物体的灰度分布情况,选取一个近似

Log和Canny边缘检测(附Matlab程序)

  一. 实验目的 (1) 通过实验分析不同尺度下LOG和Canny边缘提取算子的性能. (2) 研究这两种边缘提取方法在不同参数下的边缘提取能力. (3) 使用不同的滤波尺度和添加噪声能量(噪声水平),通过与无噪声图像对比,选择最能说明自己结论的滤波尺度和噪声水平,并做出分析说明. 二. 实验原理 边缘的含义:在数字图像中,边缘是指图像局部变化最显著的部分,边缘主要存在于目标与目标,目标与背景之间,是图像局部特性的不连续性,如灰度的突变.纹理结构的突变.颜色的突变等.尽管图像的边缘点产生的原因

一道很不错的字符分割题

刚在stackoverflow看到一道很不错的问题,遂拿来分享之. 题目要求:我有一个很长的字符串: String s1="This is my world. This has to be broken." 我要把上面的字符串打乱以固定的长度(例如10)使得输出为: This is my world. Thi s has to b e broken. 但是我想让输出包含原来的字符的同时不不分开一个词使得输出如下: This is my world. This has to be bro

一个很不错的bash脚本编写教程

转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Linux中有好多中不同的shell,但是通常我们使用bash (bourne again shell) 进行shell编程,因为bash是免费的并且很容易使用.所以在本文中笔者所提供的脚本都是使用bash(但是在大多数情况下,这些脚本同样可以在 bash的大姐,bourne shell中运行). 如同其

FCM算法的matlab程序(初步)

FCM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648430.html文章中已经介绍了FCM算法,现在用matlab程序实现它. 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1.采用iris数据库 iris_data.txt 5.1 3.5 1.4 0.2 4.9 3 1.4 0.2 4.7 3.2 1.3 0.2 4.6 3.1 1.5 0.2 5 3.6 1.4 0.2 5.4 3.