2015-07-31 5 views
0

У меня возникают проблемы с QuadraticMinimizer - каждый раз, когда я его выполняю, я получаю ошибки, которые нечувствительны. Я посмотрел на scaladoc и код, и я просто не уверен, что я делаю неправильно.QuadraticMinimizer всегда возвращает нечувственный ответ

У меня есть следующий код:

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 

и вектор Ь:

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

, когда я выполняю код I получить:

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

Это указано ниже нижних границ.

ответ

0

Не могли бы вы добавить H (грамматическую матрицу) и y (линейный термин), чтобы я мог проверить это? Кроме того, шаблон инициализации для продвинутых пользователей (например, Спарк 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.

+0

Грамм-матрица, которую я использую, может быть вычислена путем ввода столбцов 1: 4 ввода и умножения их на их транспонирование. Я добавлю оригинал к вопросу, хотя это несколько сотен строк для 4 векторов. –

+0

Пожалуйста добавьте только грамматическую матрицу и линейный член. Если у вас есть 5 переменных, грамм будет иметь 5 x 5 матриц (не такой большой). Также линейный член также должен содержать 5 терминов ... Это H и y, которые должны быть отправлены, чтобы свести к минимуму –

+0

. Ваш комментарий говорит мне, в чем проблема, я думаю. Моя грамматическая матрица похожа на 279x279, поэтому, видимо, я строю ее неправильно. –