1. 程式人生 > >決策樹ID3演算法-matlab實現

決策樹ID3演算法-matlab實現

ID3_decision_tree.m

%% 使用ID3決策樹演算法預測銷量高低
clear ;

%% 資料預處理
disp('正在進行資料預處理...');
[matrix,attributes_label,attributes] =  id3_preprocess();

%% 構造ID3決策樹,其中id3()為自定義函式
disp('資料預處理完成,正在進行構造樹...');
tree = id3(matrix,attributes_label,attributes);

%% 列印並畫決策樹
[nodeids,nodevalues] = print_tree(tree);
tree_plot(nodeids,nodevalues);

disp('ID3演算法構建決策樹完成!'
);

id3_preprocess.m

function [ matrix,attributes,activeAttributes ] = id3_preprocess(  )
%% ID3演算法資料預處理,把字串轉換為0,1編碼

% 輸出引數:
% matrix: 轉換後的0,1矩陣;
% attributes: 屬性和Label;
% activeAttributes : 屬性向量,全1;

%% 讀取資料
txt = {  '序號'    '天氣'    '是否週末'    '是否有促銷'    '銷量'
        ''        '壞'      '是'          '是'
'高' '' '壞' '是' '是' '高' '' '壞' '是' '是' '高' '' '壞' '否' '是' '高' '' '壞' '是' '是' '高' '' '壞' '否' '是'
'高' '' '壞' '是' '否' '高' '' '好' '是' '是' '高' '' '好' '是' '否' '高' '' '好' '是' '是' '高' '' '好' '是' '是' '高' '' '好' '是' '是' '高' '' '好' '是' '是' '高' '' '壞' '是' '是' '低' '' '好' '否' '是' '高' '' '好' '否' '是' '高' '' '好' '否' '是' '高' '' '好' '否' '是' '高' '' '好' '否' '否' '高' '' '壞' '否' '否' '低' '' '壞' '否' '是' '低' '' '壞' '否' '是' '低' '' '壞' '否' '是' '低' '' '壞' '否' '否' '低' '' '壞' '是' '否' '低' '' '好' '否' '是' '低' '' '好' '否' '是' '低' '' '壞' '否' '否' '低' '' '壞' '否' '否' '低' '' '好' '否' '否' '低' '' '壞' '是' '否' '低' '' '好' '否' '是' '低' '' '好' '否' '否' '低' '' '好' '否' '否' '低' }
attributes=txt(1,2:end); activeAttributes = ones(1,length(attributes)-1); data = txt(2:end,2:end); %% 針對每列資料進行轉換 [rows,cols] = size(data); matrix = zeros(rows,cols); for j=1:cols matrix(:,j) = cellfun(@trans2onezero,data(:,j)); end end function flag = trans2onezero(data) if strcmp(data,'壞') ||strcmp(data,'否')... ||strcmp(data,'低') flag =0; return ; end flag =1; end

id3.m

function [ tree ] = id3( examples, attributes, activeAttributes )
%% ID3 演算法 ,構建ID3決策樹
    ...參考:https://github.com/gwheaton/ID3-Decision-Tree

% 輸入引數:
% example: 輸入01矩陣;
% attributes: 屬性值,含有Label;
% activeAttributes: 活躍的屬性值;-1,1向量,1表示活躍;

% 輸出引數:
% tree:構建的決策樹;

%% 提供的資料為空,則報異常
if (isempty(examples));
    error('必須提供資料!');
end

% 常量
numberAttributes = length(activeAttributes);
numberExamples = length(examples(:,1));

% 建立樹節點
tree = struct('value', 'null', 'left', 'null', 'right', 'null');

% 如果最後一列全部為1,則返回“true”
lastColumnSum = sum(examples(:, numberAttributes + 1));

if (lastColumnSum == numberExamples);
    tree.value = 'true';
    return
end
% 如果最後一列全部為0,則返回“falseif (lastColumnSum == 0);
    tree.value = 'false';
    return
end

% 如果活躍的屬性為空,則返回label最多的屬性值
if (sum(activeAttributes) == 0);
    if (lastColumnSum >= numberExamples / 2);
        tree.value = 'true';
    else
        tree.value = 'false';
    end
    return
end

%% 計算當前屬性的熵
p1 = lastColumnSum / numberExamples;
if (p1 == 0);
    p1_eq = 0;
else
    p1_eq = -1*p1*log2(p1);
end
p0 = (numberExamples - lastColumnSum) / numberExamples;
if (p0 == 0);
    p0_eq = 0;
else
    p0_eq = -1*p0*log2(p0);
end
currentEntropy = p1_eq + p0_eq;

%% 尋找最大增益
gains = -1*ones(1,numberAttributes); % 初始化增益

