简单易学的机器学习算法——决策树之ID3算法

简单易学的机器学习算法——决策树之ID3算法

一、决策树分类算法概述      决策树算法是从数据的属性(或者特征)出发,以属性作为基础,划分不同的类。例如对于如下数据集

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (数据集)   其中,第一列和第二列为属性(特征),最后一列为类别标签,1表示是,0表示否。决策树算法的思想是基于属性对数据分类,对于以上的数据我们可以得到以下的决策树模型

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (决策树模型)   先是根据第一个属性将一部份数据区分开,再根据第二个属性将剩余的区分开。       实现决策树的算法有很多种,有ID3、C4.5和CART等算法。下面我们介绍ID3算法。

二、ID3算法的概述      ID3算法是由Quinlan首先提出的,该算法是以信息论为基础,以信息熵和信息增益为衡量标准,从而实现对数据的归纳分类。       首先,ID3算法需要解决的问题是如何选择特征作为划分数据集的标准。在ID3算法中,选择信息增益最大的属性作为当前的特征对数据集分类。信息增益的概念将在下面介绍,通过不断的选择特征对数据集不断划分;       其次,ID3算法需要解决的问题是如何判断划分的结束。分为两种情况,第一种为划分出来的类属于同一个类,如上图中的最左端的“非鱼类”,即为数据集中的第5行和第6行数据;最右边的“鱼类”,即为数据集中的第2行和第3行数据。第二种为已经没有属性可供再分了。此时就结束了。       通过迭代的方式,我们就可以得到这样的决策树模型。

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (ID3算法基本流程)

三、划分数据的依据      ID3算法是以信息熵和信息增益作为衡量标准的分类算法。

1、信息熵(Entropy)     熵的概念主要是指信息的混乱程度,变量的不确定性越大,熵的值也就越大,熵的公式可以表示为:

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   其中,

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

为类别

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

在样本

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

中出现的概率。

2、信息增益(Information gain)     信息增益指的是划分前后熵的变化,可以用下面的公式表示:

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   其中,

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

表示样本的属性,

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

是属性

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

所有的取值集合。

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

的其中一个属性值,

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

的值为

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法

的样例集合。

四、实验仿真

1、数据预处理      我们以下面的数据为例,来实现ID3算法:

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   摘自 http://blog.sina.com.cn/s/blog_6e85bf420100ohma.html   我们首先需要对数据处理,例如age属性,我们用0表示youth,1表示middle_aged,2表示senior等等。

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (将表格数据化)

2、实验结果

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (原始的数据 )

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (划分1)

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (划分2)

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (划分3)

www.zeeklog.com  - 简单易学的机器学习算法——决策树之ID3算法


   (最终的决策树)   MATLAB代码   主程序

%% Decision Tree
% ID3

%导入数据
%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);


生成决策树

function [ output_args ] = createTree( data )
    [m,n] = size(data);
    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


选择信息增益最大的特征

%% 选择信息增益最大的特征
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));
        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);
        end
        
        %计算增益
        infoGain = baseEntropy - newEntropy;
        
        if infoGain > bestInfoGain
            bestInfoGain = infoGain;
            bestFeature = j;
        end
    end
end


计算熵

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;
    subSet(:,axis) = [];
    k = 0;
    for i = 1:m
        if data(i,axis) ~= value
            subSet(i-k,:) = [];
            k = k+1;
        end
    end   
end



Read more

深入理解 Proxy 和 Object.defineProperty

在JavaScript中,对象是一种核心的数据结构,而对对象的操作也是开发中经常遇到的任务。在这个过程中,我们经常会使用到两个重要的特性:Proxy和Object.defineProperty。这两者都允许我们在对象上进行拦截和自定义操作,但它们在实现方式、应用场景和灵活性等方面存在一些显著的区别。本文将深入比较Proxy和Object.defineProperty,包括它们的基本概念、使用示例以及适用场景,以帮助读者更好地理解和运用这两个特性。 1. Object.defineProperty 1.1 基本概念 Object.defineProperty 是 ECMAScript 5 引入的一个方法,用于直接在对象上定义新属性或修改已有属性。它的基本语法如下: javascript 代码解读复制代码Object.defineProperty(obj, prop, descriptor); 其中,obj是目标对象,prop是要定义或修改的属性名,descriptor是一个描述符对象,用于定义属性的特性。 1.2 使用示例 javascript 代码解读复制代码//

By Ne0inhk

Proxy 和 Object.defineProperty 的区别

Proxy 和 Object.defineProperty 是 JavaScript 中两个不同的特性,它们的作用也不完全相同。 Object.defineProperty 允许你在一个对象上定义一个新属性或者修改一个已有属性。通过这个方法你可以精确地定义属性的特征,比如它是否可写、可枚举、可配置等。该方法的使用场景通常是需要在一个对象上创建一个属性,然后控制这个属性的行为。 Proxy 也可以用来代理一个对象,但是相比于 Object.defineProperty,它提供了更加强大的功能。使用 Proxy 可以截获并重定义对象的基本操作,比如访问属性、赋值、函数调用等等。在这些操作被执行之前,可以通过拦截器函数对这些操作进行拦截和修改。因此,通过 Proxy,你可以完全重写一个对象的默认行为。该方法的使用场景通常是需要对一个对象的行为进行定制化,或者需要在对象上添加额外的功能。 对比 以下是 Proxy 和 Object.defineProperty 的一些区别对比: 方面ProxyObject.defineProperty语法使用 new Proxy(target,

By Ne0inhk