讀了張樂的原始碼,總結如下幾點
1,EventSpace對象是一個Event集合,可以是訓練集也可以是測試集或者驗證集。
2,Event對象就是一個範例具體形式為<outcome,vector<observation>>,每個observation是一個pair<predicate,weight>,總得來說Event對象用來標示訓練資料檔案中的一行。
3,Maxent對象至少有一個訓練集EventSpace對象和一個可選驗證集Eventspace對象,一個參數集合集合lamda。為了尋找方便,MaxentObject Storage Service了兩個map用來將用字串表示的predicate和output映射為整數,並用param字典來影射一個給定的<predicate,outcome>對應的參數,param的結構為predicateId->pair<outputId,lamda_index>。
4,關於param的構造有兩個方法build_params,演算法相同資料結構不同而已。需要說明的是對每一個predicate它並非為每一個output都配置一個參數,而是只為那些曾經在training data裡面出現過的<predict,output>對配置參數。說一下這兩種情況的區別。
設想有一個predicate集合<p1,p2...pn>還有一個output集合<o1,o2...om>。
1)
對一個具體的predicate為每一個output配置參數,形成的feature集合如下
f<p1,o1>=w1,f<p1,o2>=w1...f<p1,om>=w1
f<p2,o1>=w2,f<p2,o2>=w2...f<p2,om>=w2
...
f<pn,o1>=wn,f<pn,o2>=wn...f<pn,om>=wn
總共有m*n個feature,也就需要有m*n個參數,如果給定一個Event表示為<?,{p1:w1,p2:w2,p3:w3}>,欲求其output。<o1,{p1:w1,p2:w2,p3:w3}>...<om,{p1:w1,p2:w2,p3:w3}>用這m個完整的Event代入模型計算得到m個機率,選擇機率最大的那個作為最終的預測結果即可。發現為不完整的Event指定一個具體的output之後,feature集合中只有一列會被選中,其的feature在計算過程中都不會被啟用。
2)
由於訓練資料覆蓋範圍有限,如果有一些<pi,oj>組合沒有出現,則相應的f<pi,oj>不會出現在1)中所列的feature集合裡面,從而不會為之準備對應的參數。