[轉載]簡單易學的機器學習演算法-決策樹之ID3算的

來源:互聯網
上載者:User

標籤:class   blog   code   http   tar   ext   

一、決策樹分類演算法概述    決策樹演算法是從資料的屬性(或者特徵)出發,以屬性作為基礎,劃分不同的類。例如對於如下資料集(資料集)其中,第一列和第二列為屬性(特徵),最後一列為類別標籤,1表示是,0表示否。決策樹演算法的思想是基於屬性對資料分類,對於以上的資料我們可以得到以下的決策樹模型(決策樹模型)先是根據第一個屬性將一部份資料區分開,再根據第二個屬性將剩餘的區分開。    實現決策樹的演算法有很多種,有ID3、C4.5和CART等演算法。下面我們介紹ID3演算法。二、ID3演算法的概述    ID3演算法是由Quinlan首先提出的,該演算法是以資訊理論為基礎,以資訊熵和資訊增益為衡量標準,從而實現對資料的歸納分類。    首先,ID3演算法需要解決的問題是如何選擇特徵作為劃分資料集的標準。在ID3演算法中,選擇資訊增益最大的屬性作為當前的特徵對資料集分類。資訊增益的概念將在下面介紹,通過不斷的選擇特徵對資料集不斷劃分;    其次,ID3演算法需要解決的問題是如何判斷劃分的結束。分為兩種情況,第一種為劃分出來的類屬於同一個類,如中的最左端的“非魚類”,即為資料集中的第5行和第6行資料;最右邊的“魚類”,即為資料集中的第2行和第3行資料。第二種為已經沒有屬性可供再分了。此時就結束了。    通過迭代的方式,我們就可以得到這樣的決策樹模型。(ID3演算法基本流程)三、劃分資料的依據    ID3演算法是以資訊熵和資訊增益作為衡量標準的分類演算法。1、資訊熵(Entropy)   熵的概念主要是指資訊的混亂程度,變數的不確定性越大,熵的值也就越大,熵的公式可以表示為:其中,,為類別在樣本中出現的機率。2、資訊增益(Information gain)   資訊增益指的是劃分前後熵的變化,可以用下面的公式表示:其中,表示樣本的屬性,是屬性所有的取值集合。是的其中一個屬性值,是中的值為的範例集合。四、實驗模擬1、資料預先處理    我們以下面的資料為例,來實現ID3演算法:摘自 http://blog.sina.com.cn/s/blog_6e85bf420100ohma.html我們首先需要對資料處理,例如age屬性,我們用0表示youth,1表示middle_aged,2表示senior等等。(將表格式資料化)2、實驗結果(原始的資料)(劃分1)(劃分2)(劃分3)(最終的決策樹)MATLAB代碼主程式 [plain] view plaincopy 
  1. %% Decision Tree  
  2. % ID3  
  3.   
  4. %匯入資料  
  5. %data = [1,1,1;1,1,1;1,0,0;0,1,0;0,1,0];    
  6.   
  7. data = [0,2,0,0,0;  
  8.     0,2,0,1,0;  
  9.     1,2,0,0,1;  
  10.     2,1,0,0,1;  
  11.     2,0,1,0,1;  
  12.     2,0,1,1,0;  
  13.     1,0,1,1,1;  
  14.     0,1,0,0,0;  
  15.     0,0,1,0,1;  
  16.     2,1,1,0,1;  
  17.     0,1,1,1,1;  
  18.     1,1,0,1,1;  
  19.     1,2,1,0,1;  
  20.     2,1,0,1,0];  
  21.   
  22. % 產生決策樹  
  23. createTree(data);  

