私は現在、機械学習のためのガウス過程を含むプロジェクトに取り組んでいます。本の例と説明を考慮して、トレーニングされたGPオブジェクトの一部であるさまざまなパラメーターのジェネリック関数を作成しようとしています-したがって、次の宣言は(単純な)トレーニング関数の最も一般的な宣言です。
def train[T, M <: MatrixInverter[T], S <: Kernel[T]](): GP_Spawn[T] = null
(疑問に思っている場合は、パラメーターリストと実装を削除しました。)
T
数値タイプについて説明します。たとえば、Double
またはInt
。MatrixInverter[T]
関数を強制する特性ですcalculateInverse
。Kernel[T]
カーネル関数に対応する特性です。すでにご存知の方もいらっしゃると思いますが、コレスキー分解を行列インバーターとして使用すると、ガウス過程のトレーニングを変更(いくらか簡略化)できるため、上記の関数を特殊化することを検討しました。タグのドキュメントにより、次の@specialized
ようになります。
def train[T, @specialized(CholeskyDecomposition[T]) M <: MatrixInverter[T], S <: Kernel[T]](): GP_Spawn[T]
に依存するいくつかの変数(タイプ、、、 )をT
使用する必要があるため、すべてのパラメーターが多かれ少なかれに依存していることは明らかです。上記のコードをコンパイルしようとすると、scala-compiler(2.9.2)は次のように文句を言います。T
Vector[T]
Matrix[T]
エラー:見つかりません:値CholeskyDecomposition
import algorithms.{CholeskyDecomposition, MatrixInverter}
インポートが正しいので、これが何を意味するのかわかりません。さらに、のインポートが未使用のインポートステートメントCholeskyDecomposition
としてマークされているのを見るのは不思議です。アルゴリズム自体に関連するいくつかの定数を含むコンパニオンがありますが、この側面がこのエラーの理由であるとは思いません。CholeskyDecomposition
このエラーの原因となる可能性のあるアイデアはありますか?そして、さらに、一般的なアプローチをカットせずにそれを解決する方法は?
編集:
答えを読んだ後、コードの並べ替えを検討していると、実行時に型照合を使用するソリューションになりました。
val testMat = new Matrix[T](3, 3)
val testInv = fac(testMat)
testInv match {
case chol : CholeskyDecomposition[T] => println("Found Cholesky!")
case _ => println("Found something different.")
}
そしてそれは今動作します:)すべてに感謝します!