2015-01-11 3 views
1

У меня есть следующий код, и я пытаюсь использовать 2 разных метода для решения уравнения множественной регрессии. Массивы слишком длинны, чтобы перечислить, но подсчет по каждому соответствует 5704 строкам. Я получаю следующие ошибки, когда я пытаюсь запустить кодОшибки Mathnet при попытке решить уравнение множественной регрессии

// получение необработанного исключения типа «System.ArgumentException» произошел в MathNet.Numerics.dll

Дополнительной информацией: Матрица должна быть положительно определенной ,

double[] p = Fit.MultiDim(
       new[] { shortRatingList.ToArray(), mediumRatingList.ToArray(), longRatingList.ToArray() }, 
       weekReturnList.ToArray(), 
       intercept: true); 

// получение необработанное исключение типа 'System.ArgumentException' произошло в MathNet.Numerics.dll

Дополнительная информация: Матрица размеры должны согласиться: 3x5705.

   double[] q = MultipleRegression.QR(
       new[] { shortRatingList.ToArray(), mediumRatingList.ToArray(), longRatingList.ToArray() }, 
       weekReturnList.ToArray(), 
       intercept: true); 
+0

@MitchWheat Я отправляю на этом сайте, потому что я не знаете, как исправить эти исключения. – user3610374

ответ

2

фрагмент кода в вопросе вычисляет регрессии с 3 точками выборки (каждый из них с 5704 значений), так что он ожидает weekReturnList, чтобы иметь длину 3.

Однако, если weekReturnList имеет длину 5704, а ваши данные фактически представляют 5704 точек данных с 3 значениями каждый (короткий, средний, длинный), тогда вам нужно транспонировать вход.

Я предполагаю, что данные, организованные столбцами вместо точек данных, довольно распространены на практике, поэтому мы должны рассмотреть возможность добавления функции быстрого доступа для этого варианта использования в классе Fit.

В то же время вы можете использовать следующую команду, которая переставляет входные данные путем создания матрицы дизайна из массива столбцов вместо строк массивов:

MultipleRegression.NormalEquations(
    Matrix<double>.Build.DenseOfColumnArrays(shortRatingList, mediumRatingList, longRatingList), 
    Vector<double>.Build.Dense(weekReturnList)); 
+0

Это будет генерировать коэффициент для каждой точки выборки? Я думаю, что правильно использую этот термин. – user3610374

+0

Это найдет 3 коэффициента, которые минимизируют ошибку для образцов данных 5704, так что p1 * short + p2 * medium + p3 * long ~ = weekReturn. Имеет ли это смысл? Вы на самом деле не указали модель, для которой вы хотите получить регрессию;) –

+0

Только что заметили, что вы попросили термин перехвата (и, следовательно, 4 коэффициента). Самый простой способ сделать это с помощью этой функции - сначала вставить вектор «все-один» (например, «Generate.Repeat (5704, 1.0)»), а затем другой. –

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