0

QuadraticMinimizer に問題があります。実行するたびに、無意味なエラーが発生します。scaladoc とコードを見てきましたが、何が間違っているのかわかりません。

次のコードがあります。

    val lBounds:DenseVector[Double] = DenseVector(Array(Double.NegativeInfinity, 5.0, 0.1, 50.0, 50.0))
  val uBounds:DenseVector[Double] = DenseVector(Array(Double.PositiveInfinity, 500.0, 100.0, 99000.0, 99000.0))

  val inputMatrix:DenseMatrix[Double] = breeze.linalg.csvread(file=new java.io.File(getClass.getResource("/input/zip06latlong.csv").toURI), skipLines=1)

  val y = inputMatrix(::, 0).toDenseVector
  val X = inputMatrix(::, Seq(1,2,3,4,5)).copy.toDenseMatrix
  val T = X.toDenseMatrix.t

  val gram = (T * X)
  val b:Transpose[DenseVector[Double]] = y.t * X

  println(gram)
  println(b.inner)
  breeze.linalg.csvwrite(new java.io.File("grammatrix.csv"), gram)
  val minimizer:QuadraticMinimizer = new QuadraticMinimizer(rank(gram), ProjectBox(lBounds,uBounds))


  val coeffs =  minimizer.minimize(gram, b.inner)
  println(coeffs)

グラムは次のようになります。

    279.0      628207.0       1461245.0        1024.0     729.5      
628207.0   1.569309427E9  3.414471724E9    2449533.0  1755536.5  
1461245.0  3.414471724E9  1.2324155401E10  5511816.0  3846583.0  
1024.0     2449533.0      5511816.0        3980.0     2786.0     
729.5      1755536.5      3846583.0        2786.0     2092.75

b ベクトルは次のとおりです。

2.917264069193999E8, 7.294450468242601E11, 1.585917338779061E12, 1.131888709844E9, 8.260072757806E8

コードを実行すると、次のようになります。

DenseVector(-12171.118011368422, -424.79971124882286, -9.565028484748783, 49.3827769217138, 49.536905925364195)

これは、指定された下限を下回っています。

4

1 に答える 1

0

テストできるように、H (グラム行列) と y (線形項) も追加していただけますか? また、初期化パターンは上級ユーザー向けです (ソルバーを作成した Spark ALS など) が、次のように単純なパターンを使用できます (境界を使用しました)。

val lb = DenseVector(Array(Double.NegativeInfinity, 5.0, 0.1, 50.0, 50.0))
val ub = DenseVector(Array(Double.PositiveInfinity, 500.0, 100.0, 99000.0, 99000.0))

val n = 5

val ata = new DenseMatrix[Double](5, 5,
  Array(4.377, -3.531, -1.306, -0.139, 3.418,
    -3.531, 4.344, 0.934, 0.305, -2.140,
    -1.306, 0.934, 2.644, -0.203, -0.170,
    -0.139, 0.305, -0.203, 5.883, 1.428,
    3.418, -2.140, -0.170, 1.428, 4.684))

val atb = DenseVector(-1.632, 2.115, 1.094, -1.025, -0.636)

val qpSolverBounds = new QuadraticMinimizer(n, ProjectBox(lb, ub))
val result = qpSolverBounds.minimize(ata, atb)
println(s"Bounds test $result")

無意味に見えない DenseVector(-33.02749751949581, 5.0, 0.1, 50.0, 50.0) として結果を取得しています。

デフォルトの maxIter は変更しないでください。この制御は、絶対的な収束が必要ないフローに対して行われるためです。ソルバーに maxIter を選択させます。

于 2015-08-02T19:05:48.480 に答える