ほんとのこと知りたいだけなのに。

夏休みはもうおわり。

CLML HDP-LDAが動かない。

CLML HDP-LDAが動かないのでイロイロ調査。

github.com

テストがコメントされている。

./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-ldahdp-lda も動かしてみましたが最初の型エラーが出てしまい動きません。

fasl packages でテストしてみる

sbcl の fasl package でテストしようとしてみましたが。rowsell で sbcl-1.0.28 がインストールできず断念。

Github上のリリースの命名規則が今のものと古いものとで異なるみたい。

個別にSBCLをインスールするもの面倒なので断念。

おわり

結論としては今hdp-ldaは移行時期にあり動きません。

バグを取るか、明らめて Python 使うかですね。

お疲れさまでした。