Skip to content

Latest commit

 

History

History
 
 

nonparametric

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
nonparameteric: ノンパラメトリックベイズ

=======================================

statistics.lisp
ノンパラベイズ用の統計&行列ユーリティティ
(主に行列計算のために)hjs.util.*を使っている

todo: 確率系関数をstatistics/statistics.lispとマージ
      重複しているいくつかの乱数はこちらの方が高速にスケールするアルゴリズムとなっている

=======================================

dpm.lisp
Dirichlet Process Mixture(DPM): クラスタ数(k)を推定しながら与えられた事前分布から生成されたクラスタへのボトムアップクラスタリングを行う
Chinese Restaurant Process(CRP)を用いる他のノンパラベイズ手法にライブラリとして提供される

todo: cluster-validationを使えるように結果を整形する?

class:
- cluster
-- gaussian-cluster
  クラスタパラメタやそのサンプルに必要な計算の途中経過を保持する目的のクラス

- dpm
-- gaussian-cluster
    data:  pointのvector

- dp-distribution
-- dp-gaussian
  DPM用の分布定義クラス

struct:
- point
  任意のデータ型とそのクラスタ割り当ての組

methods:
- (initialize dpm)
  初期解をサンプルする
  戻り値は更新されたhyper-parameter

- (sampling dpm)
  sliced Gibbs samplingによって解を更新する
  戻り値は更新されたhyper-parameter

- (make-cluster-result dpm)
  クラスタリング結果を入力データのベクトルで返す

Accessor:

- (dpm-clusters dpm)
  現在のクラスタリング結果を返す
  現状では割り当てゼロのクラスタも見えてしまう

- (dpm-k dpm)
  割り当てのあるクラスタ数の合計kを返す

- (dpm-hyper dpm)
  hyper-parameter

- (dpm-base dpm)
  DPMが仮定している「事前分布」

- (dpm-data dpm)
  クラスタリング対象 pointのベクトル

- (estimate-base? dpm)
  DPMが事前分布のパラメタをサンプルから推測するべきか(defaultはnil)
  tにセットすると学習がうまくいかなくなる恐れもある

- (cluster-size cluster)

- (point-data point)
- (point-cluster point)

 読んで字の如し


自分で事前分布を定義するには、独自のdp-distributionのサブクラス、必要であればclusterのサブクラスを定義した上で、その元で

- density-to-cluster
- add-to-cluster
- remove-from-cluster
- make-new-cluster
- base-distribution
- sample-cluster-parameters
- sample-distribution (optional)

などのメソッドを定義する必要がある。
作った事前分布のinstanceを(dpm-base dpm)にセットするか、defaultがそうであるようなdpmのサブクラスを定義して完成

- density-to-cluster (cluster data &rest other-data &key &allow-other-keys)
  clusterにデータが所属する確率を返すメソッド
  other-dataは条件付き確率を計算したい場合に使う
  後述のbase-distributionと合わせて、スケールがあっているなら必ずしも和が1である必要は無い
  (むしろ直截的に事後確率を用いれば和は1にはならないが、これを利用して計算をサボれる場合がある)
  todo: 引数にdistributionを取る必要がありそうか?

- add-to-cluster (cluster data &rest other-data &key &allow-other-keys)
  clusterにデータを追加するメソッド
  dataはpoint構造体ではなく、生のデータ(point-data data)である(下記すべて同じ)
  defaultメソッドはsizeをインクリメントするだけ
  クラスタ重心を求めるために全データの合計を計算するなどのステップはここに入れてしまうとよい

- remove-from-cluster (cluster data &rest other-data &key &allow-other-keys)
  clusterからデータを削除するメソッド
  defaultメソッドはsizeをデクリメントするだけ
  通常はadd-to-clusterと対称に定義するべき

- make-new-cluster (distribution data &optional discarded-cluster)
  事前分布と新規客の元で、新しいクラスタをサンプルするメソッド
  discarded-clusterは着席ゼロの空クラスタが渡されるか、もしくはnilである(ゴミ抑制)

- base-distribution (dpm distribution data &rest args &key &allow-other-keys)
  事前分布とあるデータに対して、既存のクラスタではなくて新しいクラスタに割り当てられる確率を返すメソッド
  \int f(x|\theta)G(\theta)d\theta に対するx=dataの値

- sample-cluster-parameters (cluster distribution dpm)
  現在のクラスタ割り当てと事前分布からクラスタに存在するパラメタを再サンプリングするメソッド
  クラスタ割り当て結果が必要な場合にはclusterに保持するとよい
  データ点全体の分布が必要な可能性があるので、引数にdpmを取るが、単純な例では必要ない

- sample-distribution (dpm distribution)
  現在のデータ点、およびクラスタパラメタの分布から事前分布のパラメタをサンプルするメソッド
  事前分布に関する情報が不完全な場合には、得られたMCMCサンプルから事前分布のパラメタもサンプルする方がよい場合もある
  しかし基本的には人間が事前知識を入力する方が望ましい
  estimate-base?をtにセットしないなら定義する必要はない

========================================

multi-dpm.lisp
多変量混合正規分布に対するDPM
DPMに対する事前分布の定義の仕方の例

実行例:

DPM(128): (setf data (make-multivar-gauss-dataset 3 4 200)) ;; 人工データ生成用関数
distributions                                               ;; 作成した分布のリストを印字する
(#(3.0227228181608674 -4.917328883250097 9.416279840427581) ;; 平均ベクトル
 #2A((0.6149354366098384 0.0 0.0)                           ;; 分散
     (-0.4055310942489165 1.1814636317087717 0.0)
     (0.39123857033292375 0.656671363189244 1.6453273683222376))
 61)                                                        ;; データの数
(#(4.725178282295572 -10.80592572131948 10.935760522066051)
 #2A((1.6794388919977667 0.0 0.0)
     (0.10077996946225677 2.8513112342592026 0.0)
     (0.01318929234028677 -1.5334430908070291 3.911133356965887))
 55)
