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
在
淺談多準則決策法AHP與ANP

小吳 在
淺談多準則決策法AHP與ANP
whuang022
在
樸素貝葉斯分類器(Naive Bayes classifie…
Android java
Exception
自然語言處理
類神經網路
GPGPU
Linux
object oriented
SQL資料庫
培力演講筆記