© ISL 2000 1 Chapter14 輸輸輸輸 大大 大大大大大大 PMML 大大 C 大大大大
Dec 30, 2015
© ISL 2000 1
Chapter14輸出模型
大綱 模型輸出概論 PMML 輸出 C 代碼輸出
© ISL 2000 2
14.1 模型輸出概論模型類型 支援的輸出類型神經網路 C 代碼, PMML
建立 C5.0 C 代碼, PMML
Kohonen C 代碼, PMML
線性回歸 PMML
一般規則歸納 PMML
Apriori PMML
K-Means C 代碼, PMML
邏輯回歸 PMML
兩步聚類 PMML
分類和回歸 (C&R) 樹 PMML
序列探測 PMML
因數分析 / 主成分分析 None
© ISL 2000 3
14.1.1 模型的輸出
選擇以何種方式輸出
© ISL 2000 4
14.2 PMML 輸出
除了 Factor/PCA 模型以外,都可以用 PMML 格式進行輸出
Export PMML 選項導出一個模型,會産生一個用 PMML2.0 來描述該模型的 XML 檔
PMML 文件的 DTD 是 pmml-2.0.dtd ,此文件在位於 Clementine 安裝目錄的 dtd 文件夾中
更多關於PMML的細節,使用者可以參考網址: http://www.dmg.org
© ISL 2000 5
© ISL 2000 6
14.3 C 代碼輸出
模型 類神經網路 Kohonen C5.0 K-Means
© ISL 2000 7
14.3.1 輸出 C5.0 決策數和規則集
規則的輸出創立兩個文件:頭檔和原始檔案。這些檔案名沿用以規則進行預測的 OUT 欄位名
Exl: 如果 OUT 欄位的名字是 NAME ,則輸出産生的文件爲 NAME.h 和 NAME.c 。
規則的頭文件 頭檔定義常數,用來代表符號(集和標記)欄位值。這些常
數的名字經常有的形式: FIELD_VALUE 例如,如果欄位 BP 有值 high ,將表示爲 BP_high 。 另外,頭檔定義 struct 代表一個例子。這個 struct 的名字爲 ex
NAME ,與 OUT 欄位中的 NAME 相對應。 Struct 處理整數型欄位爲 int ,實型欄位爲 float
© ISL 2000 8
規則的原始檔案 包含 C 代碼的原始檔案用來預測相關的模型。這些
代碼的前面部分包含相應的頭檔,其他的原始檔案定義預測的函數。這些函數的名字在 OUT 欄位中都有對應。在頭檔中所定義例子的結構作爲函數的參數使用。
Ex: 如果 OUT 欄位是 NAME ,則函數有以下結構 int NAME(struct exNAME example, double *confiden
ce) { .... }
© ISL 2000 9
決策樹中,函數體 { .... } 是由 If 和 Switch 語句組成的。規則集轉變爲唯一水平條件。改進的模型中是每個模型産生一個“靜態” ( 檔局部)函數。
函數的返回值是依賴於 OUT 欄位類型: 一個實數型 OUT 欄位産生一個 float 。 一個整數型 OUT 欄位返回一個 int 。 一個符號 OUT 欄位産生一個整型,相應於一個在頭文件中被
定義成欄位值的常數。 一個“ unclassifiable” 例子返回 0 ( 被定義爲 unknown 常量 ) 。
函數自動爲其返回值設置與分類有關的信心
© ISL 2000 10
14.3.2 輸出網路
網路輸出創建 3個文件 封裝頭文件( Wrapper header file ) 封裝程式文件( File of wrapper routines ) 網路定義文件 (*.san)
封裝程式使用的函數是在其他檔中找到的,不依賴於模型。這些函數使用網路定義檔來重新産生神經網路。檔案名依神經系統網路名而定,如,一個名爲 DRUG 的網路,輸出創建的檔案名叫做 DRUG.h , DRUG.c ,和 DRUG.san
© ISL 2000 11
神經網路封裝頭文件(Neural Net Wrapper Header File)
被輸出的神經網路封裝頭文件聲明兩個 structs 和兩個函數,它們的名字源自網路名
Ex: 對某個網路名叫 Drug ,頭檔包括: Drug_inputs ,一個用於輸入的結構 Drug_outputs , 一個用於輸出的結構 處理輸入和輸出的兩個函數
void neural_Drug_CLEARSETS ()---- 清除輸入資料 其他函數爲: struct Drug_outputs *neural_Drug( struct
Drug_inputs *ins,struct Drug_outputs *outs )
---- 利用輸入結構輸入,和以輸出結構返回網路中的結果
© ISL 2000 12
神經網路封裝程式( Neural Net Wrapper Routines)
原始檔案包含了頭檔中所定義的兩個函數的代碼。該代碼包含了對在 neurals.c 中的函數的調用。封裝程式的返回值依賴於 OUT 欄位,如下 集合返回 *char 。 標記産生 int (1 代表真, 0 代表假 ) 實數型返回爲 double 整數産生一個 int
神經網路輸出的其他文件( Other Files for Neural Net Export ) 爲了使用某個網路,附加檔應該在編譯期間就包含進來。這
些檔在 Clementine 安裝的 LIB/sann 子目錄中,並且被命名爲 forprop.h , forprop.c , neurals.h , an 和 neurals.c
© ISL 2000 13
int neural_init(char *filename)打開一個神經網路,它的定義對應於一個已命名檔 ( 通常是一個*.san 文件 ).
int neural_propagate(char *netname)在神經網路中 netname 中設置變數 varnam 爲第三個參數,它的類型依賴於被設置的變數
int neural_propagate(char *netname) 通過網路 netname ,將輸入中的值前向傳播至輸出
int neural_result( char *netname, char *varname, struct neural_r_u *results)在神經網路 netname 中,將輸出變數 varname 中的結果,輸入到聯合變數的結果中 ( 集合爲 results.c ,實數範圍爲 results.d ,整數值和標記值爲 results.i)
nt neural_close(char *netname) 關閉名爲 netname 的網路
文件 neurals.c 爲神經網路的處理過程提供 5 個函數
© ISL 2000 14
14.3.3 輸出徑向基函數網路網路( Exporting Radial Basis Function (RBF) Nets ) 創建三個文件
封裝頭文件 封裝程式的文件 神經網路定義文件 (*.san)
封裝程式利用在 neurals_rbf.c 中的函數。這些函數使用網路定義檔來複製網路。
徑向基函數網路輸出文件的名稱採用徑向基函數網路的名稱。例如,一個徑向基函數網路名爲 Drug, ,三個文件將名爲: Drug.h, Drug.c, and Drug.san
© ISL 2000 15
徑向基函數網路封裝頭文件
輸出的 RBF 網路封裝頭檔包含兩個結構( structs )和兩個函數,使用名字來源於網路名。例如,一個名爲Drug 的網路産生的頭檔包括: Drug_inputs, 用於輸入的 struct Drug_outputs, 用於輸出的 struct 處理輸入和輸出的函數
void neural_Drug_CLEARSETS () --- 清除輸入資料 struct Drug_outputs *neural_Drug( struct Drug_inputs *ins,str
uct Drug_outputs *outs ) -- 利用輸入結構輸入,和以輸出結構返回 RBF 網路中的結果
© ISL 2000 16
RBF 網路封裝程式
原始檔案包含兩個在相應的頭檔中定義的函數代碼,這些代碼包含著對 neurals_rbf.c 函數的調用
由封裝程式返回的值依賴於 OUT 欄位: 一個産生 *char 的集合。 返回一個 int (1 代表真, 0 代表假 ) 的標記。 一個産生 double 的實數型。 一個返回 int 的整數型
RBF 網路輸出的其他文件( Other Files for RBF Net Export ) 爲了使用網路,使用者必須在編譯中包含附加檔。這些檔在 Clement
ine 安裝的 LIB/sann 子目錄中,並且被命名爲 rbfprop.h , rbfprop.c ,neurals_rbf.h , and neurals_rbf.c
© ISL 2000 17
neurals_rbf.c 檔在網路過程中提供五個函數
int neural_rbf_init(char *filename) 打開在已命名的檔中定義的 RBF 網路 ( 通常是 *.san 文件 ) int neural_rbf_set(char *netnam, char *varnam, ...) 在網路中 netname 中設置變數 varnam 爲第三個參數,它的類型決定於被設置的變數 nt neural_rbf_propagate(char *netname)在網路 netname 中前向傳播從輸入中得到的變數值至輸出 int neural_rbf_result(char *netname, char *varname, struct neural_r_u *
results) 在網路 netname 中把從輸出變數 varname 中得到的結果置入聯合類
型結果 ( 設置爲 results.c ,實數範圍爲 results.d ,整數和標記爲 results.i) int neural_rbf_close(char *netname) 關閉名爲 netname 的網路
© ISL 2000 18
14.3.4 輸出 Kohonen 網路
建立三個文件 封裝頭文件 封裝程式文件 網路定義文件 (*.san)
封裝程式利用在 koh_net.c 中的函數。這些函數使用網路定義檔複製網路。
Kohonen 網路的輸出檔案名採用 Kohonen 網路的名稱。例如,一個名叫 Cluster_Drug 的網路,其三個文件分別名爲: Cluster_Drug.h , Cluster_Drug.c ,和 Cluster_Drug.san 。
© ISL 2000 19
Kohonen 網路封裝頭文件
輸出的 Kohonen 網路封裝頭文件包含兩個結構( structs )和兩個函數,使用名字來源於網路名。例如,一個網路名爲 Cluster_Drug ,産生的頭檔包括 Cluster_Drug_inputs, 用於輸入的結構 Cluster_Drug_outputs, 用於輸出的結構 處理輸入和輸出的兩個函數
void kohonen_Cluster_Drug_CLEARSETS () --- 清除輸入的資料
struct Cluster_Drug_outputs *kohonen_Cluster_Drug( struct Cluster_Drug_inputs *ins, struct Cluster_Drug_outputs *outs )---- 利用輸入結構輸入,和以輸出結構返回網路中的結果
© ISL 2000 20
Kohonen 網路封裝程式
原始檔案包含由相應的頭檔定義的兩個函數代碼。這些代碼包含著對 koh_net.c 的函數的調用
輸出結構包含整數型欄位,從 dimension1 到 dimensionN 依次命名, N 代表輸出圖的維數。
Kohonen 網路輸出的其他文件( Other Files for Kohonen Net Export ) 爲了使用網路,使用者必須在編譯過程中包含其他的附加 檔。這些檔在 Clementine 安裝的 LIB/sann 子目錄中,並且被
命名爲 kohprop.h, kohprop.c, koh_net.h, 和 koh_net.c 。
© ISL 2000 21
koh_net.c 檔提供五個函數 int kohonen_init(char *filename) 打開在被命名的檔中定義的 Kohonen 網路 ( 通常是 *.san 文件 ) int kohonen_set(char *netname, char *varnam, ...)
在網路中 netname 中設置變數 varnam 爲第三個參數,它的類型決定於被設置的變數 int kohonen_propagate(char *netname)
將輸入中的值通過網路 netname 向前傳播至輸出 int kohonen_result( char *netname, char *varname, int *results )
在 netname 網路中,將輸出變數 varname 中的結果,輸出至整型陣列results int kohonen_close(char *netname) 關閉名爲 netname 的網路
© ISL 2000 22
14.3.5 輸出 K-Mean 模型 輸出 K-Means 模型創建三個檔
封裝頭文件 封裝程式文件 中心定義文件 (*.sak)
封裝程式使用在 genkm.c 中的函數。在 genkm.c 中的一個函數自動的讀取 *.sak 檔,其中包含以下的資訊 (N 個類 M 個輸入 )
群的數目( Number of clusters ) 輸入的數目( Number of inputs ) 對群 1從 1 輸入到 M ( Cluster 1 coordinates for inputs 1 through M ) 對群 2從 1 輸入到 M ( Cluster 2 coordinates for inputs 1 through M ) 對群 N從 1 輸入到 M ( Cluster N coordinates for inputs 1 through M )
K-Means 模型輸出檔的命名基於模型模型名。例如,一個名叫 Drug 的模型,三個檔將命名爲: KM_Drug.h , KM_Drug.c ,和 KM_Drug.sak
© ISL 2000 23
K-Means 模型封裝頭檔
頭檔定義常數用來表示符號欄位值。這些常數的名字經常有下面的形式: FIELD_VALUE
Ex: 如果欄位 BP 有值 high ,將被表現爲 BP_high 另外,頭檔定義了一個 struct 代表一個例子。這個 struc
t 的名字爲 exNAME ,與模型中的 NAME 相對應。 Struct 中整數型欄位處理爲 int ,實數型欄位爲 double
© ISL 2000 24
K-Means 模型封裝程式
包含著兩個函數的代碼,包含著對 genkm.c 中函數的調用 void encode_Drug ( struct kmDrug example, double *ex ) 使用在 0 和 1 值對例子進行編碼,將結果存入雙精度型的陣列 int calc_Drug( struct kmDrug example, struct Kmeans km,double *d
istance) 使用例子和中心陣列(包含在結構 Kmeans 中)來計算每個例子和中心之間的距離,返回最小距離和相應的集群數
© ISL 2000 25
K-Means 模型輸出的其他檔( Other Files for K-Means Model Export )
爲了使用輸出模型,在編譯中,使用者必須包含檔 kmgen.h 和 kmgen.c , kmgen.h 檔提供 struct Kmeans 的定義,包含 nb_centers ,類的數目 nb_inputs ,輸入到模型的數目 centers ,集群的中心值
其他文件, kmgen.c ,提供兩個函數 void km_init( char* name, struct Kmeans *km ) 打開 name ( .sak 文件 ) 文件並且填充 struct Kmeans void km_close(struct Kmeans *km) 關閉模型
© ISL 2000 26
14.3.6 欄位名
在輸出模型代碼中將使用模型中的欄位元名。但是,爲了産生有效的 C 代碼,一些名字可能做如下修改 以數位元開頭的集合欄位元名,例如 12_inch, 添加下線字首, _12_inch.
欄位元名中,非文字和數位元的字元變成下劃線。例如, Barcelona->Diagonal 變爲 Barcelona__Diagonal
© ISL 2000 27
14.3.7 模型輸出的錯誤代碼 0: OK (成功) 1: FILE NOT FOUND (文件未找到) 2: INVALID NETWORK NAME (無效的網路名) 3: NOT ENOUGH AVAILABLE MEMORY (記憶體不足) 4: NO SUCH VARIABLE IN THE NETWORK (網路中無此變
數) 5: WRONG DIRECTION FOR VARIABLE (變數方向錯) 6: INPUT VARIABLE ASSIGNMENT INCORRECT (輸入變數賦
值不正確) 7: UNKNOWN GENERIC TYPE (PROBABLY A FILE FAULT)
(未知類型(可能是檔錯)) 8: NETWORK ALREADY IN MEMORY (網路已在記憶體中) 9: NO MORE RESULTS AVAILABLE FROM AN OUTPUT SET
(在輸出集中無更多的可用的結果)