產生決策樹 [plain] view plaincopy 
  1. function [ output_args ] = createTree( data )  
  2.     [m,n] = size(data);  
  3.     disp(‘original data:‘);  
  4.     disp(data);  
  5.     classList = data(:,n);  
  6.     classOne = 1;%記錄第一個類的個數  
  7.     for i = 2:m  
  8.         if classList(i,:) == classList(1,:)  
  9.             classOne = classOne+1;  
  10.         end  
  11.     end  
  12.       
  13.     % 類別全相同  
  14.     if classOne == m  
  15.         disp(‘final data: ‘);  
  16.         disp(data);  
  17.         return;  
  18.     end  
  19.       
  20.     % 特徵全部用完  
  21.     if n == 1  
  22.         disp(‘final data: ‘);  
  23.         disp(data);  
  24.         return;  
  25.     end  
  26.       
  27.     bestFeat = chooseBestFeature(data);  
  28.     disp([‘bestFeat: ‘, num2str(bestFeat)]);  
  29.     featValues = unique(data(:,bestFeat));  
  30.     numOfFeatValue = length(featValues);  
  31.       
  32.     for i = 1:numOfFeatValue  
  33.         createTree(splitData(data, bestFeat, featValues(i,:)));  
  34.         disp(‘-------------------------‘);  
  35.     end  
  36. end  

選擇資訊增益最大的特徵 [plain] view plaincopy 
  1. %% 選擇資訊增益最大的特徵  
  2. function [ bestFeature ] = chooseBestFeature( data )  
  3.     [m,n] = size(data);% 得到資料集的大小  
  4.       
  5.     % 統計特徵的個數  
  6.     numOfFeatures = n-1;%最後一列是類別  
  7.     % 原始的熵  
  8.     baseEntropy = calEntropy(data);  
  9.       
  10.     bestInfoGain = 0;%初始化資訊增益  
  11.     bestFeature = 0;% 初始化最佳的特徵位  
  12.       
  13.     % 挑選最佳的特徵位  
  14.     for j = 1:numOfFeatures  
  15.         featureTemp = unique(data(:,j));  
  16.         numF = length(featureTemp);%屬性的個數  
  17.         newEntropy = 0;%劃分之後的熵  
  18.         for i = 1:numF  
  19.             subSet = splitData(data, j, featureTemp(i,:));  
  20.             [m_1, n_1] = size(subSet);  
  21.             prob = m_1./m;  
  22.             newEntropy = newEntropy + prob * calEntropy(subSet);  
  23.         end  
  24.           
  25.         %計算增益  
  26.         infoGain = baseEntropy - newEntropy;  
  27.           
  28.         if infoGain > bestInfoGain  
  29.             bestInfoGain = infoGain;  
  30.             bestFeature = j;  
  31.         end  
  32.     end  
  33. end  

計算熵 [plain] view plaincopy 
  1. function [ entropy ] = calEntropy( data )  
  2.     [m,n] = size(data);  
  3.       
  4.     % 得到類別的項  
  5.     label = data(:,n);  
  6.       
  7.     % 處理完的label  
  8.     label_deal = unique(label);  
  9.       
  10.     numLabel = length(label_deal);  
  11.     prob = zeros(numLabel,2);  
  12.       
  13.     % 統計標籤  
  14.     for i = 1:numLabel  
  15.         prob(i,1) = label_deal(i,:);  
  16.         for j = 1:m  
  17.             if label(j,:) == label_deal(i,:)  
  18.                 prob(i,2) = prob(i,2)+1;  
  19.             end  
  20.         end  
  21.     end  
  22.       
  23.     % 計算熵  
  24.     prob(:,2) = prob(:,2)./m;  
  25.     entropy = 0;  
  26.     for i = 1:numLabel  
  27.         entropy = entropy - prob(i,2) * log2(prob(i,2));  
  28.     end  
  29. end  

劃分資料 [plain] view plaincopy 
  1. function [ subSet ] = splitData( data, axis, value )  
  2.     [m,n] = size(data);%得到待劃分資料的大小  
  3.       
  4.     subSet = data;  
  5.     subSet(:,axis) = [];  
  6.     k = 0;  
  7.     for i = 1:m  
  8.         if data(i,axis) ~= value  
  9.             subSet(i-k,:) = [];  
  10.             k = k+1;  
  11.         end  
  12.     end     
  13. end  
原文連結是:http://blog.csdn.net/google19890102/article/details/28611225

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.