for i=1:numberAttributes;
    if (activeAttributes(i)) % 該屬性仍處於活躍狀態,對其更新
        s0 = 0; s0_and_true = 0;
        s1 = 0; s1_and_true = 0;
        for j=1:numberExamples;
            if (examples(j,i)); 
                s1 = s1 + 1;
                if (examples(j, numberAttributes + 1)); 
                    s1_and_true = s1_and_true + 1;
                end
            else
                s0 = s0 + 1;
                if (examples(j, numberAttributes + 1)); 
                    s0_and_true = s0_and_true + 1;
                end
            end
        end

        % 熵 S(v=1)
        if (~s1);
            p1 = 0;
        else
            p1 = (s1_and_true / s1); 
        end
        if (p1 == 0);
            p1_eq = 0;
        else
            p1_eq = -1*(p1)*log2(p1);
        end
        if (~s1);
            p0 = 0;
        else
            p0 = ((s1 - s1_and_true) / s1);
        end
        if (p0 == 0);
            p0_eq = 0;
        else
            p0_eq = -1*(p0)*log2(p0);
        end
        entropy_s1 = p1_eq + p0_eq;

        % 熵 S(v=0)
        if (~s0);
            p1 = 0;
        else
            p1 = (s0_and_true / s0); 
        end
        if (p1 == 0);
            p1_eq = 0;
        else
            p1_eq = -1*(p1)*log2(p1);
        end
        if (~s0);
            p0 = 0;
        else
            p0 = ((s0 - s0_and_true) / s0);
        end
        if (p0 == 0);
            p0_eq = 0;
        else
            p0_eq = -1*(p0)*log2(p0);
        end
        entropy_s0 = p1_eq + p0_eq;

        gains(i) = currentEntropy - ((s1/numberExamples)*entropy_s1) - ((s0/numberExamples)*entropy_s0);
    end
end

% 選出最大增益
[~, bestAttribute] = max(gains);
% 設定相應值
tree.value = attributes{bestAttribute};
% 去活躍狀態
activeAttributes(bestAttribute) = 0;

% 根據bestAttribute把資料進行分組
examples_0= examples(examples(:,bestAttribute)==0,:);
examples_1= examples(examples(:,bestAttribute)==1,:);

% 當 value = false or 0, 左分支
if (isempty(examples_0));
    leaf = struct('value', 'null', 'left', 'null', 'right', 'null');
    if (lastColumnSum >= numberExamples / 2); % for matrix examples
        leaf.value = 'true';
    else
        leaf.value = 'false';
    end
    tree.left = leaf;
else
    % 遞迴
    tree.left = id3(examples_0, attributes, activeAttributes);
end
% 當 value = true or 1, 右分支
if (isempty(examples_1));
    leaf = struct('value', 'null', 'left', 'null', 'right', 'null');
    if (lastColumnSum >= numberExamples / 2); 
        leaf.value = 'true';
    else
        leaf.value = 'false';
    end
    tree.right = leaf;
else
    % 遞迴
    tree.right = id3(examples_1, attributes, activeAttributes);
end

% 返回
return
end

相關推薦

決策ID3演算法-matlab實現

ID3_decision_tree.m %% 使用ID3決策樹演算法預測銷量高低 clear ; %% 資料預處理 disp('正在進行資料預處理...'); [matrix,attributes_label,attributes] = id3_pre

西瓜書決策ID3演算法實現,離散屬性