(#(-12.750888916648064 2.9784339490902108 2.2432568569974394)
 #2A((1.8236861940336782 0.0 0.0)
     (1.26978464750881 2.074938458977714 0.0)
     (-0.5586229203010648 0.2864853832500676 0.513250979823732))
 43)
(#(3.706127055835794 -2.100318468340544 -5.936122188279907)
 #2A((1.1387192901988026 0.0 0.0)
     (-0.8338853318826855 1.4984944510243 -1.1102230246251565e-16)
     (0.15422119671257709 1.755283189530601 0.6445149218041165))
 41)
;; 上の分布から得られたランダムなデータ列
#(#S(POINT :DATA #(3.774485958242961 -10.237199724529862 10.79342433539454) :CLUSTER NIL)
  #S(POINT :DATA #(7.969900415944767 2.0638137822323888 -8.574501407746817) :CLUSTER NIL)
  #S(POINT :DATA #(4.138140190077053 -11.044781799519692 10.894942699510448) :CLUSTER NIL)
  #S(POINT :DATA #(-11.390991006937876 2.352468388156428 4.752483799387133) :CLUSTER NIL)
  #S(POINT :DATA #(1.0505170887995634 -4.895694882479956 -3.5828556362300024) :CLUSTER NIL)
  #S(POINT :DATA #(4.793301447804544 -4.241785499366994 10.085430501196928) :CLUSTER NIL)
  #S(POINT :DATA #(4.492124617269321 -10.835153936892327 10.690929797020202) :CLUSTER NIL)
  #S(POINT :DATA #(1.7952202606807408 -4.144550190592244 9.615672379598411) :CLUSTER NIL)
  #S(POINT :DATA #(3.380615067547286 -2.638131867036481 -6.454694304762895) :CLUSTER NIL)
  #S(POINT :DATA #(-0.13180219410625105 -5.074561211442568 10.582243664171607) :CLUSTER NIL) ...)
DPM(179): (setf m (make-instance 'multivar-gauss-dpm :data data :dim 3))
#<MULTIVAR-GAUSS-DPM @ #x1003a25912>
DPM(180): (initialize m)
13.303837839977257
DPM(181): (time (bench m)) ;; 50回のサンプリング後に現在の状態を印字するループを5回回す
; While compiling (:INTERNAL (:ANONYMOUS-LAMBDA 87) 0):
Warning: Free reference to undeclared variable M assumed special.
---------- iteration 1 ----------
0:
 #<size: 58
 ave: #(2.927175216693459 -4.846338033224291 9.372464414573544)
 std: #2A((0.6976461313410682 0.0 0.0)
          (-0.08930776419439851 1.0480008891842754 0.0)
          (0.588940897301858 0.5899858608031886 1.4216948269886558))>
1:
 #<size: 55
 ave: #(4.732399640682938 -10.873523996372105 10.914769284974337)
 std: #2A((1.547503724624603 0.0 0.0)
          (-0.1097597986394086 3.322611243972814 0.0)
          (0.3406420972373237 -2.6330490450676383 4.11058979065462))>
2:
 #<size: 40
 ave: #(-12.490480051959969 2.949746546416199 2.6247548519158133)
 std: #2A((1.7404103077909476 0.0 0.0)
          (1.4259513030215993 2.18495039535426 0.0)
          (-0.6225890647922969 0.17772685591186194 0.40685610316602205))>
3:
 #<size: 23
 ave: #(4.296988793983612 -1.5894232076272998 -6.459805813434724)
 std: #2A((1.1208661554054586 0.0 0.0)
          (-0.821776357188609 2.014179347709142 0.0)
          (0.008628758127304521 2.3890564597279313 0.72050609086323))>
4:
 #<size: 6
 ave: #(3.4358108912056053 -2.8448623968955693 -5.165353635451156)
 std: #2A((2.971596050986194 0.0 0.0)
          (2.99008187866468 0.6235136724562264 0.0)
          (2.391225089915498 0.675428781062474 0.9421551364116058))>
5:
 #<size: 5
 ave: #(-0.4513647324971928 -6.391492366210508 -2.292455705810453)
 std: #2A((1.43527226343607 0.0 0.0)
          (-2.641563630102838 1.6727404120994602 0.0)
          (0.33934554407951123 2.1928082108878892 1.0764248574171718))>
6:
 #<size: 3
 ave: #(1.0034301894984483 -5.085339667836983 -3.330031890325851)
 std: #2A((3.2110462030178297 0.0 0.0)
          (-2.9163343463569853 2.2515586838086175 0.0)
          (0.6918864984753642 3.104504271126779 0.8884490791378827))>
7:
 #<size: 2
 ave: #(0.41893594239215315 -5.399690497228074 -3.1880772959963566)
 std: #2A((5.67278702826423 0.0 0.0)
          (-7.6894867320249505 2.7862114540806484 0.0)
          (-3.142478203436282 2.5856170048595812 0.690369311980487))>
8:
 #<size: 2
 ave: #(4.446019307102985 1.143722868803642 -3.7303434596422234)
 std: #2A((0.7554112250919517 0.0 0.0)
          (0.21641014430376873 0.9894094631123735 0.0)
          (-0.2868437790614707 0.7761570881896019 0.23888263504264032))>
9:
 #<size: 2
 ave: #(1.744335794578009 -7.325473363459821 10.345797113840007)
 std: #2A((2.301450914896525 0.0 0.0)
          (1.5072182101739973 0.5758809098775008 0.0)
          (0.8474592693513199 0.1905266656569395 0.7217452287025308))>

---------- iteration 2 ----------
0:
 #<size: 61
 ave: #(2.8069676457707793 -4.942451267565749 9.512528548611881)
 std: #2A((0.6799038400369993 0.0 0.0)
          (-0.40444857239877 1.1679362196076075 0.0)
          (0.40236064539042604 0.6552619132187644 1.384538255002976))>
