在尝试使用 clojure 中的 weka 时,我正在尝试使用 clojure 的 java 互操作功能将this howto guide从 weka wiki 转换为 clojure。
到目前为止,这一直运作良好,除了在一种情况下,clojure 反射机制似乎无法找到正确的调用方法 - 我有:
(def c-model (doto (NaiveBayes.) (.buildClassifier is-training-set)))
稍后这将由类的.evaluateModel
方法调用Evaluation
:
(.evaluateModel e-test c-model is-testing-set)
wheree-test
是类型weka.classifiers.Evaluation
,根据他们的 api 文档,该方法采用两个类型参数Classifier
和Instances
不过,我从 clojure 得到的是IllegalArgumentException No matching method found: evaluateModel for class weka.classifiers.Evaluation clojure.lang.Reflector.invokeMatchingMethod (Reflector.java:53)
- 我猜这是因为c-model
它实际上是 type NaiveBayes
,尽管它也应该是Classifier
- 根据instance?
.
我尝试强制转换cast
无济于事,据我了解,这更像是一种类型断言(当然,通过没有问题),而不是在 clojure 中进行真正的强制转换。是否有另一种方法可以明确告诉 clojure 在 java 互操作方法调用中要转换为哪些类型?(请注意,我上面链接的原始指南也使用了从NaiveBayes
to的显式转换Classifier
)
完整代码在这里:/http://paste.lisp.org/display/129250