CLML HDP-LDAが動かないのでイロイロ調査。
テストがコメントされている。
./t/groups.lisp
を見てみると以下のようにコメント化されています。
そのため普通にテストを実行してもこのテストは実行されません。
(defparameter *nonparametric-tests* #+nil '(test-sample-dpm ;; gaussian-dpm does not exist test-sample-hdp-lda) nil)
データがない
./t/test-hdp-lda.lisp
を見てみるとテストtest-sample-hdp-lda
ではsports-corpus-data
という名のファイルを読み込んでいます。
このファイルが以下のファイルにありません。
https://github.com/yanqirenshi/clml/tree/master/docs/sample
データはあった
CL Machine-Learning の 8.2 sample data にありました。
clml-sample.tgzにありました。
データがあってもエラーになる。
こんな感じで。
CL-USER> (in-package :clml.test) #<PACKAGE "CLML.TEST"> TEST> (run-tests '(test-sample-hdp-lda)) === test-sample-hdp-lda ============================== Unit Test Summary | 0 assertions total | 0 passed | 0 failed | 1 execution errors | 0 missing tests #<TEST-RESULTS-DB Total(0) Passed(0) Failed(0) Errors(1)>
実際に動かしてみる。
データは取得できているのは確認できる。
TEST> (let ((dataset nil)) (setq dataset (pick-and-specialize-data (read-data-from-file "~/prj/clml/docs/sample/sports-corpus-data" :external-format :utf-8) :except '(0) :data-types (make-list 1202 :initial-element :numeric))) dataset) #<NUMERIC-DATASET > DIMENSIONS: 清水 | 試合 | ヤクルト | 鹿島 | 久保田 | ブルペン | 阿部 | 海老原 | 北海道 | 横須賀 ... TYPES: NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC | NUMERIC ... NUMBER OF DIMENSIONS: 1202 NUMERIC DATA POINTS: 100 POINTS
実際に実行してみると型エラーが発生します。
TEST> (let ((dataset nil)) (setq dataset (pick-and-specialize-data (read-data-from-file "~/prj/clml/docs/sample/sports-corpus-data" :external-format :utf-8) :except '(0) :data-types (make-list 1202 :initial-element :numeric))) (hdp-lda dataset)) ; Evaluation aborted on #<TYPE-ERROR expected-type: "DOUBLE-FLOAT" datum: #C(-10.171290230202244d0 6.283185307179586d0)>. === Backtrace ========================================== The value #C(-10.171290230202244d0 6.283185307179586d0) is not of type DOUBLE-FLOAT [Condition of type TYPE-ERROR] Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {100B5A0033}>) Backtrace: 0: ((:METHOD CLML.NONPARAMETRIC.HDP-LDA::ADD-TABLE (HDP-LDA T)) #<HDP-LDA {1006E33CE3}> #1=#S(TABLE :DISH 21 :CUSTOMER 66 :CUSTOMERS #(#S(WORD :ID 0 :ASSIGN #1#) #S(WORD :ID 0 :ASSIGN #1#) #S(WORD :ID 1 .. 1: ((:METHOD INITIALIZE (HDP-LDA)) #<HDP-LDA {1006E33CE3}>) [fast-method] 2: ((:METHOD HDP-LDA (NUMERIC-DATASET)) #<NUMERIC-DATASET > ..) [fast-method] 3: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((DATASET NIL)) (SETQ DATASET (PICK-AND-SPECIALIZE-DATA # :EXCEPT # :DATA-TYPES #)) (HDP-LDA DATASET)) #<NULL-LEXENV>) 4: (EVAL (LET ((DATASET NIL)) (SETQ DATASET (PICK-AND-SPECIALIZE-DATA # :EXCEPT # :DATA-TYPES #)) (HDP-LDA DATASET))) --more--
なんか変ったんかな。
本家数理システムのリポジトリのものとファイルを比較してみる。
add-table
の最初のdeclare
がホンマもんには入っていなかったので外して実行してみると結構すすむがDIVISION-BY-ZERO
でエラー。
むむむー
arithmetic error DIVISION-BY-ZERO signalled [Condition of type DIVISION-BY-ZERO] Restarts: 0: [RETRY] Retry SLIME REPL evaluation request. 1: [*ABORT] Return to SLIME's top level. 2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {100B5A0033}>) Backtrace: 0: ("bogus stack frame") 1: ((SB-PCL::FAST-METHOD CLML.NONPARAMETRIC.HDP-LDA::ADD-TABLE (HDP-LDA T)) #<unavailable lambda list>) [fast-method] 2: ((:METHOD SAMPLING (HDP-LDA)) #<HDP-LDA {10084A25F3}>) [fast-method] 3: ((:METHOD HDP-LDA (NUMERIC-DATASET)) #<NUMERIC-DATASET > ..) [fast-method] 4: (SB-INT:SIMPLE-EVAL-IN-LEXENV (LET ((DATASET NIL)) (SETQ DATASET (PICK-AND-SPECIALIZE-DATA # :EXCEPT # :DATA-TYPES #)) (HDP-LDA DATASET)) #<NULL-LEXENV>) 5: (EVAL (LET ((DATASET NIL)) (SETQ DATASET (PICK-AND-SPECIALIZE-DATA # :EXCEPT # :DATA-TYPES #)) (HDP-LDA DATASET))) --more--
;; TODO find out why n is 0 and negative
のところで発生しているみたい。
hdp-lda.lisp って二つあるね。
本家と自分のものを比較してみた。
本家は一つしかないが、自分のものは二つあります。
Package | File | 本家 | 自分 |
---|---|---|---|
clml.nonparametric.hdp-lda | ./src/nonparametric/src/hdp-lda.lisp | - | o |
clml.text.hdp-lda | ./src/text/src/hdp-lda.lisp | - | o |
text.hdp-lda | ./nonparametric/hdp-lda.lisp | o | - |
恐らくですが以下のように推移していったのだと思います。
text.hdp-lda
=> clml.text.hdp-lda
=> clml.nonparametric.hdp-lda
ちなみに本家のソースにはメソッドhdp-lda
はどこにも存在しません。
しかしドキュメントにはそのメソッドがあるかのようにテストしています。
ちなみに clml.text.hdp-lda
の hdp-lda
も動かしてみましたが最初の型エラーが出てしまい動きません。
fasl packages でテストしてみる
sbcl の fasl package でテストしようとしてみましたが。rowsell で sbcl-1.0.28 がインストールできず断念。
Github上のリリースの命名規則が今のものと古いものとで異なるみたい。
個別にSBCLをインスールするもの面倒なので断念。
おわり
結論としては今hdp-lda
は移行時期にあり動きません。
バグを取るか、明らめて Python 使うかですね。
お疲れさまでした。