1:
 #<size: 55
 ave: #(4.627570603871044 -10.758847539443064 10.987401543690158)
 std: #2A((1.8976322689144043 0.0 0.0)
          (0.5424146707856068 3.7452200275288616 0.0)
          (-0.43909417691543023 -1.3136461786448672 4.0712577217836))>
2:
 #<size: 40
 ave: #(-12.662360167739097 3.140428740406515 2.6591768840908143)
 std: #2A((1.7305310638280822 0.0 0.0)
          (1.937022653476898 1.8616300697326469 0.0)
          (-0.5151964991296756 0.21224076226555388 0.38817659242052754))>
3:
 #<size: 28
 ave: #(3.653125072232231 -1.9515764056098193 -5.903537689044709)
 std: #2A((1.1151617556151736 0.0 0.0)
          (-0.6392129447096362 1.7026883413996612 0.0)
          (-0.030834646488631073 1.741199258817217 0.6300100695389105))>
4:
 #<size: 3
 ave: #(1.1606708442642515 -2.1746006081025095 -2.9196733052496864)
 std: #2A((1.9989818293306156 0.0 0.0)
          (0.8988751053200703 1.3749888422191847 0.0)
          (-0.19445615911290143 -0.49249121417460423 0.5496154174487236))>
5:
 #<size: 3
 ave: #(0.03161005359511471 -3.792702923198943 -2.095354083244233)
 std: #2A((1.3426485722996682 0.0 0.0)
          (0.5923353404445896 0.838655048763351 0.0)
          (1.0635970698812685 0.3964052948822824 0.3791505462151047))>
6:
 #<size: 1
 ave: #(1.348920186647181 -4.623310375775923 -3.969615297803295)
 std: #2A((5.3682663028031286 0.0 0.0)
          (-4.754291682242515 4.9774230665772325 0.0)
          (0.9929242871292591 7.264166195534891 0.5689067096383374))>
7:
 #<size: 1
 ave: #(3.9376321931818024 -0.011855704787635535 -3.3531719635718833)
 std: #2A((1.5365838747680391 0.0 0.0)
          (-0.4062840229838975 0.898778363829382 0.0)
          (-0.37277701671464936 -0.21374268553867856 0.9770554778017979))>
8:
 #<size: 1
 ave: #(0.015234369193675323 -4.023344212622708 -0.7009045462957213)
 std: #2A((1.091490854883612 0.0 0.0)
          (0.4368016964350129 1.270459905309591 0.0)
          (0.17503019667099795 0.7450348942986575 0.44615356161913916))>
9:
 #<size: 1
 ave: #(-6.533570745919246 0.29180235730027926 -0.6386960341817608)
 std: #2A((1.5418293577759248 0.0 0.0)
          (0.5189984692264599 1.0235381517651103 0.0)
          (-0.4077448561915826 -0.6284787474836747 1.0672864342039536))>

---------- iteration 3 ----------
0:
 #<size: 61
 ave: #(2.5097125632892836 -5.291741497832986 9.498809917234665)
 std: #2A((0.5411140518760066 0.0 0.0)
          (-0.36802848299336105 1.0317747403435378 0.0)
          (0.36385618896617833 0.6248554673055129 1.1271977542069336))>
1:
 #<size: 55
 ave: #(4.763751577143368 -10.719943140826631 10.978814891747739)
 std: #2A((2.046111424308298 0.0 0.0)
          (0.20043508360623385 3.632567468239127 0.0)
          (0.903543862203009 -1.5535051461195748 3.7379276477205003))>
2:
 #<size: 43
 ave: #(-12.918686348812814 3.0652096087178986 2.0123801176515306)
 std: #2A((1.5969821847124224 0.0 0.0)
          (1.9435922489689714 2.0843249795196273 0.0)
          (-0.479766130113108 0.21063788017107146 0.449176752593068))>
3:
 #<size: 34
 ave: #(3.077347661016097 -2.606910019735932 -5.624127453466127)
 std: #2A((1.04870266591221 0.0 0.0)
          (-1.3834672031726198 1.742183003796471 0.0)
          (-0.6285767145495247 1.667946748656608 0.633102715722574))>
4:
 #<size: 5
 ave: #(0.7859632764612294 -5.466241760115667 -3.5690975618424807)
 std: #2A((2.280148594034162 0.0 0.0)
          (-1.2861622900571033 2.5947223043251757 0.0)
          (0.2620340401231253 2.035078886956046 1.6060393252745941))>
5:
 #<size: 1
 ave: #(4.339814977740541 0.9040311920161834 -3.802637222638452)
 std: #2A((1.3215627583281466 0.0 0.0)
          (0.455161781442808 0.5595770487678385 0.0)
          (-0.3420897484465336 -0.05069328847789344 0.796814007648923))>
6:
 #<size: 1
 ave: #(3.8987749205860007 0.5066169984636779 -2.808698511732912)
 std: #2A((0.8224163188330691 0.0 0.0)
          (0.2795938798948154 1.6314200452124068 0.0)
          (-0.18571885683120082 0.4886647129861812 0.5656240050271633))>
7:
 #<size: 0
 ave: #(-5.446072219664096 0.4646337166114336 2.235052000138044)
 std: #2A((1.1637049172868104 0.0 0.0)
          (0.18990724546266577 1.043639337426633 0.0)
          (0.4817629147795495 -0.35455894505533386 0.35026423607301477))>
8:
 #<size: 0
 ave: #(3.306418211625072 -3.013710665743015 -5.23985889020107)
 std: #2A((1.873169594874314 0.0 0.0)
          (-1.2382008061127414 2.062795557190719 0.0)
          (0.8276950766672347 2.5778583221868097 0.824809776330044))>
9:
 #<size: 0
 ave: #(2.278517597481957 0.08409290340986808 -2.5791591668763263)
 std: #2A((0.71702697483601 0.0 0.0)
          (-0.047064641966757234 1.4651513859784986 0.0)
          (0.24340368507424803 -0.22294575610795062 0.49565870876549945))>

