日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【java机器学习】决策树算法

發布時間:2024/8/23 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【java机器学习】决策树算法 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

參考文章:https://blog.csdn.net/qq_38773180/article/details/79188510
java代碼:

package decisionTree; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileWriter; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; class treeNode{//樹節點private String sname;//節點名public treeNode(String str) {sname=str;}public String getsname() {return sname;}ArrayList<String> label=new ArrayList<String>();//和子節點間的邊標簽ArrayList<treeNode> node=new ArrayList<treeNode>();//對應子節點 } public class ID3 {private ArrayList<String> label=new ArrayList<String>();//特征標簽private ArrayList<ArrayList<String>> date=new ArrayList<ArrayList<String>>();//數據集private ArrayList<ArrayList<String>> test=new ArrayList<ArrayList<String>>();//測試數據集private ArrayList<String> sum=new ArrayList<String>();//分類種類數private String kind;public ID3(String path,String path0) throws FileNotFoundException {//初始化訓練數據并得到分類種數getDate(path);//獲取測試數據集gettestDate(path0);init(date);}public void init(ArrayList<ArrayList<String>> date) {//得到種類數sum.add(date.get(0).get(date.get(0).size()-1));for(int i=0;i<date.size();i++) {if(sum.contains(date.get(i).get(date.get(0).size()-1))==false) {sum.add(date.get(i).get(date.get(0).size()-1)); }}}//獲取測試數據集public void gettestDate(String path) throws FileNotFoundException {String str;int i=0;try {//BufferedReader in=new BufferedReader(new FileReader(path));FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader in = new BufferedReader(isr); while((str=in.readLine())!=null) {String[] strs=str.split(",");ArrayList<String> line =new ArrayList<String>();for(int j=0;j<strs.length;j++) {line.add(strs[j]);//System.out.print(strs[j]+" ");}test.add(line);//System.out.println();i++;}in.close();}catch(Exception e) {e.printStackTrace();}}//獲取訓練數據集public void getDate(String path) throws FileNotFoundException {String str;int i=0;try {//BufferedReader in=new BufferedReader(new FileReader(path));FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis, "UTF-8"); BufferedReader in = new BufferedReader(isr); while((str=in.readLine())!=null) {if(i==0) {String[] strs=str.split(",");for(int j=0;j<strs.length;j++) {label.add(strs[j]);//System.out.print(strs[j]+" "); }i++;//System.out.println();continue;}String[] strs=str.split(",");ArrayList<String> line =new ArrayList<String>();for(int j=0;j<strs.length;j++) {line.add(strs[j]);//System.out.print(strs[j]+" ");}date.add(line);//System.out.println();i++;}in.close();}catch(Exception e) {e.printStackTrace();}}public double Ent(ArrayList<ArrayList<String>> dat) {//計算總的信息熵int all=0;double amount=0.0;for(int i=0;i<sum.size();i++) {for(int j=0;j<dat.size();j++) {if(sum.get(i).equals(dat.get(j).get(dat.get(0).size()-1))) {all++;}}if((double)all/dat.size()==0.0) {continue;}amount+=((double)all/dat.size())*(Math.log(((double)all/dat.size()))/Math.log(2.0));all=0;}if(amount==0.0) {return 0.0;}return -amount;//計算信息熵}//計算條件熵并返回信息增益值public double condtion(int a,ArrayList<ArrayList<String>> dat) {ArrayList<String> all=new ArrayList<String>();double c=0.0;all.add(dat.get(0).get(a));//得到屬性種類for(int i=0;i<dat.size();i++) {if(all.contains(dat.get(i).get(a))==false) {all.add(dat.get(i).get(a));}}ArrayList<ArrayList<String>> plus=new ArrayList<ArrayList<String>>();//部分分組ArrayList<ArrayList<ArrayList<String>>> count=new ArrayList<ArrayList<ArrayList<String>>>();//分組總和for(int i=0;i<all.size();i++) {for(int j=0;j<dat.size();j++) {if(true==all.get(i).equals(dat.get(j).get(a))) {plus.add(dat.get(j));}}count.add(plus);c+=((double)count.get(i).size()/dat.size())*Ent(count.get(i));plus.removeAll(plus);}return (Ent(dat)-c);//返回條件熵}//計算信息增益最大屬性public int Gain(ArrayList<ArrayList<String>> dat) {ArrayList<Double> num=new ArrayList<Double>();//保存各信息增益值for(int i=0;i<dat.get(0).size()-1;i++) {num.add(condtion(i,dat));}int index=0;double max=num.get(0);for(int i=1;i<num.size();i++) {if(max<num.get(i)) {max=num.get(i);index=i;}}//System.out.println("<"+label.get(index)+">");return index;}//構建決策樹public treeNode creattree(ArrayList<ArrayList<String>> dat) {int index=Gain(dat);treeNode node=new treeNode(label.get(index));ArrayList<String> s=new ArrayList<String>();//屬性種類s.add(dat.get(0).get(index));//System.out.println(dat.get(0).get(index));for(int i=1;i<dat.size();i++) {if(s.contains(dat.get(i).get(index))==false) {s.add(dat.get(i).get(index));//System.out.println(dat.get(i).get(index));}}ArrayList<ArrayList<String>> plus=new ArrayList<ArrayList<String>>();//部分分組ArrayList<ArrayList<ArrayList<String>>> count=new ArrayList<ArrayList<ArrayList<String>>>();//分組總和//得到節點下的邊標簽并分組for(int i=0;i<s.size();i++) {node.label.add(s.get(i));//添加邊標簽//System.out.print("添加邊標簽:"+s.get(i)+" ");for(int j=0;j<dat.size();j++) {if(true==s.get(i).equals(dat.get(j).get(index))) {plus.add(dat.get(j));}}count.add(plus);//System.out.println();//以下添加結點int k;String str=count.get(i).get(0).get(count.get(i).get(0).size()-1);for(k=1;k<count.get(i).size();k++) {if(false==str.equals(count.get(i).get(k).get(count.get(i).get(k).size()-1))) {break;}}if(k==count.get(i).size()) {treeNode dd=new treeNode(str);node.node.add(dd);//System.out.println("這是末端:"+str);}else {//System.out.print("尋找新節點:");node.node.add(creattree(count.get(i)));}plus.removeAll(plus); } return node;} //輸出決策樹public void print(ArrayList<ArrayList<String>> dat) {System.out.println("構建的決策樹如下:");treeNode node=null;node=creattree(dat);//類put(node);//遞歸調用 }//用于遞歸的函數public void put(treeNode node) {System.out.println("結點:"+node.getsname()+"\n");for(int i=0;i<node.label.size();i++) {System.out.println(node.getsname()+"的標簽屬性:"+node.label.get(i));if(node.node.get(i).node.isEmpty()==true) {System.out.println("葉子結點:"+node.node.get(i).getsname());}else {put(node.node.get(i));}} }//用于對待決策數據進行預測并將結果保存在指定路徑public void testdate(ArrayList<ArrayList<String>> test,String path) throws IOException {treeNode node=null;int count=0;System.out.println("this.date: "+ this.date);node=creattree(this.date);//類try {BufferedWriter out=new BufferedWriter(new FileWriter(path));for(int i=0;i<test.size();i++) {testput(node,test.get(i));//遞歸調用System.out.println("kind: " + kind);for(int j=0;j<test.get(i).size();j++) {out.write(test.get(i).get(j)+",");}System.out.println("count: " + count);System.out.println("aa: " + i + "\t" + date.get(i).get(date.get(i).size()-1));if(kind.equals(date.get(i).get(date.get(i).size()-1))==true) {count++;}out.write(kind);out.newLine();}System.out.println("該次分類結果正確率為:"+(double)count/test.size()*100+"%");out.flush();out.close();}catch(IOException e) {e.printStackTrace();}}//用于測試的遞歸調用public void testput(treeNode node,ArrayList<String> t) {System.out.println("ttt: " + t);int index=0;for(int i=0;i<this.label.size();i++) {if(this.label.get(i).equals(node.getsname())==true) {System.out.println("bbbbbb");index=i;break;}}for(int i=0;i<node.label.size();i++) {System.out.println("xxx: " + t);System.out.println("index: " + t.get(index));System.out.println("node.label.get(i)): " + (node.label.get(i)));if(t.get(index).equals(node.label.get(i))==false) {System.out.println("testPut");continue;}//直到找到葉子結點if(node.node.get(i).node.isEmpty()==true) { // System.out.println("分類結果為:"+node.node.get(i).getsname());this.kind=node.node.get(i).getsname();//取出分類結果System.out.println("this: " + this.kind);}else {System.out.println("aaa: ");testput(node.node.get(i),t);}} }public static void main(String[] args) throws IOException {String d = util.Directory.GetAppPath("decisonTreeData");String data= d + "data.txt";//訓練數據集String test= d + "test.txt";//測試數據集String result= d + "result.txt";//預測結果集ID3 id=new ID3(data,test);//初始化數據id.print(id.date);//構建并輸出決策樹id.testdate(id.test,result);//預測數據并輸出結果} }

文中訓練集、測試數據集格式為:
data.txt:用來做訓練集(注意第一行為特征,在test.txt首行中不需要添加)
色澤,根蒂,敲聲,紋理,臍部,觸感,好瓜
青綠,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
烏黑,蜷縮,沉悶,清晰,凹陷,硬滑,好瓜
烏黑,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
青綠,蜷縮,沉悶,清晰,凹陷,硬滑,好瓜
淺白,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
青綠,稍蜷,濁響,清晰,稍凹,軟粘,好瓜
烏黑,稍蜷,濁響,稍糊,稍凹,軟粘,好瓜
烏黑,稍蜷,濁響,清晰,稍凹,硬滑,好瓜
烏黑,稍蜷,沉悶,稍糊,稍凹,硬滑,壞瓜
青綠,硬挺,清脆,清晰,平坦,軟粘,壞瓜
淺白,硬挺,清脆,模糊,平坦,硬滑,壞瓜
淺白,蜷縮,濁響,模糊,平坦,軟粘,壞瓜
青綠,稍蜷,濁響,稍糊,凹陷,硬滑,壞瓜
淺白,稍蜷,沉悶,稍糊,凹陷,硬滑,壞瓜
烏黑,稍蜷,濁響,清晰,稍凹,軟粘,壞瓜
淺白,蜷縮,濁響,模糊,平坦,硬滑,壞瓜
青綠,蜷縮,沉悶,稍糊,稍凹,硬滑,壞瓜

test.txt:和data.txt內容一行,為了測量構建決策樹再計算的準確率,其內容可以自行修改(注意:準確率是基于data.txt計算的,如果test內容和data不同不需要關注準確率計算結果)
青綠,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
烏黑,蜷縮,沉悶,清晰,凹陷,硬滑,好瓜
烏黑,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
青綠,蜷縮,沉悶,清晰,凹陷,硬滑,好瓜
淺白,蜷縮,濁響,清晰,凹陷,硬滑,好瓜
青綠,稍蜷,濁響,清晰,稍凹,軟粘,好瓜
烏黑,稍蜷,濁響,稍糊,稍凹,軟粘,好瓜
烏黑,稍蜷,濁響,清晰,稍凹,硬滑,好瓜
烏黑,稍蜷,沉悶,稍糊,稍凹,硬滑,壞瓜
青綠,硬挺,清脆,清晰,平坦,軟粘,壞瓜
淺白,硬挺,清脆,模糊,平坦,硬滑,壞瓜
淺白,蜷縮,濁響,模糊,平坦,軟粘,壞瓜
青綠,稍蜷,濁響,稍糊,凹陷,硬滑,壞瓜
淺白,稍蜷,沉悶,稍糊,凹陷,硬滑,壞瓜
烏黑,稍蜷,濁響,清晰,稍凹,軟粘,壞瓜
淺白,蜷縮,濁響,模糊,平坦,硬滑,壞瓜
青綠,蜷縮,沉悶,稍糊,稍凹,硬滑,壞瓜

總結

以上是生活随笔為你收集整理的【java机器学习】决策树算法的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。