from math import log import operator import csv def readDataset(filename): ''' 讀取資料 :param filename: 資料檔名,CSV格式 :return: 以列表形式返回資料列

《機器學習實戰》決策(ID3演算法)的分析與實現

        決策樹是一個預測模型;他代表的是物件屬性與物件值之間的一種對映關係。樹中每個節點表示某個物件,而每個分叉路徑則代表的某個可能的屬性值,而每個葉結點則對應從根節點到該葉節點所經歷的路徑所表示的物件的值。決策樹僅有單一輸出,若欲有複數輸出,可以建立獨立的決策樹以處理不同輸出。 資料探勘中決策樹是一

寶具滑 / JS簡單實現決策(ID3演算法)

<script> // 文章: https://www.jianshu.com/p/2b50a98cd75c function DecisionTree(config) { if (typeof config == "object" &

機器學習決策ID3演算法,手把手教你用Python實現

本文始發於個人公眾號:**TechFlow**,原創不易,求個關注 今天是機器學習專題的第21篇文章,我們一起來看一個新的模型——決策樹。 決策樹的定義 決策樹是我本人非常喜歡的機器學習模型,非常直觀容易理解,並且和資料結構的結合很緊密。我們學習的門檻也很低,相比於那些動輒一堆公式的模型來說,實在是簡單

決策ID3演算法和C4.5演算法實戰

老師給的題目: 程式碼實現【兩種演算法合在一個檔案裡】:  from numpy import * def createDataSet(): dataSet = [[1, 1, 1, 0, 'no'], [1, 1, 1, 1, '

利用決策 ID3 演算法進行預測

決策樹:決策樹方法在分類、預測、規則提取等領域被廣泛應用決策樹是樹狀結構,它的每一個節點對應著一個分類,非葉節點對應著在某個屬性上的劃分,根據樣本在該屬性上的不同取值將其劃分城若干個子集。構造決策樹的核心問題是在每一步如何選擇適當的屬性對樣本做拆分。對一個分類問題,從一直分類

學習資料探勘決策ID3演算法

一個月前的C語言程式設計課上學習了決策樹ID3演算法 然後自己用了兩個多星期的時間開始用C語言實現,結果由於過程太過於複雜,寫出來的東西就跟屎一樣。 可能是自己對於這個演算法理解的不夠深刻,或者是在設計的時候沒有構思好。 所以決定在這裡寫一寫大概的構思然後再去用C實現。 這

決策ID3演算法

TypeError: 'dict_keys' object does not support indexing 9.TypeError: ‘dict_keys’ object does not support indexing 這個問題是python版本的問題

決策——ID3演算法

先上程式碼,理論有空補上,採用python 3.X編寫,沒有剪枝部分 import math import operator # 計算資料集的資訊熵 def calcEntropy(data): # label = [] numClass = {}

離散型與連續型資料決策構建及列印實現 R語言,ID3,C4.5演算法

本人的第一篇文章,趁著我們的資料探勘課設的時間,把實現的決策樹程式碼,拿出來分享下。有很多漏洞和缺陷,還有很多駭客思想的成分,但是總之,能實現,看網上的程式碼,能用的其實也沒幾個。廢話不多說,直接看程式碼 特別鳴謝博主skyonefly的程式碼 附上鍊接:R

資料探勘-決策ID3分類演算法的C++實現

資料探勘課上面老師介紹了下決策樹ID3演算法,我抽空餘時間把這個演算法用C++實現了一遍。決策樹演算法是非常常用的分類演算法,是逼近離散目標函式的方法,學習得到的函式以決策樹的形式表示。其基本思路是不斷選取產生資訊增益最大的屬性來劃分樣例集和,構造決策樹。資訊增益定義為結點與

javascript實現樸素貝葉斯分類與決策ID3分類

.com 訓練集 this ice map ive sum length roc 今年畢業時的畢設是有關大數據及機器學習的題目。因為那個時間已經步入前端的行業自然選擇使用JavaScript來實現其中具體的算法。雖然JavaScript不是做大數據處理的最佳語言,相比還沒有

機器學習總結(八)決策ID3,C4.5演算法,CART演算法

本文主要總結決策樹中的ID3,C4.5和CART演算法,各種演算法的特點,並對比了各種演算法的不同點。 決策樹:是一種基本的分類和迴歸方法。在分類問題中,是基於特徵對例項進行分類。既可以認為是if-then規則的集合,也可以認為是定義在特徵空間和類空間上的條件概率分佈。 決策樹模型:決策樹由結點和有向邊組

決策(ID3,C4.5,CART)原理以及實現

決策樹 決策樹是一種基本的分類和迴歸方法.決策樹顧名思義,模型可以表示為樹型結構,可以認為是if-then的集合,也可以認為是定義在特徵空間與類空間上的條件概率分佈. [圖片上傳失敗...(image-2e6565-1543139272117)] 決策樹的中間節點可以看做是對一種特徵的判斷,也是符合上一

決策三大演算法之一ID3

一、決策樹 決策樹是一種樹形結構,每一個內部節點表示在某一屬性上的測試,每一條分支代表一個測試輸出,每一個葉子節點代表一種類別。 決策樹採用的是自頂向下的遞迴方法,其基本思想是以資訊熵為度量建立一個資訊熵下降最快的樹。到葉子節點處的熵值為0,每一個葉子節點中的例

機器學習演算法(二)——決策分類演算法及R語言實現方法

決策樹演算法是分類演算法中最常用的演算法之一。決策樹是一種類似流程圖的樹形結構,可以處理高維資料,直觀易理解,且準確率較高,因此應用廣泛。本篇小博就決策樹的若干演算法:ID3演算法、C4.5演算法以及分類迴歸樹(CART)、C5.0進行對比介紹,並對比C4.5與C5.0處理

決策ID3;C4.5詳解和python實現與R語言實現比較

本文網址:http://blog.csdn.net/crystal_tyan/article/details/42130851(請不要在採集站閱讀) 把決策樹研究一下,找來了一些自己覺得還可以的資料: 分類樹(決策樹)是一種十分常用的分類方法。他是一種監管學習,所謂監管

論文筆記1《基於ID3決策改進演算法的客戶流失預測分析》

《電腦科學》 2010年 部分摘要:指出了該演算法的取指偏向性以及運算效率不高等缺點,在此基礎上提出了改進的ID3演算法,該演算法通過引入先驗知識度引數,有效克服ID3演算法中的取值偏向性和運算效率

決策ID3、C4.5、CART演算法:資訊熵,區別,剪枝理論總結

決策樹演算法中的ID3、c4.5、CART演算法,記錄如下:     決策樹演算法:顧名思義,以二分類問題為例,即利用自變數構造一顆二叉樹,將目標變數區分出來,所有決策樹演算法的關鍵點如下:     1.分裂屬性的選擇。即選擇哪個自變數作為樹叉,也就是在n個自變數中,優先選