java實現ID3演算法

2021-08-27 13:07:37 字數 3864 閱讀 1631

id3是經典的分類演算法,要理解id3演算法,需要先了解一些基本的資訊理論概念,包括資訊量,熵,後驗熵,條件熵。id3演算法的核心思想是選擇互資訊量最大的屬性作為分割節點,這樣做可以保證所建立的決策樹高度最小。

樹結構**:

/**

* c4.5決策樹資料結構

* @author zhenhua.chen

* @description: todo

* @date 2013-3-1 上午10:47:37

* */

public class treenode

public string getnodename()

public void setnodename(string nodename)

public listgetsplitattributes()

public void setsplitattributes(listsplitattributes)

public arraylistgetchildrennodes()

public void setchildrennodes(arraylistchildrennodes)

public arraylist> getdataset()

public void setdataset(arraylist> dataset)

public arraylistgetarrributeset()

public void setarrributeset(arraylistarrributeset)

}

決策樹演算法:

/**

* 構造決策樹的類

* @author zhenhua.chen

* @description: todo

* @date 2013-3-1 下午4:42:07

* */

public class decisiontree

} arraylistsplitattributes = computeutil.gettypes(dataset, index); // 獲取該節點下的**屬性

node.setsplitattributes(splitattributes);

node.setnodename(attributeset.get(index));

// 判斷每個屬性列是否需要繼續**

for(int i = 0; i < splitattributes.size(); i++) else

}arraylist> newdataset = new arraylist>();

for(arraylistdata : splitdataset)

}newdataset.add(tmp);

}childnode = buildtree(newdataset, newattributeset); // 遞迴建樹

}node.getchildrennodes().add(childnode);

} return node; }

/*** 列印建好的樹

* @param root

*/public void printtree(treenode root)

} else

if(null != root.getchildrennodes())

} }

/***

* @title: searchtree

* @description: 層次遍歷樹

* @return void

* @throws

*/public void searchtree(treenode root)

} else

if(null != node.getchildrennodes())

}} }

}

一些util**:

/**

* c4.5演算法所需的各類計算方法

* @author zhenhua.chen

* @description: todo

* @date 2013-3-1 上午10:48:47

* */

public class computeutil

} return list; }

/*** 獲取指定資料集中指定屬性列的各個類別及其計數

* @title: getclasscounts

* @description: todo

* @return map* @throws

*/public static mapgettypecounts(arraylist> dataset, int columnindex) else

} return map; }

/*** 獲取指定列上指定類別的資料集合(**後的資料子集)

* @title: getdataset

* @description: todo

* @return arraylist>

* @throws

*/public static arraylist> getdataset(arraylist> dataset, int columnindex, string attribueclass)

} return splitdataset; }

/*** 計算指定列(屬性)的資訊熵

* @title: computeentropy

* @description: todo

* @return double

* @throws

*/public static double computeentropy(arraylist> dataset, int columnindex)

return entropy; }

/*** 計算基於指定屬性列對目標屬性的條件資訊熵

*/public static double computeconditinalentropy(arraylist> dataset, int columnindex)

double proby = (double)splitdataset.size() / (double)dataset.size();

mapmap1 = gettypecounts(splitdataset, descolumn); //根據分割後的子集計算後驗熵

iteratoriter1 = map1.keyset().iterator();

double proteriorentropy = 0;

while(iter1.hasnext())

conditionalentropy += proby * proteriorentropy; // 基於某個分割屬性計算條件熵

} return conditionalentropy;

}}

測試**:

public class test 

arraylist> dataset = new arraylist>();

while((str = reader.readline()) != null)

dataset.add(tmplist);

}decisiontree dt = new decisiontree();

treenode root = dt.buildtree(dataset, attributelist);

// dt.printtree(root);

dt.searchtree(root);

} catch (ioexception e)

} catch (filenotfoundexception e)

}}

ID3演算法Java實現

1.1 資訊熵 熵是無序性 或不確定性 的度量指標。假如事件a 的全概率劃分是 a1,a2,an 每部分發生的概率是 p1,p2,pn 那資訊熵定義為 通常以2 為底數,所以資訊熵的單位是 bit。1.2 決策樹 決策樹是以例項為基礎的歸納學習演算法。它從一組無次序 無規則的元組中推理出決策樹表示形...

ID3演算法的java實現

id3演算法是經典的決策樹學習生成演算法。id3演算法的核心是在決策樹各個節點上運用資訊增益準則選擇特徵,遞迴的構建決策樹。具體方法是 從根節點 root node 開始,對接點計算所有可能的特徵的資訊增益,選擇資訊增益最大的特徵作為節點的特徵,有該特徵的不同取值建立子節點 再對子節點遞迴的呼叫以上...

ID3演算法的Python實現

本篇文章的 是在 id3演算法的原理及實現 python 的基礎上進行新增和修改實現的,感謝原作者。1 新增的功能 1 拆分檔案,使得函式的呼叫更加清晰 2 增加了gui,增加了資料的讀取和 功能 3 增加了乙個遞迴終止條件 2 gui介面展示 以檔案中給出的資料集為例,填充如下 注 這裡類標籤的位...