1、import java.util.HashMap;import java.util.HashSet;import java.util.LinkedHashSet;import java.util.Iterator;/调试过程中发现4个错误,感谢宇宙无敌的调试工具print/1、selectAtrribute中的一个数组下标出错 2、两个字符串相等的判断/3、输入的数据有一个错误 4、selectAtrribute中最后一个循环忘记了i+/决策树的树结点类class TreeNode String element;/该值为数据的属性名称String value;/上一个分裂属性在此结点的值Lin
2、kedHashSet childs;/结点的子结点,以有顺序的链式哈希集存储public TreeNode()this.element=null;this.value=null;this.childs=null;public TreeNode(String value)this.element=null;this.value=value;this.childs=null;public String getElement()return this.element;public void setElement(String e)this.element=e;public String getVal
3、ue()return this.value;public void setValue(String v)this.value=v;public LinkedHashSet getChilds()return this.childs;public void setChilds(LinkedHashSet childs)this.childs=childs;/决策树类class DecisionTree TreeNode root;/决策树的树根结点public DecisionTree()root=new TreeNode();public DecisionTree(TreeNode root)
4、this.root=root;public TreeNode getRoot()return root;public void setRoot(TreeNode root)this.root=root;public String selectAtrribute(TreeNode node,String deData,boolean flags,LinkedHashSet atrributes,HashMap attrIndexMap)/Gain数组存放当前结点未分类属性的Gain值double Gain=new doubleatrributes.size();/每条数据中归类的下标,为每条数据
5、的最后一个值int class_index=deData0.length-1;/属性名,该结点在该属性上进行分类String return_atrribute=null;/计算每个未分类属性的 Gain值int count=0;/计算到第几个属性for(String atrribute:atrributes)/该属性有多少个值,该属性有多少个分类int values_count,class_count;/属性值对应的下标int index=attrIndexMap.get(atrribute);/存放属性的各个值和分类值LinkedHashSet values=new LinkedHashSe
6、t();LinkedHashSet classes=new LinkedHashSet();for(int i=0;i deData.length;i+)if(flagsi=true)values.add(deDataiindex);classes.add(deDataiclass_index);values_count=values.size();class_count=classes.size();int values_vector=new intvalues_count*class_count;int class_vector=new intclass_count;for(int i=0
7、;i deData.length;i+)if(flagsi=true)int j=0;for(String v:values)if(deDataiindex.equals(v)break;else j+;int k=0;for(String c:classes)if(deDataiclass_index.equals(c)break;else k+;values_vectorj*class_count+k+;class_vectork+;/*/输出各项统计值for(int i=0;i values_count*class_count;i+)System.out.print(values_vec
8、tori+);System.out.println();for(int i=0;i class_count;i+)System.out.print(class_vectori+);System.out.println();*/计算InforDdouble InfoD=0.0;double class_total=0.0;for(int i=0;i class_vector.length;i+)class_total+=class_vectori;for(int i=0;i class_vector.length;i+)if(class_vectori=0)continue;else doubl
9、e d=Math.log(class_vectori/class_total)/Math.log(2.0)*class_vectori/class_total;InfoD=InfoD-d;/计算InfoAdouble InfoA=0.0;for(int i=0;i values_count;i+)double middle=0.0;double attr_count=0.0;for(int j=0;j class_count;j+)attr_count+=values_vectori*class_count+j;for(int j=0;j max)max=Gaini;return_atrrib
10、ute=atrribute;i+;return return_atrribute;/node:在当前结点构造决策树/deData:数据集/flags:指示在当前结点构造决策树时哪些数据是需要的/attributes:未分类的属性集/attrIndexMap:属性与对应数据下标public void buildDecisionTree(TreeNode node,String deData,boolean flags,LinkedHashSet attributes,HashMap attrIndexMap)/如果待分类属性已空if(attributes.isEmpty()=true)/从数据集
11、中选择多数类,遍历符合条件的所有数据HashMap classMap=new HashMap();int classIndex=deData0.length-1;for(int i=0;i deData.length;i+)if(flagsi=true)if(classMap.containsKey(deDataiclassIndex)int count=classMap.get(deDataiclassIndex);classMap.put(deDataiclassIndex,count+1);else classMap.put(deDataiclassIndex,1);/选择多数类Stri
12、ng mostClass=null;int mostCount=0;Iterator it=classMap.keySet().iterator();while(it.hasNext()String strClass=(String)it.next();if(classMap.get(strClass)mostCount)mostClass=strClass;mostCount=classMap.get(strClass);/对结点进行赋值,该结点为叶结点node.setElement(mostClass);node.setChilds(null);System.out.println(yez
13、hi:+node.getElement()+:+node.getValue();return;/如果待分类数据全都属于一个类int class_index=deData0.length-1;String class_name=null;HashSet classSet=new HashSet();for(int i=0;i deData.length;i+)if(flagsi=true)class_name=deDataiclass_index;classSet.add(class_name);/则该结点为叶结点,设置有关值,然后返回if(classSet.size()=1)node.setE
14、lement(class_name);node.setChilds(null);System.out.println(leaf:+node.getElement()+:+node.getValue();return;/给定的分枝没有元组,是不是有这种情况?/选择一个分类属性String attribute=selectAtrribute(node,deData,flags,attributes,attrIndexMap);/设置分裂结点的值node.setElement(attribute);/System.out.println(attribute);if(node=root)System.
15、out.println(root:+node.getElement()+:+node.getValue();else System.out.println(branch:+node.getElement()+:+node.getValue();/生成和设置各个子结点int attrIndex=attrIndexMap.get(attribute);LinkedHashSet attrValues=new LinkedHashSet();for(int i=0;i deData.length;i+)if(flagsi=true)attrValues.add(deDataiattrIndex);L
16、inkedHashSet childs=new LinkedHashSet();for(String attrValue:attrValues)TreeNode tn=new TreeNode(attrValue);childs.add(tn);node.setChilds(childs);/在候选分类属性中删除当前属性attributes.remove(attribute);/在各个子结点上递归调用本函数if(childs.isEmpty()!=true)for(TreeNode child:childs)/设置子结点待分类的数据集boolean newFlags=new booleandeData.length;for(int i=0;i deData.length;i+)newFlagsi=flagsi;if(deDataiattrIndex!=child.getValue()newFlagsi=false;/设置子结点待分类的属性集LinkedHashSet newAttributes=new LinkedHashSet();for(String attr:attributes
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1