決策樹節點實現 matlab

2021-10-01 22:49:27 字數 2627 閱讀 7953

%另乙個檔案中測試** p = node([1;2], [1,2,3;2,1,4;2,3,1;3,2,1;2,3,4;4,2,1;3,2,1], 0.6)

classdef node

properties

%該節點的y標記

y%該節點所選擇的特徵x在d中的下標

x%該節點的特徵集合,其元素為該特徵在資料集中的下標

xs%該節點的資料集nxm,m=(x特徵數量+1列y值)

d%1表示葉節點,0表示非葉

flag

%sigma為該節點資訊增益或者資訊增益比的閾值,當該節點d中所有x特徵的資訊增益(比)

%都比該閾值小,則該節點仍為葉節點

sigma

endmethods

function obj = node(xs,d,sigma)

obj.xs = xs;

obj.d = d;

obj.sigma = sigma;

%獲取資料集中的y列

dy = d(:, size(d, 2));

%計算xs中所有特徵的資訊增益,xs為特徵在d矩陣中的下標

%計算hd

hd = node.hd(dy);

%計算hd|a

hd_a = zeros(size(xs, 1), 1);

for i=1:1:size(xs, 1)

hd_a(i, 1) = node.hd_a(d, xs(i, 1));

end%作差得到資訊增益

gd_a = -1 * hd_a + hd;

%c4.5演算法獲取資訊增益比利用had可以獲取d關於每個特徵的經驗熵

%node.had(d, 1);  在資料集合中 下標為1的特徵x d關於x的經驗熵

%獲取最大資訊增益,及其對應特徵的下標

[gmax, gpos] = max(gd_a);

%獲取資料集中頻率最高的y值

uy = unique(dy);

[ymaxtimes, ypos] = max(hist(dy, size(uy, 1)));

ymax = uy(1, ypos);

if((dy / dy(1,1)) == ones(size(d, 1), 1))

%y的值都相同,即屬於同一類,則為葉節點

obj.flag = 1;

obj.y = dy(1, 1);

elseif(isempty(xs))

%可選的特徵為空,則不得不為葉節點

obj.flag = 1;

obj.y = ymax;

elseif(gmax < sigma)

%當最大特徵的資訊增益小於閾值,則為葉節點

obj.flag = 1;

obj.y = ymax

else

%記錄該節點所選的特徵

%獲取特徵下標,xs的排列與gd_a的排列是相同的

x = xs(gpos, 1);

%將x特徵從xs中除去

xs(gpos, :) = ;

obj.flag = 0;

endend

function f = isleaf(obj)

f = obj.flag;

endfunction xs = getxsleft(obj)

xs = obj.xs;

endfunction sety(obj, y)

obj.y = y;

endend

methods(static)

%計算資料集d的經驗熵

function hd = hd(y)

%獲取不同值出現頻率/總數,依賴於hist以及unique函式按數公升序展示頻率

py = hist(y, size(unique(y), 1)) / size(y, 1);

%通過行列乘法求熵

hd = -1 * py * transpose(log2(py));

end%計算特徵a給定的條件下d的經驗條件熵

function hd_a = hd_a(d, xindice)

%提取所需考量的第xindice個特徵值在資料d中的值

x = d(:, xindice);

%公升序x的所有取值

xvalue = unique(x);

%由於經驗條件熵為 特徵值出現概率*特徵值出現時的經驗熵 的累加,hdi用於儲存

%該特徵值去 unique[i]個值的經驗熵

hdi = zeros(size(unique(x), 1), 1);

for i=1:1:size(xvalue, 1)

dyi = d(find(x(:, 1) == xvalue(i, 1)), size(d, 2));

hdi(i, 1) = node.hd(dyi);

end%計算特徵取不同值的概率,同樣公升序

pxi = hist(x, size(xvalue, 1)) / size(x, 1);

%實現累計加

hd_a =  pxi * hdi;

end%計算資料集d關於特徵a的熵 

function had = had(d, xindice)

had = node.hd(d(:, xindice));

endend

end

決策樹分類 matlab程式

使用id3決策樹演算法 銷量高低 clc clear 資料預處理 disp 正在進行資料預處理.matrix,attributes label,attributes id3 preprocess 構造id3決策樹,其中id3 為自定義函式 disp 資料預處理完成,正在進行構造樹.tree id3 ...

matlab中的決策樹

1.函式 view t 畫出決策樹 prune 剪枝決策樹 t2 prune t,level level node level 0 不剪枝 1 剪掉最後一層 2 最後兩層 node 剪掉第node個分支後的所有 eval yfit eval t,x yfit,nodes,cnum eval t,x ...

決策樹實現

from math import log import operator 計算資料集的熵 def calsshannonent dataset numentries len dataset labelcounts for featvec in dataset currentlabel featvec...