2016-05-19 3 views
0

В настоящее время у меня есть зависимость от commons-math 2.1, но я хочу обновить ее до commons-math 3.6. К сожалению, есть некоторые тестовые теги, которые больше не работают. Я знаю, что вызывает мою проблему, но я не знаю, как изменить тестовый тест, чтобы проверить правильное поведение, как и раньше.OLS множественная линейная регрессия с commons-math

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

@Test 
public void testIdentityMatrix() { 
    double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } }; 
    double[] y = { 1, 2, 3, 4 }; 

    OLSMultipleLinearRegression regression = new OLSMultipleLinearRegression(); 
    regression.setNoIntercept(true); 
    regression.newSampleData(y, x); 

    double[] b = regression.estimateRegressionParameters(); 
    for (int i = 0; i < y.length; i++) 
    { 
     assertEquals(b[i], y[i], 0.001); 
    } 
} 

После обновления Викисклада математике 3.6 OLSMultipleLinearRegression проверяет данную матрицу х и вектор у для действительных содержимого. И эта проверка завершается с сообщением:

не

достаточно данных (4 строки) для этого много предсказателей (4 предикторов)

Что мне нужно изменить, чтобы исправить этот тест?

ответ

1

Это ошибка в Commons Math 3.x. Если в модели нет перехвата, если матрица проектирования не является сингулярной, число наблюдений, равное числу регрессоров, должно быть в порядке. В вашем примере, я думаю, вы имеете в виду, что третья строка x будет {0,0,1,0} (в противном случае матрица проектирования является сингулярной). С этим изменением ваших данных и исправлением кода, применяемым в Hipparchus fix, ваш тест будет успешным. Эта ошибка отслеживается как MATH-1392 в Commons Math.

0

Число образцов должно быть больше, чем количество переменных. Видимо, ваш тестовый пример это не правильно. Вам нужно будет добавить хотя бы еще один образец. Если изменить

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 } }; 

в

double[][] x = { { 1, 0, 0, 0 }, { 0, 1, 0, 0 }, { 0, 0, 0, 1 }, { 0, 0, 0, 1 }, {1,0,0,0} }; 

он должен работать. (хотя я не тестировал его).

0

Я предполагаю, что третий ряд х должен быть 0010 вместо 0001?

Однако, если изменить х к

двойной [] [] х = {{1, 0, 0, 0}, {0, 1, 0, 0}, {0, 0, 1, 0), {0, 0, 0, 1}, {1,1,1,1}};

и изменить, чтобы у

двойной [] у = {1, 2, 3, 4, 10};

что последний элемент является суммой других элементов, то он работает.

Смежные вопросы