---------- iteration 4 ----------
0:
 #<size: 61
 ave: #(2.4828425826092313 -4.92890727148019 9.427873678109767)
 std: #2A((0.6097810269637248 0.0 0.0)
          (-0.35610449860921695 0.9780816042038336 0.0)
          (0.4228667948828795 0.5911619856689561 1.528804150997672))>
1:
 #<size: 55
 ave: #(4.854148372513157 -10.742942106189865 10.970786309253226)
 std: #2A((1.6859348698841365 0.0 0.0)
          (-1.342041885373115 3.999346017012868 0.0)
          (1.2916162069428707 -2.0651591555442987 4.110448955846518))>
2:
 #<size: 42
 ave: #(-12.986199989412432 3.1278997054574313 1.915325691312002)
 std: #2A((1.764385199340075 0.0 0.0)
          (1.9842071227384714 2.436568532152146 0.0)
          (-0.4438355481802078 0.23890665670147898 0.38612303726843816))>
3:
 #<size: 33
 ave: #(4.239500836173111 -1.7523117038055183 -6.329168160595539)
 std: #2A((0.9813093554656801 0.0 0.0)
          (-1.0928237778558418 1.2544176642142835 0.0)
          (-0.5039803152015857 1.3693810995205458 0.6444713986125342))>
4:
 #<size: 4
 ave: #(0.27418047898082953 -5.57314972250134 -2.9125553045205725)
 std: #2A((4.346262536846539 0.0 0.0)
          (-1.9468342722390304 3.9830605487034987 0.0)
          (1.460254311129598 3.4422406868617217 1.6539971513080065))>
5:
 #<size: 3
 ave: #(1.9498946121429213 -3.6286175508176015 -4.5552549551748305)
 std: #2A((4.083883248527007 0.0 0.0)
          (-2.037659804708729 1.8951425217612128 0.0)
          (1.9568393874225325 2.7024612670327777 0.645747404795075))>
6:
 #<size: 1
 ave: #(-0.5619418957685309 -3.834290836510284 -0.2717122069053709)
 std: #2A((0.8996071936021539 0.0 0.0)
          (-0.5390163706495277 0.4726829786356856 0.0)
          (0.11965520465420415 0.7339110130410332 0.8917265397166774))>
7:
 #<size: 1
 ave: #(-4.215484934002681 2.5229863325600803 1.2119453465860446)
 std: #2A((1.5243030335176517 0.0 0.0)
          (-0.7243290671359278 0.45622839520097 0.0)
          (-0.3153071733951639 0.39968587585734205 1.275269681537959))>
8:
 #<size: 0
 ave: #(0.2815886503953172 -3.8676202722828004 -0.4978001680451093)
 std: #2A((0.8211466872346592 0.0 0.0)
          (0.017360251670413003 0.33905705331625 0.0)
          (0.3242917921606121 0.4450200925426773 0.08241750694008637))>
9:
 #<size: 0
 ave: #(4.0652723644354145 0.13662564352278272 -3.9585615306646265)
 std: #2A((1.4439147642784866 0.0 0.0)
          (0.10777104032621353 0.7764016473714035 0.0)
          (-0.4752170187041059 -0.4284109898229721 0.6360579626925299))>

---------- iteration 5 ----------
0:
 #<size: 61
 ave: #(2.8389494105390347 -4.847297277243273 9.449730517683742)
 std: #2A((0.7338414185028997 0.0 0.0)
          (-0.22663066295009468 1.0912295961011884 0.0)
          (0.4350865305606222 0.7784648620249829 1.1351873763467162))>
1:
 #<size: 55
 ave: #(4.832141218234674 -10.729679314056742 10.95703758791401)
 std: #2A((1.5135098695308806 0.0 0.0)
          (-0.3278868323282931 3.3439134501606333 0.0)
          (0.3892161360349809 -0.7996195071882126 3.821915713387091))>
2:
 #<size: 42
 ave: #(-13.018193397100104 3.1377153452573947 1.754553157044611)
 std: #2A((1.7320434023168374 0.0 0.0)
          (1.817833708039712 1.9728925311897771 0.0)
          (-0.5872114464718041 0.1765474573821052 0.5554686339321179))>
3:
 #<size: 19
 ave: #(3.8869659653433524 -1.8130105563013674 -6.115404170093998)
 std: #2A((1.2727935041129552 0.0 0.0)
          (0.2121701490094205 1.7667883953625454 0.0)
          (0.39024121211934826 0.9255893082499055 1.1340772957831695))>
4:
 #<size: 9
 ave: #(2.0891122887721423 -4.286089167117592 -4.181378343344008)
 std: #2A((1.2234257004280005 0.0 0.0)
          (0.8126831105876011 3.770124644158256 0.0)
          (-0.16095803539573883 3.355381122405471 1.6265434764655375))>
5:
 #<size: 3
 ave: #(0.5623597330105898 -5.258067550663203 -3.4228310177505143)
 std: #2A((4.746711548715865 0.0 0.0)
          (0.051149480910345976 6.110965690870317 0.0)
          (1.7219389426928786 4.154449469768805 1.122266016458616))>
6:
 #<size: 3
 ave: #(0.8956775118811646 -1.4201650209349728 -1.6122538269908047)
 std: #2A((1.493788623366322 0.0 0.0)
          (-1.0842073850408864 0.5212017129303019 0.0)
          (-0.0603674264384702 -0.011539750998482421 0.4925660868410117))>
7:
 #<size: 3
 ave: #(5.083108995741341 0.8389967015934188 -3.6196109709273347)
 std: #2A((0.7952092465301981 0.0 0.0)
          (-0.9765566485358852 0.6314489770374453 0.0)
          (0.522986213867192 0.03536102846262183 0.8158863972930634))>
