이 기사에서는 Java가 구현 한 의사 결정 트리 알고리즘에 대해 설명합니다. 다음과 같이 참조에 대해 공유하십시오.
의사 결정 트리 알고리즘은 개별 함수의 값을 근사화하는 메소드입니다. 이는 먼저 데이터를 처리하고 유도 알고리즘을 사용하여 읽은 규칙 및 의사 결정 트리를 생성 한 다음 새로운 데이터를 분석하기 위해 의사 결정을 사용하는 일반적인 분류 방법입니다. 본질적으로 의사 결정 트리는 일련의 규칙을 통해 데이터를 분류하는 과정입니다.
의사 결정 트리 구성은 두 단계로 수행 할 수 있습니다. 첫 번째 단계는 의사 결정 트리의 생성입니다 : 훈련 샘플 세트에서 의사 결정 트리를 생성하는 과정. 일반적으로 교육 샘플 데이터 세트는 실제 요구에 따라 이력과 어느 정도의 포괄적 인 데이터 세트이며 데이터 분석 및 처리에 사용됩니다. 두 번째 단계는 의사 결정 트리의 가지 치기입니다. 의사 결정 트리의 가지 치기는 이전 단계에서 생성 된 의사 결정 트리를 확인, 수정 및 수정하는 과정입니다. 주로 새로운 샘플 데이터 세트 (테스트 데이터 세트라고 함)의 데이터를 사용하여 의사 결정 트리의 생성 프로세스 중에 생성 된 예비 규칙을 확인하고 균형의 정확도에 영향을 미치는 분기를 가지 치기.
Java 구현 코드는 다음과 같습니다.
패키지 데모; import java.util.hashmap; import java.util.linkedlist; import java.util.list; import java.util.map; import java.util.map.entry; import java.util.set; public dicisiontree {public static void (string). 결과:"); 문자열 [] attrnames = new String [] { "age", "soine", "student", "credit_rating"}; // 샘플 세트 맵을 읽습니다. <개체, 목록 <샘플 >> 샘플 = readSamples (attrnames); // 의사 결정 트리 객체를 생성합니다. 결정 트리 = GeneratedEcisionTree (샘플, attrnames); // 의사 결정 트리 출력 출력 decisiontree (dectionTree, 0, null); } / *** 분류 된 샘플 세트를 읽고 맵을 반환합니다. 분류-> 카테고리에 속하는 샘플 목록* / static map <객체, 목록 <샘플 >> readsamples (string [] attrnames) {// 샘플 속성 및 해당 분류 (샘플이 속한 분류의 마지막 요소 [] rawdata = 새로운 대상 [], ",", ",", ", "아니오", "공정", "0"}, { "<30", "high", "no", "velitation", "0"}, { "30-40", "High", "No", "Fair", "1"}, { "> 40", "medium", "no", "fair", "1"}, { "", "", "", "", "," "," ",", "", " "> 40", "낮은", "예", "우수", "0"}, { "30-40", "낮은", "예", "예", "우수", "1"}, { "<30", "medium", "no", "fair", "0"}, { "<30", "low", ""fair ","fair "," "40" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "", "" "," "", ""} ","1 "}, {"<30 ","medium ","yes ","thuet ","1 "}, {"30-40 ","medium ","no ","탁월 ","1 "}, {"30-40 ","높은 ","예 ","fair ","1 "}, {"> 40 "," "," "," "," "," ",", "}; // 샘플 속성과 해당 분류를 읽고, 샘플을 나타내는 샘플 객체를 구성하고, 분류 맵 <객체, list <sample >> ret = new Hashmap <객체, 목록 <sample >> ()로 나누십시오. for (object [] row : rawData) {샘플 샘플 = 새로운 샘플 (); int i = 0; for (int n = row.length -1; i <n; i ++) sample.setattribute (attrnames [i], row [i]); sample.setCategory (행 [i]); List <표본> 샘플 = ret.get (row [i]); if (samples == null) {샘플 = new LinkedList <sample> (); ret.put (행 [i], 샘플); } samples.add (샘플); } return ret; } / *** 의사 결정 트리 구성* / static 객체 GeneratedEcisionTree (map <객체, list <sample >> string [] attrnames) {// 샘플이 하나만 있으면 샘플이 새로운 샘플의 분류로 속하는 분류를 사용합니다. // 의사 결정에 대한 속성이없는 경우 샘플 세트에서 가장 많은 샘플이있는 분류는 새 샘플의 분류로 사용됩니다. 즉, 분류에 투표합니다. 객체 maxCategory = null; for (Entry <Object, list <sample >> entry : categoryTosamples .entryset ()) {int cur = entry.getValue (). size (); if (cur> max) {max = cur; maxCategory = entry.getKey (); }} return maxCategory; } // 테스트 속성 객체를 선택하십시오. // 의사 결정 트리의 루트 노드, 분기 속성은 선택한 테스트 속성 트리 트리 = 새 트리 (attrnames [(Integer) rst [0]]); // 사용 된 테스트 속성은 테스트 속성으로 다시 선택해서는 안됩니다. string [] suba = new String [attrnames.length -1]; for (int i = 0, j = 0; i <attrnames.length; i ++) if (i! = (integer) rst [0]) suba [j ++] = attrnames [i]; // 분기 속성을 기반으로 분기를 생성 @SuppressWarnings ( "Checked") Map <객체, Map <개체, 목록 <sample >>> splits =/ * new line */(map <객체, map <객체, 목록 <sample >>>) rst [2]; for (Entry <Object, Map <Object, list <sample >>> entry : splits.entryset ()) {object attrvalue = actory.getKey (); map <객체, 목록 <sample >> split = entry.getValue (); Object Child = GeneratedEcisionTree (split, suba); Tree.Setchild (attrvalue, child); } 리턴 트리; } /*** 최적의 테스트 속성을 선택합니다. 최적의 테스트 속성 분기가 선택된 테스트 속성 분기를 기반으로하는 경우, 새 샘플*의 분류에 필요한 정보의 합은 각 분기에서 결정되며, 이는 새 샘플의 테스트 속성을 결정하여 얻은 최대 정보 이득과 동일합니다. chelessBestTestAttribute (map <object, list <sample >> categoryTosamples, String [] attrnames) {int minindex = -1; // 최적의 속성 첨자 이중 minValue = double.max_value; // 최소 정보 맵 <객체,지도 <객체, 목록 <sample >>> minsplits = null; // 최적의 분기 체계 // 각 속성에 대해 각 속성에 대해 테스트 속성으로 사용될 때 각 분기에서 새 샘플의 분류를 결정하는 데 필요한 정보의 합계를 계산하고 (int attrindex = 0; attrindex <attrnames.length; attrindex ++) {int allcount = 0; // 총 샘플 수 계산에 대한 카운터 // 현재 속성에 따라 맵을 작성하십시오. 속성 값-> (Classification-> 샘플 목록) 맵 <객체, 맵 <개체, 목록 <sample >>> cursplits =/ * new line */new Hashmap <객체, 객체, 목록 <sample >>> (); for (Entry <Object, list <sample >> entry : categoryToSamples .entryset ()) {개체 범주 = entry.getKey (); List <Sample> 샘플 = Entry.GetValue (); for (샘플 샘플 : 샘플) {object attvalue = 샘플 .getAttribute (attrnames [attrindex]); map <객체, list <sample >> split = cursplits.get (attrvalue); if (split == null) {split = new Hashmap <객체, list <sample >> (); cursplits.put (attrvalue, split); } list <mail> splitsamples = split.get (카테고리); if (splitsamples == null) {splitsamples = new LinkedList <sample> (); split.put (카테고리, 스플릿 샘플); } splitsamples.add (샘플); } allcount += samples.size (); } // 현재 속성을 테스트 속성으로 사용할 때 각 분기에서 새 샘플의 분류를 결정하는 데 필요한 정보의 합계를 계산합니다. // 카운터 : (Map <Object, List <Sample >> splits : cursplits.values ()) {double persplitcount = 0; for (list <mail> list : splits.values ()) persplitcount += list.size (); // 누적 전류 지점 샘플 이중 persplitValue = 0.0; // 카운터 : (목록 <샘플> 목록 : splits.values ()) {double p = list.size () / persplitcount; persplitValue- = p * (math.log (p) / math.log (2)); } curvalue += (persplitCount / AllCount) * persplitValue; } // 최적 IF (minValue> curvalue) {minindex = attrindex; minValue = 곡선; minsplits = cursplits; }} 새 개체를 반환합니다 [] {minindex, minvalue, minsplits}; } / *** 의사 결정 트리를 표준 출력으로 출력* / 정적 무효 출력 outputDecisionTree (객체 obj, int level, object from) {for (int i = 0; i <level; i ++) system.out.print ( "| ------"); if (from! = null) system.out.printf ( "(%s) :", from); if (obj instanceof tree) {트리 트리 = (트리) obj; 문자열 attrname = tree.getAttribute (); System.out.printf ( "[%s =?]/n", attrname); for (Object AttValue : tree.getAttributeValues ()) {Object Child = tree.getChild (attrvalue); OutputDecisionTree (자식, 레벨 + 1, attrname + "=" + attrvalue); }} else {system.out.printf ( "[[category = %s]/n", obj); }} / *** 샘플은 여러 속성과 샘플이 속한 분류를 지정하는 분류 값을 포함합니다.* / static 클래스 샘플 {private map <string, object> attributes = new Hashmap <String, Object> (); 개인 객체 범주; public object getAttribute (문자열 이름) {return attributes.get (이름); } public void stattribute (문자열 이름, 개체 값) {attributes.put (이름, 값); } public Object getCategory () {return 카테고리; } public void setCategory (객체 범주) {this.category = 범주; } public String toString () {return attributes.toString (); }} /*** 의사 결정 트리 (비 잎 노드), 의사 결정 트리의 각 비 잎 노드는 의사 결정 트리를 이끌어냅니다.* 각 비 잎 노드에는 분기 속성과 여러 분기가 포함됩니다. 분기 속성의 각 값은 분기에 해당합니다. 분기는 하위 결정 트리*/ 정적 클래스 트리 {private String 속성; 개인지도 <개체, 개체> children = new Hashmap <객체, 개체> (); public tree (문자열 속성) {this.attribute = 속성; } public String getAttribute () {return attribute; } public Object getChild (Object AttValue) {return children.get (attrvalue); } public void setchild (Object Attvalue, Object Child) {children.put (attrvalue, child); } public set <bood> getAttributeValues () {retud children.keyset (); }}}실행 결과 :
Java 알고리즘에 대한 자세한 내용은이 사이트에 관심이있는 독자들이 주제를 볼 수 있습니다. "Java 데이터 구조 및 알고리즘 자습서", "Java Operation Dom Node Tips 요약", "Java 파일 및 디렉토리 작동 팁 요약"및 "Java Cache Operation Tips의 요약"을 볼 수 있습니다.
이 기사가 모든 사람의 Java 프로그래밍에 도움이되기를 바랍니다.