C4.5演算法是一種用來對數據實作出決策樹(Decision tree analysis)分析的演算法,由Ross Quinlan於1993改進 ID3演算法 (Ross Quinlan,1979)提出.決策樹的分析可以處做出條件判斷式(也就是所謂的邏輯模型),用來對資料做預測,這樣的好處是生成的條件判斷可以讓人看得懂,有助於做出商業邏輯的判斷和理解,缺點是由於要做好幾次排序處理,所以效率比較低

C4.5演算法的分割規則是用: 資訊熵(Entropy) 和資訊獲利比率 (Gain Ratio) ,虛擬碼參考自 維基百科:

  • Check for base cases
  • For each attribute a
  • Find the normalized information gain ratio from splitting on a
  • Let a_best be the attribute with the highest normalized information gain
  • Create a decision node that splits on a_best
  • Recur on the sublists obtained by splitting on a_best , and add those nodes as children of node
  • 實做的部分利用 Weka平台 ,現在假設我要分析一款App是不是能夠成功被市場接受,已有的歷史資料如下:

    (我這裡有省略13之後的資料,這份資料是自己亂數key的,只是demo用,沒有參考價值)

    接著要轉換成weka看得懂的格式
    @relation XXX表示分析的主題,
    @attribute YYY表示分析的參數名稱
    (numeric是數字,{}是集合)以下是範例:

    @relation AppAnalysisTest

    @attribute AppAttribute {social,tool,game}
    @attribute AppStartUsers numeric
    @attribute FirstMonthIncreasUser numeric
    @attribute Pivot{yes, no}
    @attribute Success{yes, no}

    @data
    social,10,50,yes,no
    tool,1,79,no,yes
    game,75,99,yes,yes
    social,134,1020,no,yes
    game,34,10009,yes,yes
    social,0,803,yes,no

    一樣有省略掉資料,我的訓練資料可以下載:

    Excel資料檔

    Weka資料檔

    接著是程式碼的部分:

    package javaapplication58; import java.awt.BorderLayout; import java.io.BufferedReader; import java.io.FileReader; import javax.swing.JFrame; import weka.classifiers.trees.J48; import weka.core.Instances; import weka.gui.treevisualizer.PlaceNode2; import weka.gui.treevisualizer.TreeVisualizer; public class JavaApplication58 public static void main(String args[]) throws Exception BufferedReader reader = new BufferedReader( new FileReader("App.arff")); J48 AnsC45=new J48();//C4.5的分析物件在weka.jar上叫做J48() Instances data = new Instances(reader);//把資料放進來 reader.close(); data.setClassIndex(data.numAttributes()-1); AnsC45.buildClassifier(data);//這裡做分析 System.out.println(AnsC45.toSummaryString());//印出結論 //視覺化分析結果 TreeVisualizer tv=new TreeVisualizer(null,AnsC45.graph(),new PlaceNode2()); JFrame visual=new JFrame("Example");//視窗名稱 visual.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); visual.setSize(800,600);//視窗大小 visual.getContentPane().add(tv,BorderLayout.CENTER);//加入圖表 visual.setVisible(true);

    跑出來的結果如下:

    Number of leaves: 4
    Size of the tree: 6

    最後的解讀,一個可能可以成功的App的模式可以是一初始使用者人數大於10,如果小於10則只有工具類型的才會成功 (以上分析純屬唬爛,因為數據是掰的)

    另外,如果想要跑數據預測可以 參考這裡

    25.032969 121.565418

    現在假設一個情境,我們把人的特徵映射成某組多維度的向量,可以用N0(X1,X2,X3…Xn)來表示.假設我現在有一群人的向量N0(X1,X2,X3…Xn), N1(X1,X2,X3…Xn)……Nn(X1,X2,X3…Xn)我想要透過一個以演算法去把這群人分成N類,類似底下的圖:

    這時候我可以利用K means演算法來完成這樣的工作.

    K means演算法的原理是透過群心(一群資料Cluster的中心)和其周圍的距離做出最短的計算,來決定每個點屬於哪一群.

    這裡把情境帶出來會比較好理解,假設我們訂定一個人可以表示為以下格式

    (性別,性格,職業,興趣,星座)

    性別=1(男)或2(女)或3(非典型性別)

    性格=0~15(十六種人格分類)

    職業=0~15(十六種職業分類)

    興趣=0~15(十六種興趣分類)

    星座=0~11(十二種星座分類)

    [注]:經過社群討論和網友提醒,K-means演算法較不適用離散類型的資料:)

    接著我想要了解哪些人的特質是屬於同一群的,我可以指定現在大風吹變成三群人,這時候K Means就會透過三群的群心去計算每個點到群心的距離,然後求出距離最近的結果

    演算法可以表示成如下( 資料來源 ):

    其中,x-μ絕對值再平方就是距離公式

    至於實做這個演算法我個人推薦 Weka 這個開源的資料探勘平台,他有提供很方便的函示庫可以直接使用.授權方式可以參考: 這裡

    以下是使用的範例程式碼:
    Cluster.java:

    package cluster; import lib.Kmeans; public class Cluster public static void main(String[] args) throws Exception Kmeans KmeansA=new Kmeans("C:\\Users\\user\\Desktop\\weka-3-7-12\\data\\cpu.arff");//要分析的檔案位置 int[] ans=KmeansA.KmeansCluster(3);//呼叫KmeansCluster方法,傳入要分群,EX:3-分三群 for(int i=0;i<ans.length;i++) System.out.printf("點 %d屬於第%d群 \n", i, ans[i]);//印出結果

    Kmeans.java:

    package lib; import java.io.BufferedReader; import java.io.FileNotFoundException; import java.io.FileReader; import java.util.logging.Level; import java.util.logging.Logger; import weka.clusterers.SimpleKMeans; import weka.core.Instances; public class Kmeans private static String srcfile; public Kmeans(String srcfile) this.srcfile=srcfile;//建構子設定檔案位置 private static BufferedReader readDataFile() //開檔方法 BufferedReader inputReader = null; inputReader = new BufferedReader(new FileReader(srcfile)); } catch (FileNotFoundException ex) System.err.println("File not found: " + srcfile); return inputReader; public int[] KmeansCluster(int k) SimpleKMeans kmeans = new SimpleKMeans();//呼叫kmeans的class kmeans.setSeed(10);//設定種子群心 kmeans.setPreserveInstancesOrder(true); kmeans.setNumClusters(k);//分幾群 BufferedReader datafile = readDataFile(); Instances data = new Instances(datafile); kmeans.buildClusterer(data);//資料倒進來 int[] assignments = kmeans.getAssignments();//返回分析結果 return assignments; catch (Exception ex) Logger.getLogger(Kmeans.class.getName()).log(Level.SEVERE, null, ex); return null;

    輸出結果:

    點 0屬於第1群 點 1屬於第1群 點 2屬於第1群 點 3屬於第1群 點 4屬於第2群 點 5屬於第1群 點 6屬於第1群 點 7屬於第1群 點 8屬於第1群 點 9屬於第1群 點 10屬於第2群 點 11屬於第2群 點 12屬於第2群 點 13屬於第2群 點 14屬於第2群 點 15屬於第2群 點 16屬於第2群 點 17屬於第2群 點 18屬於第2群 點 19屬於第1群 點 20屬於第2群 點 21屬於第2群 點 22屬於第2群 點 23屬於第2群 點 24屬於第2群 點 25屬於第2群 點 26屬於第2群 點 27屬於第2群 點 28屬於第2群 點 29屬於第2群 點 30屬於第2群 點 31屬於第1群 點 32屬於第2群 點 33屬於第2群 點 34屬於第2群 點 35屬於第2群 點 36屬於第2群 點 37屬於第2群 點 38屬於第2群 點 39屬於第2群 點 40屬於第2群 點 41屬於第2群 點 42屬於第2群 點 43屬於第2群 點 44屬於第2群 點 45屬於第2群 點 46屬於第0群 .....(以下省略) 未知 的大頭貼 台大PMBA – 行銷管理Part1 產品市場擴充矩陣 【類神經網路】感知機的原理以及實作… Back Propagation with a P… whuang022 的大頭貼 whuang022 淺談多準則決策法AHP與ANP 小吳 的大頭貼 小吳 在 淺談多準則決策法AHP與ANP whuang022 的大頭貼 whuang022 樸素貝葉斯分類器(Naive Bayes classifie…
  • Android java
  • Exception
  • 自然語言處理
  • 類神經網路
  • GPGPU
  • Linux
  • object oriented
  • SQL資料庫
  • 培力演講筆記
  •