8:
 #<size: 3
 ave: #(5.229121525838935 -1.2777985422290163 -6.371216946124767)
 std: #2A((2.9394585926746832 0.0 0.0)
          (-0.7962469428473649 0.3415891910957655 0.0)
          (1.4124306225879892 0.6782299557074762 0.9371629428713526))>
9:
 #<size: 1
 ave: #(-6.883331817688198 1.4950709172012338 3.3741067241587666)
 std: #2A((0.7051887265707968 0.0 0.0)
          (0.14539966262541817 1.2481210478667843 0.0)
          (-0.31211910402732584 0.2711811196946303 1.2076541299769292))>

; cpu time (non-gc) 1.930000 sec user, 0.000000 sec system
; cpu time (gc)     1.480000 sec user, 0.000000 sec system
; cpu time (total)  3.410000 sec user, 0.000000 sec system
; real time  3.406327 sec
; space allocation:
;  4,353,779 cons cells, 526,686,512 other bytes, 0 static bytes
NIL
DPM(182): (dpm-hyper m)
2.343955996656361
DPM(183): (make-cluster-result m)
#(#(#(3.9823169099353253 -5.7538341155936195 9.533561089197962)
    #(5.115651920711911 -4.88264142063046 9.122139238338159)
    #(1.8776834245347507 -6.433568516594285 10.309460581627109)
    #(3.5962489689683084 -4.637103542285794 9.532627083501511)
    #(1.3400221559910137 -5.120247183311154 8.741750536406178)
    #(4.102951740725052 -5.03882892508714 9.584405072336567)
    #(1.4065757173228888 -7.10700132763071 10.558959618467927)
    #(5.6100812402325335 -4.251787062174653 9.8578925415673)
    #(1.6616682467100166 -4.391931453737993 10.059900574337714)
    #(2.826214165794492 -4.549044606522388 9.412875645301698) ...)
  #(#(4.569534672126397 -10.99770588007982 10.963515411778348)
    #(4.446225550085373 -10.627826669753874 11.209657324492937)
    #(5.059401983449978 -10.875220705854394 11.097027547127139)
    #(3.774485958242961 -10.237199724529862 10.79342433539454)
    #(4.805620159453174 -10.781424097277288 11.341697409559604)
    #(4.492124617269321 -10.835153936892327 10.690929797020202)
    #(5.066830269657376 -10.83840176135832 10.627420248371244)
    #(4.828668092030972 -10.61614405126655 11.290629268822814)
    #(5.091464774953241 -11.192689412544237 10.932270927572107)
    #(4.7100255242843305 -10.641389270998047 10.65560545598822) ...)
  #(#(-14.270841906056676 3.3791097630208267 2.5107616155787182)
    #(-14.125488825924549 3.5242427620186447 -0.7217144548380698)
    #(-14.26795451978224 3.316809855710163 -1.1928446471102845)
    #(-11.681657831788186 3.0631516771560694 3.8662436706183088)
    #(-13.379349530383099 2.8185233020395652 1.7508885911619503)
    #(-12.844954470503376 2.698838177730742 1.4803285815966345)
    #(-11.349353833583601 2.5171214604387964 3.222134775923579)
    #(-13.521944292410254 2.5820067742123953 1.326359835873558)
    #(-12.52938400148098 3.253060088686058 1.6547957934325) #(-10.96477091823868 2.948306749559725 6.07268720276314)
    ...)
  #(#(4.035736076276529 -2.785943240870092 -5.561292237361581)
    #(5.525263004657802 -0.7932348203208375 -7.402114421641164)
    #(4.208814838416864 -2.257533315154677 -5.484791402964806)
    #(3.993777930194894 -1.7698047546734597 -7.043994496920872)
    #(2.6625531551899764 -2.50031272444097 -5.2359242214135735)
    #(3.1612568006436055 -0.7121410527396044 -6.158077430120189)
    #(3.448651702356854 -1.432867680128318 -6.377380648568867)
    #(3.258527666960709 -2.9969096586814423 -4.850104473299948)
    #(2.4539480572499683 -2.5474273338692672 -4.539388633150054)
    #(4.317989899272528 -0.640867782623791 -7.321263913551618) ...)
  #(#(1.12207771303666 -4.691118103798798 -3.830757992107001)
    #(2.529954551285324 -4.157809175459205 -3.863175766611737)
    #(1.8641471829555067 -3.647419630390355 -4.774547477725869)
    #(1.5174351989759236 -3.061963170216118 -5.377208595762013)
    #(3.4083304010130924 -4.8351350042145675 -3.861630938964044)
    #(1.0505170887995634 -4.895694882479956 -3.5828556362300024)
    #(2.802912795060661 -4.987111199235921 -3.0854817817179705)
    #(1.3735923062069961 -4.125456973017023 -4.362775565106839)
    #(1.7987815622391872 -4.217078197586187 -5.0076417981930055))
  #(#(0.35230830640898514 -5.71983718318557 -2.5173806136127896)
    #(0.36303962647870236 -5.155839967916859 -3.6002446291731744)
    #(1.0361230585246095 -5.47157299728093 -3.6970440283426176))
  #(#(-0.5591565012796771 -6.539237663213181 -2.5448159314421495)
    #(0.21301664228906336 -6.05830454759155 -2.270224218174471)
    #(-0.8675911178880398 -6.366410127153614 -2.314992343081113))
  #(#(7.319176827407145 1.4086197926096182 -7.596042392086137)
    #(5.725483006553445 -0.7008901859272663 -6.623625676629864)
    #(6.334199278394568 0.5019862035471325 -7.317804977024041))
  #(#(4.669415782342794 -0.9852399194597998 -6.258813500170089)
    #(5.313765231930116 1.2602496804129917 -8.822966973690836)
    #(5.431431720772352 -0.8757367528990956 -7.06611786833505))
  #(#(-10.600144721004565 2.367613612996009 5.6164543818718595)) ...)
DPM(184): 

