版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
決策樹程序?qū)嶒?yàn)決策樹程序?qū)嶒?yàn)決策樹程序?qū)嶒?yàn)決策樹程序?qū)嶒?yàn)編制僅供參考審核批準(zhǔn)生效日期地址:電話:傳真:郵編:決策樹程序?qū)嶒?yàn)
眾所周知,數(shù)據(jù)庫技術(shù)從20世紀(jì)80年代開始,已經(jīng)得到廣泛的普及和應(yīng)用。隨著數(shù)據(jù)庫容量的膨脹,特別是數(shù)據(jù)倉庫以及web等新型數(shù)據(jù)源的日益普及,人們面臨的主要問題不再是缺乏足夠的信息可以使用,而是面對浩瀚的數(shù)據(jù)海洋如何有效地利用這些數(shù)據(jù)。從數(shù)據(jù)中生成分類器的一個(gè)特別有效的方法是生成一個(gè)決策樹(DecisionTree)。決策樹表示方法是應(yīng)用最廣泛的邏輯方法之一,它從一組無次序、無規(guī)則的事例中推理出決策樹表示形式的分類規(guī)則。決策樹分類方法采用自頂向下的遞歸方式,在決策樹的內(nèi)部結(jié)點(diǎn)進(jìn)行屬性值的比較并根據(jù)不同的屬性值判斷從該結(jié)點(diǎn)向下的分支,在決策樹的葉結(jié)點(diǎn)得到結(jié)論。所以從決策樹的根到葉結(jié)點(diǎn)的一條路徑就對應(yīng)著一條合取規(guī)則,整棵決策樹就對應(yīng)著一組析取表達(dá)式規(guī)則。決策樹是應(yīng)用非常廣泛的分類方法,目前有多種決策樹方法,如ID3、CN2、SLIQ、SPRINT等。一、問題描述相關(guān)信息決策樹是一個(gè)類似于流程圖的樹結(jié)構(gòu),其中每個(gè)內(nèi)部結(jié)點(diǎn)表示在一個(gè)屬性上的測試,每個(gè)分支代表一個(gè)測試輸入,而每個(gè)樹葉結(jié)點(diǎn)代表類或類分布。數(shù)的最頂層結(jié)點(diǎn)是根結(jié)點(diǎn)。一棵典型的決策樹如圖1所示。它表示概念buys_computer,它預(yù)測顧客是否可能購買計(jì)算機(jī)。內(nèi)部結(jié)點(diǎn)用矩形表示,而樹葉結(jié)點(diǎn)用橢圓表示。為了對未知的樣本分類,樣本的屬性值在決策樹上測試。決策樹從根到葉結(jié)點(diǎn)的一條路徑就對應(yīng)著一條合取規(guī)則,因此決策樹容易轉(zhuǎn)化成分類規(guī)則。圖1ID3算法:■ 決策樹中每一個(gè)非葉結(jié)點(diǎn)對應(yīng)著一個(gè)非類別屬性,樹枝代表這個(gè)屬性的值。一個(gè)葉結(jié)點(diǎn)代表從樹根到葉結(jié)點(diǎn)之間的路徑對應(yīng)的記錄所屬的類別屬性值。■ 每一個(gè)非葉結(jié)點(diǎn)都將與屬性中具有最大信息量的非類別屬性相關(guān)聯(lián)?!?采用信息增益來選擇能夠最好地將樣本分類的屬性。信息增益基于信息論中熵的概念。ID3總是選擇具有最高信息增益(或最大熵壓縮)的屬性作為當(dāng)前結(jié)點(diǎn)的測試屬性。該屬性使得對結(jié)果劃分中的樣本分類所需的信息量最小,并反映劃分的最小隨機(jī)性或“不純性”。問題重述1、目標(biāo)概念為“壽險(xiǎn)促銷”2、計(jì)算每個(gè)屬性的信息增益3、確定根節(jié)點(diǎn)的測試屬性模型求解構(gòu)造決策樹的方法是采用自上而下的遞歸構(gòu)造,其思路是:■ 以代表訓(xùn)練樣本的單個(gè)結(jié)點(diǎn)開始建樹(步驟1)?!?如果樣本都在同一類,則該結(jié)點(diǎn)成為樹葉,并用該類標(biāo)記(步驟2和3)。■ 否則,算法使用稱為信息增益的機(jī)遇熵的度量為啟發(fā)信息,選擇能最好地將樣本分類的屬性(步驟6)。該屬性成為該結(jié)點(diǎn)的“測試”或“判定”屬性(步驟7)。值得注意的是,在這類算法中,所有的屬性都是分類的,即取離散值的。連續(xù)值的屬性必須離散化。■ 對測試屬性的每個(gè)已知的值,創(chuàng)建一個(gè)分支,并據(jù)此劃分樣本(步驟8~10)。■ 算法使用同樣的過程,遞歸地形成每個(gè)劃分上的樣本決策樹。一旦一個(gè)屬性出現(xiàn)在一個(gè)結(jié)點(diǎn)上,就不必考慮該結(jié)點(diǎn)的任何后代(步驟13)?!?遞歸劃分步驟,當(dāng)下列條件之一成立時(shí)停止:(a)給定結(jié)點(diǎn)的所有樣本屬于同一類(步驟2和3)。(b)沒有剩余屬性可以用來進(jìn)一步劃分樣本(步驟4)。在此情況下,采用多數(shù)表決(步驟5)。這涉及將給定的結(jié)點(diǎn)轉(zhuǎn)換成樹葉,并用samples中的多數(shù)所在類別標(biāo)記它。換一種方式,可以存放結(jié)點(diǎn)樣本的類分布。(c)分支test_attribute=ai沒有樣本。在這種情況下,以samples中的多數(shù)類創(chuàng)建一個(gè)樹葉(步驟12)。算法 Decision_Tree(samples,attribute_list)輸入 由離散值屬性描述的訓(xùn)練樣本集samples;候選屬性集合attribute_list。輸出 一棵決策樹。(1)創(chuàng)建節(jié)點(diǎn)N;(2)Ifsamples都在同一類C中then(3)返回N作為葉節(jié)點(diǎn),以類C標(biāo)記;(4)Ifattribute_list為空then(5)返回N作為葉節(jié)點(diǎn),以samples中最普遍的類標(biāo)記;quals("")){ StringTokenizertokenizer=newStringTokenizer(str); while()){ ()); } } returncandAttr; } /** *讀取訓(xùn)練元組 *@return訓(xùn)練元組集合 *@throwsIOException */ publicArrayList<ArrayList<String>>readData()throwsIOException{ ArrayList<ArrayList<String>>datas=newArrayList<ArrayList<String>>(); BufferedReaderreader=newBufferedReader(newInputStreamReader); Stringstr=""; while(!(str=()).equals("")){ StringTokenizertokenizer=newStringTokenizer(str); ArrayList<String>s=newArrayList<String>(); while()){ ()); } (s); } returndatas; } /** *遞歸打印樹結(jié)構(gòu) *@paramroot當(dāng)前待輸出信息的結(jié)點(diǎn) */ publicvoidprintTree(TreeNoderoot){ "name:"+()); ArrayList<String>rules=(); "noderules:{"); for(inti=0;i<();i++){ +""); } "}"); ""); ArrayList<TreeNode>children=(); intsize=(); if(size==0){ "-->leafnode!<--"); }else{ "sizeofchildren:"+()); for(inti=0;i<();i++){ "child"+(i+1)+"ofnode"+()+":"); printTree(i)); } } } /** *主函數(shù),程序入口 *@paramargs */ publicstaticvoidmain(String[]args){ TestDecisionTreetdt=newTestDecisionTree(); ArrayList<String>candAttr=null; ArrayList<ArrayList<String>>datas=null; try{ "請輸入候選屬性"); candAttr=(); "請輸入訓(xùn)練數(shù)據(jù)"); datas=(); }catch(IOExceptione){ (); } DecisionTreetree=newDecisionTree(); TreeNoderoot=(datas,candAttr); (root); }}packageDecisionTree;import*選擇最佳分裂屬性*/publicclassGain{ privateArrayList<ArrayList<String>>D=null;et(attrIndex); if(!(r)){ (r); } } returnvalues; } /** *獲取指定數(shù)據(jù)集中指定屬性列索引的域值及其計(jì)數(shù) *@paramd指定的數(shù)據(jù)集 *@paramattrIndex指定的屬性列索引 *@return類別及其計(jì)數(shù)的map */ publicMap<String,Integer>valueCounts(ArrayList<ArrayList<String>>datas,intattrIndex){ Map<String,Integer>valueCount=newHashMap<String,Integer>(); Stringc=""; ArrayList<String>tuple=null; for(inti=0;i<();i++){ tuple=(i); c=(attrIndex); if(c)){ (c,(c)+1); }else{ (c,1); } } returnvalueCount; } /** *求對datas中元組分類所需的期望信息,即datas的熵 *@paramdatas訓(xùn)練元組 *@returndatas的熵值 */ publicdoubleinfoD(ArrayList<ArrayList<String>>datas){ doubleinfo=; inttotal=(); Map<String,Integer>classes=valueCounts(datas,()); Iteratoriter=().iterator(); Integer[]counts=newInteger[()]; for(inti=0;();i++) { entry=(); Integerval=(Integer)(); counts[i]=val; } for(inti=0;i<;i++){ doublebase=(counts[i],total,3); info+=(-1)*base*(base); } returninfo; } /** *獲取指定屬性列上指定值域的所有元組 *@paramattrIndex指定屬性列索引 *@paramvalue指定屬性列的值域 *@return指定屬性列上指定值域的所有元組 */ publicArrayList<ArrayList<String>>datasOfValue(intattrIndex,Stringvalue){ ArrayList<ArrayList<String>>Di=newArrayList<ArrayList<String>>(); ArrayList<String>t=null; for(inti=0;i<();i++){ t=(i); if(attrIndex).equals(value)){ (t); } } returnDi; } /** *基于按指定屬性劃分對D的元組分類所需要的期望信息 *@paramattrIndex指定屬性的索引 *@return按指定屬性劃分的期望信息值 */ publicdoubleinfoAttr(intattrIndex){ doubleinfo=; ArrayList<String>values=getValues(D,attrIndex); for(inti=0;i<();i++){ ArrayList<ArrayList<String>>dv=datasOfValue(attrIndex,(i)); info+=(),(),3),infoD(dv)); } returninfo; } /** *獲取最佳分裂屬性的索引 *@return最佳分裂屬性的索引 */ publicintbestGainAttrIndex(){ intindex=-1; doublegain=; doubletempGain=; for(inti=0;i<();i++){ tempGain=infoD(D)-infoAttr(i); if(tempGain>gain){ gain=tempGain; index=i; } } returnindex; }}packageDecisionTree;import.*;/***決策樹構(gòu)造類*/publicclassDecisionTree{ privateIntegerattrSelMode;terator(); for(inti=0;();i++) { entry=(); Stringkey=(String)(); Integerval=(Integer)(); if(val>max){ max=val; maxC=key; } } returnmaxC; } /** *構(gòu)造決策樹 *@paramdatas訓(xùn)練元組集合 *@paramattrList候選屬性集合 *@return決策樹根結(jié)點(diǎn) */ publicTreeNodebuildTree(ArrayList<ArrayList<String>>datas,ArrayList<String>attrList){emove(bestAttrIndex); } if()==0){ TreeNodeleafNode=newTreeNode(); (maxC); (di); (attrList); ().add(leafNode); }else{ TreeNodenewNode=buildTree(di,attrList); ().add(newNode); } } returnnode; }}packageDecisionTree;importpublicclassDecimalCalculate{/***由于Java的簡單類型不能夠精確的對浮點(diǎn)數(shù)進(jìn)行運(yùn)算,這個(gè)工具類提供精*確的浮點(diǎn)數(shù)運(yùn)算,包括加減乘除和四舍五入。*/oubleValue(); } /** *提供精確的減法運(yùn)算。 *@paramv1被減數(shù) *@paramv2減數(shù) *@return兩個(gè)參數(shù)的差 */ publicstaticdoublesub(doublev1,doublev2){ BigDecimalb1=newBigDecimal(v1)); BigDecimalb2=newBigDecimal(v2)); return(b2).doubleValue(); } /** *提供精確的乘法運(yùn)算。 *@paramv1被乘數(shù) *@paramv2乘數(shù) *@return兩個(gè)參數(shù)的積 */ publicstaticdoublemul(doublev1,doublev2){ BigDecimalb1=newBigDecimal(v1)); BigDecimalb2=newBigDecimal(v2)); return(b2).doubleValue(); } /** *提供(相對)精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到 *小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。 *@paramv1被除數(shù) *@paramv2除數(shù) *@return兩個(gè)參數(shù)的商 */ publicstaticdoublediv(doublev1,doublev2){ returndiv(v1,v2,DEF_DIV_SCALE); } /** *提供(相對)精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指 *定精度,以后的數(shù)字四舍五入。 *@paramv1被除數(shù) *@paramv2除數(shù) *@paramscale表示表示需要精確到小數(shù)點(diǎn)以后幾位。 *@return兩個(gè)參數(shù)的商 */ publicstaticdoublediv(doublev1,doublev2,intscale){ if(scale<0){ thrownewIllegalArgumentException( "Thescalemustbeapositiveintegerorzero"); } BigDecimalb1=newBigDecimal(v1)); BigDecimalb2=newBigDecimal(v2)); return(b2,scale,.doubleValue(); } /** *提供精確的小數(shù)位四舍五入處理。 *@paramv需要四舍五入的數(shù)字 *@paramscale小數(shù)點(diǎn)后保留幾位 *@return四舍五入后的結(jié)果 */ publicstaticdoubleround(doublev,intscale){ if(scale<0){ thrownewIllegalArgumentException( "Thescalemustbeapositiveintegerorzero"); } BigDecimalb=newBigDecimal(v)); BigDecimalone=newBigDecimal("1"); return(one,scale,.doubleValue(); } /** *提供精確的類型轉(zhuǎn)換(Float) *@paramv需要被轉(zhuǎn)換的數(shù)字 *@return返回轉(zhuǎn)換結(jié)果 */ publicstaticfloatconvertsToFloat(doublev){ BigDecimalb=newBigDecimal(v); return(); } /** *提供精確的類型轉(zhuǎn)換(Int)不進(jìn)行四舍五入 *@paramv需要被轉(zhuǎn)換的數(shù)字 *@return返回轉(zhuǎn)換結(jié)果 */ publicstaticintconvertsToInt(doublev){ BigDecimalb=newBigDecimal(v); return(); } /** *提供精確的類型轉(zhuǎn)換(Long) *@paramv需要被轉(zhuǎn)換的數(shù)字 *@return返回轉(zhuǎn)換結(jié)果 */ publicstaticlongconvertsToLong(doublev){ BigDecimalb=newBigDecimal(v); return(); } /** *返回兩個(gè)數(shù)中大的一個(gè)值 *@paramv1需要被對比的第一個(gè)數(shù) *@paramv2需要被對比的第二個(gè)數(shù) *@return返回兩個(gè)數(shù)中大的一個(gè)值 */ pub
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年度年福建省高校教師資格證之高等教育法規(guī)基礎(chǔ)試題庫和答案要點(diǎn)
- 疫情之下企業(yè)直播告訴發(fā)展遇新機(jī)遇
- 航空模型基礎(chǔ)理論知識(shí)單選題100道及答案解析
- 2024年個(gè)人用工保證協(xié)議參考格式
- 社區(qū)教育志愿者隊(duì)伍建設(shè)研究
- 寫給愛心捐款的感謝信
- 2024年吊車租賃協(xié)議樣本2
- 2024年石灰石批發(fā)銷售協(xié)議范例
- 2024年權(quán)益過戶協(xié)議模板
- 2024年度商用空調(diào)安裝協(xié)議范本
- GB/T 44352-2024燃油蒸發(fā)排放系統(tǒng)用活性炭通用要求
- 2024山東濟(jì)南軌道交通集團(tuán)限公司招聘49人高頻難、易錯(cuò)點(diǎn)500題模擬試題附帶答案詳解
- 市政道路交通疏導(dǎo)方案施工方案
- “數(shù)字三品”應(yīng)用場景典型案例申報(bào)書
- 2024秋三年級語文上冊第二次月考達(dá)標(biāo)檢測卷第三四單元新人教版
- 2024年下半年遼寧事業(yè)單位高頻500題難、易錯(cuò)點(diǎn)模擬試題附帶答案詳解
- 中醫(yī)人工智能
- 人教版(2024)八年級上冊物理第3章《物態(tài)變化》單元測試卷(含答案解析)
- 金屬冶煉(鉛、鋅冶煉)主要負(fù)責(zé)人安全資格考試題庫及答案
- 2024中國鐵路集團(tuán)全國招聘高頻考題難、易錯(cuò)點(diǎn)模擬試題(共500題)附帶答案詳解
- (全冊各類齊全)二年級數(shù)學(xué)上冊100道口算題大全54份(100題)
評論
0/150
提交評論