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

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

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

    SQL注入原理讲解,很不错! 原文地址:http://www.cnblogs.com/rush/archive/2011/12/31/2309203.html 1.1.1 摘要 日前,国内最大的程序员 ...

  2. 很幽默的讲解六种Socket IO模型

    很幽默的讲解六种Socket IO模型 本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型二:WSAAsyncSelect ...

  3. 很幽默的讲解六种Socket IO模型 Delphi版本(自己Select查看,WM_SOCKET消息通知,WSAEventSelect自动收取,Overlapped I/O 事件通知模型,Overlapped I/O 完成例程模型,IOCP模型机器人)

    很幽默的讲解六种Socket IO模型(转)本文简单介绍了当前Windows支持的各种Socket I/O模型,如果你发现其中存在什么错误请务必赐教. 一:select模型 二:WSAAsyncSel ...

  4. mean shift聚类算法的MATLAB程序

    mean shift聚类算法的MATLAB程序 凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. mean shift 简介 mean shift, 写的 ...

  5. 【matlab】MATLAB程序调试方法和过程

    3.8  MATLAB程序的调试和优化 在MATLAB的程序调试过程中,不仅要求程序能够满足设计者的设计需求,而且还要求程序调试能够优化程序的性能,这样使得程序调试有时比程序设计更为复杂.MATLAB ...

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

    转自 http://blog.chinaunix.net/uid-20328094-id-95121.html 一个很不错的bash脚本编写教程,至少没接触过BASH的也能看懂! 建立一个脚本 Lin ...

  7. 不断摸索发现用 andy 模拟器很不错,感觉跟真机差不多

    嗯,今天也遇到了模拟的问题.那个慢啊,好几分钟才能开机,加载程序总共差不多十几分钟.当时想如果真做android开发必须换电脑啊.后来不断摸索发现用 andy 模拟器很不错,感觉跟真机差不多. 还是真 ...

  8. GMM算法的matlab程序

    GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...

  9. GMM算法的matlab程序(初步)

    GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...

随机推荐

  1. 合并2个数组为1个无重复元素的有序数组--Go对比Python

    Go实现: 1 package main 2 3 import ( 4 "fmt" 5 "sort" 6 ) 7 8 func main() { 9 var a ...

  2. Centos7安装Nginx详细步骤

    前言 Nginx 是一款轻量级的Web 服务器 .反向代理服务器及电子邮件(IMAP/POP3)代理服务器. 常用用途: ✓ 1. 反向代理 ✓ 2. 正向代理 这里我给来2张图,对正向代理与反响代理 ...

  3. 聊聊 ClassLoader 是如何查找资源的

    ClassLoader作用 classloader这个写业务代码的童鞋们,应该很少用到,但是写框架的应该很熟悉.这个类负责Java底层的类的加载和查找,简单滴说Java 的所有类都是由它负责将clas ...

  4. Matlab 条件循环函数

    条件判断 if 表达式 语句 elseif 表达式 语句 -. else 语句 end 这个与c语言不同的就是 1:要多一个end 2:还有没有括号 3:else if连在一起 for 循环 for ...

  5. Java蓝桥杯——贪心算法

    贪心算法 贪心算法:只顾眼前的苟且. 即在对问题求解时,总是做出在当前看来是最好的选择 如买苹果,专挑最大的买. 最优装载问题--加勒比海盗 货物重量:Wi={4,10,7,11,3,5,14,2} ...

  6. 一枚程序猿的MacBook M1详细体验报告

    前言 2020年11月11日双十一上午,苹果发布了M1芯片的新款Mac,其最大的变化就是将处理器从Intel换成了苹果自研的ARM芯片M1. 上一次苹果更换Mac芯片要追溯到2006年,14年前,苹果 ...

  7. Elements-of-Python_02_DataType

    (内容包括数据类型,运算符) 1.数据类型Data Types 1.1 简介Brief Introduction Python3中的数据类型,类型关键字,赋值,见下表: 1.1数字Number Pyt ...

  8. Java数据结构(十二)—— 霍夫曼树及霍夫曼编码

    霍夫曼树 基本介绍和创建 基本介绍 又称哈夫曼树,赫夫曼树 给定n个权值作为n个叶子节点,构造一棵二叉树,若该树的带权路径长度(wpl)达到最小,称为最优二叉树 霍夫曼树是带权路径长度最短的树,权值较 ...

  9. Django的静态文件的配置

    静态文件配置 STATIC_URL = '/static/' # 静态文件配置 STATICFILES_DIRS = [ os.path.join(BASE_DIR,'static') ] # 暴露给 ...

  10. JZOJ2020年10月5日提高B组反思

    2020年10月5日提高B组反思 T1 考试的时候想简单了 觉得把跟没有攻占的点相连的边留下就可以了 没有考虑到最小 WA&RE 10 T2 没有思路 就直接从中间往后枚举分解处 蜜汁错误 W ...