備考:
毎回のクラスタリング結果は確率的で単一の正解とは言えないが、概ね4つの大きなクラスタが抽出されたことはMCMC列の平均を取ることで分かる
細かい結果を見ると、確かに分割されてしまっている小クラスタは別の固まりとみなせそうなものが得られていることも見て取れる
ここで表示されているstdは分散共分散行列の逆行列のコレスキー分解(1変数でいえば、標準偏差の逆数)にあたる

参考文献:
R. M. Neal, “Markov chain sampling methods for Dirichlet process mixture models,” University of Toronto, Toronto, ON, Canada, Tech. Rep. 9815, Sep. 1998

一変数正規分布で等分散を仮定した場合の丁寧なチュートリアル:
http://biocomp.bioen.uiuc.edu/journal_club_web/dirichlet.pdf

========================================

hdp-lda.lisp
HDP-LDA: topic数(k)を推定しながらトピック推定を行い文書-単語モデルを次元圧縮する

class:
- document
  initargs:
    id:    識別/印字用。計算には関係ない
    words: stringのvector。一つの文書に複数回現れる単語は複数個入れる。hdp-ldaによって破壊的に変更される(下記wordの項参照)

- hdp-lda
  initargs:
    data:  documentのvector
    k:     optional -- topic数 計算用配列の確保の目安にするだけ。kが可変なのでadjustable-arrayでのallocateになるが、その初期値
           default  -- 0
    alpha: optional -- hyperparameterの初期値。最終的には推定されるが初期解に影響する。大きい程topic数は増える確率が高い
           default  -- (gamma-random *alpha-base-a* *alpha-base-b*)
    gamma: optional -- おおむね同上。alphaとgammaの違いについては参考文献を参照されたい
           default  -- (gamma-random *gamma-base-a* *gamma-base-b*)
    beta:  optional -- 各トピックの事前分布を決めるパラメータ
           default  -- *default-beta*

struct:
- word
  各単語は辞書からword-idを引き、関連付けられたCRF(Chienese Restaurant Franchise)のtableへの参照を持つ構造体へと変換される

methods:
- (initialize hdp-lda)
  単語を数え上げたり配列を確保した後、初期解をサンプルする
  戻り値は更新されたalpha,gamma

- (sampling hdp-lda)
  sliced Gibbs samplingによって解を更新する
  戻り値は更新されたalpha,gamma

- (assign-theta hdp-lda)
  dataとして渡した各documentにthetaを割り当てる
  thetaはトピック毎の混合比(トピックとの関連性・この文書内に生成されるトピックの事前確率)を表す

- (get-phi hdp-lda)
  行列phiを返す
  phiは語彙数V×kの行列であり、各トピックから生成される語の確率を示している

- (revert-word hdp-lda word-id)
  word-id(=行列phiの添字)を元の単語表現に戻す

- (get-top-n-words hdp-lda n)
  各トピックについて特徴的な頻出語上位n件を出力する
  phiをトピック毎にソートしたものを語に戻しただけ

Accessor:

- (topic-count hdp-lda)
  現在のkを返す

- (hdp-lda-data hdp-lda)
  元データ(documentのvector)を返す

- (vocabulary hdp-lda)
  語彙数Vを返す

- (document-id document)
- (document-words document)
- (document-thetas document)

- (word-id word)
 読んで字の如し

下位APIについてはソース参照のこと

実行例:

HDP-LDA(5): (setf nips (with-open-file (in "nips.sexp") (read in)))
#(#("aaa" "abstract" "abu" "abu" "abu" "account" "achieve" "achieved" "acknowledgement" "acm" ...)
  #("ability" "ability" "ability" "able" "abstract" "acad" "according" "acknowledgement" "activity" "activity" ...)
  #("able" "abstract" "accuracy" "accurate" "achieved" "achieved" "achieved" "achieved" "achieved" "achieved" ...)
  #("ability" "ability" "ability" "ability" "ability" "able" "absence" "abstract" "access" "accomplished" ...)
  #("ability" "able" "able" "abstract" "acceptable" "according" "acknowledgment" "adding" "addison" "addition" ...)
  #("accommodate" "accomplish" "acti" "activated" "activation" "activation" "activation" "activation" "activation"
    "activation" ...)
  #("able" "able" "abstract" "academic" "accept" "accept" "accept" "acceptance" "accepted" "accepted" ...)
  #("aaa" "absence" "absence" "achieve" "actually" "addition" "addition" "additional" "additional" "adjust" ...)
  #("abort" "absence" "abstract" "accepted" "accepting" "accomplished" "according" "according" "according" "account"
    ...)
  #("ability" "ability" "abound" "abstract" "according" "according" "according" "accu" "accuracy" "accuracy" ...) ...)
HDP-LDA(6): (defun make-nips-dataset (nips)
	       (let ((id -1))
		 (map 'vector #'(lambda (x)
				  (make-instance 'document :id (incf id) :words (copy-seq x))) nips))) ;; wordsはcopyしておく
MAKE-NIPS-DATASET
HDP-LDA(7): (setf data (make-nips-dataset nips))
#(#<DOCUMENT 0 @ #x100d6356a2> #<DOCUMENT 1 @ #x100d6356d2> #<DOCUMENT 2 @ #x100d635702> #<DOCUMENT 3 @ #x100d635732>
  #<DOCUMENT 4 @ #x100d635762> #<DOCUMENT 5 @ #x100d635792> #<DOCUMENT 6 @ #x100d6357c2> #<DOCUMENT 7 @ #x100d6357f2>
  #<DOCUMENT 8 @ #x100d635822> #<DOCUMENT 9 @ #x100d635852> ...)
HDP-LDA(8): (setf m (make-instance 'hdp-lda :data data))
#<HDP-LDA @ #x10136fb632>
HDP-LDA(9): (time (initialize m))
; While compiling (:INTERNAL (:ANONYMOUS-LAMBDA 0) 0):
Warning: Free reference to undeclared variable M assumed special.
59063568 bytes have been tenured, next gc will be global.
See the documentation for variable EXCL:*GLOBAL-GC-BEHAVIOR* for more information.
87226336 bytes have been tenured, next gc will be global.
See the documentation for variable EXCL:*GLOBAL-GC-BEHAVIOR* for more information.
55039984 bytes have been tenured, next gc will be global.
See the documentation for variable EXCL:*GLOBAL-GC-BEHAVIOR* for more information.
; cpu time (non-gc) 102.840000 sec (00:01:42.840000) user, 0.140000 sec system
; cpu time (gc)     49.570000 sec user, 0.020000 sec system
; cpu time (total)  152.410000 sec (00:02:32.410000) user, 0.160000 sec system
; real time  152.611516 sec (00:02:32.611516)
; space allocation:
;  870,573 cons cells, 82,959,059,408 other bytes, 0 static bytes
150.27874398522025d0
27.410756602369037d0
HDP-LDA(10): (topic-count m)
192
HDP-LDA(11): (time (sampling m))
; While compiling (:INTERNAL (:ANONYMOUS-LAMBDA 1) 0):
Warning: Free reference to undeclared variable M assumed special.
; cpu time (non-gc) 112.670000 sec (00:01:52.670000) user, 0.500000 sec system
; cpu time (gc)     44.310000 sec user, 0.260000 sec system
; cpu time (total)  156.980000 sec (00:02:36.980000) user, 0.760000 sec system
; real time  157.756031 sec (00:02:37.756031)
; space allocation:
;  3,306 cons cells, 91,564,610,016 other bytes, 0 static bytes
367.6535745173031d0
24.501190724062724d0
HDP-LDA(12): (topic-count m)
204
HDP-LDA(13): (get-top-n-words m 10)
#(#("recurrent" "motion" "recognition" "neural" "affine" "euclidean" "mlp" "ica" "cholinergic" "top")
  #("network" "set" "result" "output" "error" "number" "weight" "method" "order" "layer")
  #("model" "unit" "optimal" "task" "probability" "system" "vector" "high" "net" "condition")
  #("noise" "class" "prediction" "separation" "form" "student" "natural" "source" "linear" "tangent")
  #("vector" "point" "function" "unit" "weight" "test" "training" "space" "error" "term")
  #("problem" "word" "local" "temporal" "trained" "rule" "respect" "update" "transition" "active")
  #("feature" "features" "density" "object" "rbf" "size" "search" "hidden" "large" "covariance")
  #("neural" "input" "algorithm" "function" "training" "parameter" "image" "control" "information" "linear")
  #("neuron" "function" "gaussian" "field" "mean" "small" "case" "correlation" "iteration" "energy")
  #("system" "function" "response" "distribution" "images" "vector" "hmm" "order" "sample" "application") ...)
HDP-LDA(14): 

参考文献:
Hierarchical Dirichlet Processes, Yee Whye Teh, Michael I Jordan, Matthew J Beal, David M Blei. Journal of the American Statistical Association. December 1, 2006, 101(476): 1566-1581.

備考:
参考文献内の"Chinese Restaurant Franchise"が実装されている

理論上はDPMを使えば実装できるが、効率のためにそのような実装はしていない

収束性を判断するのは難しいが、k、hyperparameters、および(hdp-lda-topic-occurs hdp-lda)の値が収束するのがもっとも全体の収束に近いと思われる
しかし、毎回サンプリングされるため、収束といっても振動は残ることになる

get-top-n-wordsで単語を得る際、そのトピックに属すと推定された語がn未満の場合、単語のid順に語が埋められてしまう
実際には残りの単語がすべて均等な確率なので、必ずしもバグとは言えないが混乱の元とは言える

========================================

hdp.lisp
Hierachical Dirichlet Process(HDP): 階層Dirichlet過程のライブラリ(DPMの拡張)
Direct Assignment表現を用いることでChinese Restaurant Franchiseより省スペース・高速に動作する(はず)

class:
- hdp-cluster << cluster

- hdp << dpm

- hdp-distribution << dp-distribution

Accessor:

- (hdp-gamma hdp)
  HDPのgamma(上位DPのハイパーパラメータ)を返す
  (dpm-hyper dpm)は下位DPのハイパーパラメータを返す

- (cluster-beta hdp-cluster)
  Dirichlet分布からサンプルされたクラスタの事前分布\beta の現在値を返す

- (hdp-beta hdp)
  Dirichlet分布からサンプルされた新規クラスタの事前分布\beta の現在値を返す

参考文献:
Hierarchical Dirichlet Processes, Yee Whye Teh, Michael I Jordan, Matthew J Beal, David M Blei. Journal of the American Statistical Association. December 1, 2006, 101(476): 1566-1581.

========================================

hdp-hmm.lisp
HDP-HMM (a.k.a. infinite-HMM): 隠れ状態の数kを推定しながら教師なし隠れマルコフモデルを学習する
離散データに対するHMMであり、事前分布は一様分布を仮定している
全体を一つの大きな系列とみなし、各データ点を一つずつサンプルするGibbsを構成する

class:
- hidden-state << hdp-cluster

- hdp-hmm << hdp

- state-uniform << hdp-distribution

methods:
- trans-prob (before after &rest args &key &allow-other-keys)
隠れ状態beforeから隠れ状態afterへ遷移する確率を返す
defaultは多項分布による最尤推定

- emission-prob (state data &rest args &key &allow-other-keys)
隠れ状態stateからdataが生成される確率を返す
defaultは多項分布による最尤推定

- show-hidden-state (hdp-hmm)
与えたデータ列に対して推定された状態列を頻度順idで置換して返す

参考文献:
Hierarchical Dirichlet Processes, Yee Whye Teh, Michael I Jordan, Matthew J Beal, David M Blei. Journal of the American Statistical Association. December 1, 2006, 101(476): 1566-1581.

========================================

gauss-hmm.lisp
データ生成分布に正規分布を仮定した連続データ用HDP-HMM
HDP-HMMの拡張例

gauss-dpmとhdp-hmmを多重継承することでコードを大部分再利用
emission-probとinitializeの書き換えのみ

========================================

sticky-hdp-hmm.lisp
Sticky HDP-HMM: (特に連続データに対する)HDP-HMMが状態数を過剰に生成してまうことを抑制し、sticky-parameterを推定する

class:

- sticky-hdp-hmm << hdp-hmm
- sticky-hidden-state << hidden-state
- sticky-state-unifrom << state-uniform

Accessor:
- sticky-kappa (sticky-hdp-hmm)
  sticky-parameterを返す

HDP-HMMの拡張に対してmix-inとして組み込むことでsticky-parameterを導入できる

詳細は参考文献に譲る

参考文献:
An HDP-HMM for systems with state persistence, Emily B. Fox, Erik B. Sudderth, Michael I. Jordan and Alan S. Willsky. Proceedings of the 25th international conference on Machine learning. 2008, 312-319

========================================

blocked-hdp-hmm.lisp
Blocked HDP-HMM: 系列の前後依存性を考慮し効率的なMCMCを行うため、一つの列を単位としてBlocked Gibbs Samplingを行うHDP-HMM

class

- seq-point << point
  系列内の各点を表す

- point-sequence
  「系列」を表す
  initargs:
  seq: seq-pointのvector

- blocked-hdp-hmm << hdp-hmm
  initargs:
  data: point-sequenceのvector
  L:    現在の状態数の上限(Blocked Gibbsを行うために必要)
  	初期値を与えればあとは必要に合わせて増やすが、極端に小さい値を与えると局所解に落ちやすい傾向がある

- blocked-hidden-state << hidden-state
- block-uniform << state-uniform

Accessor:
- sequence-data (point-sequence)
  seq-pointのvectorを返す

- hdp-hmm-l (blocked-hdp-hmm)
  現在の状態数の上限Lを返す
  実際の状態数kとは異なるが、常にkより大きい

参考文献:
Beam Sampling for the Infinite Hidden Markov Model, Jurgen Van Gael, Yunus Saatci, Yee Whye Teh, and Zoubin Ghahramani.
ICML 2008

========================================

ihmm.lisp
blocked & sticky HDP-HMM: 基礎的に使うべき万能?HDP-HMM これをここではiHMMと呼ぶことにする

class:
- ihmm << blocked-hdp-hmm sticky-hdp-hmm
- ihmm-state << blocked-hidden-state sticky-hidden-state
- ihmm-state-uniform << block-uniform sticky-state-uniform

sticky featureをBlocked Gibbsに対応させるために上書きすべきmethodがあるため、単純なmix-inとはならない

- gauss-ihmm << ihmm gauss-hdp-hmm
- gauss-ihmm-state << ihmm-state gaussian-state
- ihmm-gaussian << ihmm-state-uniform state-gaussian

実行例:

IHMM(14): (setf (values trans1 data1) (make-cyclic-test 500 #(0d0 50d0 0d0 -50d0)))
#(0 0 0 0 0 0 0 0 0 0 ...)
#<POINT-SEQUENCE @ #x1000bd9d72>
IHMM(15): (setf (values trans2 data2) (make-cyclic-test 500 #(0d0 50d0 0d0 -50d0)))
#(0 0 0 0 0 0 0 0 0 0 ...)
#<POINT-SEQUENCE @ #x1000c3f9f2>
IHMM(16): (setf trans (coerce (list trans1 trans2) 'vector))
#(#(0 0 0 0 0 0 0 0 0 0 ...) #(0 0 0 0 0 0 0 0 0 0 ...))
IHMM(17): (setf data (coerce (list data1 data2) 'vector))
#(#<POINT-SEQUENCE @ #x1000bd9d72> #<POINT-SEQUENCE @ #x1000c3f9f2>)
IHMM(18): (map 'vector #'(lambda (x) (map 'vector #'(lambda (y) (point-data y)) (sequence-data x))) data) ;; 生データ確認
#(#(0.7774628524351572d0 -1.317263393017809d0 0.1499122993576713d0 1.760687062844291d0 0.5890700040616544d0
    0.7620681604876274d0 0.20820480252339166d0 0.008305963440786393d0 0.6280792673787637d0 -0.3690057889528494d0 ...)
  #(-1.2589573109025902d0 -0.6680537631049001d0 -0.977360542281873d0 -0.9204817444451175d0 0.1444950521775598d0
    0.7507011449925263d0 -0.3055258644799465d0 -0.6574616916707324d0 -0.9588044829834967d0 0.45389443148718195d0 ...))
IHMM(26): (setf m (make-instance 'gauss-ihmm :data data :l 10)) ;; 状態数上限は真の状態4より多めに設定
#<GAUSS-IHMM @ #x10011b0592>
IHMM(27): (initialize m)
0.041013719237274926d0 ;; alpha (下層DPのhyper-parameter)
4.577657553892466d0 ;; gamma (上層DPのhyper-parameter)
0.8890828011820707d0 ;; kappa (sticky-parameter)
IHMM(28): (dotimes (i 100) (sampling m))
NIL
IHMM(29): (pprint (show-hidden-states m)) ;; 状態推定結果を表示

#(#(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 2 2 4 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1 1 1 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0)
  #(1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    3 3 3 4 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 4 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 4 1 1 1 1 1 1 1 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 4 1 1 1 1 1 1 1 1 1 1 1 5 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 4 1
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 4 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 6 6 6 6 6))
IHMM(30): (pprint trans) ;; データ生成時に使った真の状態

#(#(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2)
  #(0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
    1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
    0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
    2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3
    3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 3 0 0 0 0 0))
;;; 状態遷移時に中間状態が生成されていることを除き、ほぼ正しく推定されている
;;; 真の状態で0と2は共に平均0d0の正規分布であるがHDP-HMMが二つを正しく分離していることに注意
IHMM(31): (dpm-k m)
7
IHMM(32): (hdp-hmm-l m)
11
IHMM(33):