Ошибки Mathnet при попытке решить уравнение множественной регрессии

1

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

//получение Необработанное исключение типа "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 я публикую на этом сайте, потому что я не знаю, как исправить эти исключения
Теги:
math
mathnet

1 ответ

2
Лучший ответ

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

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

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

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

MultipleRegression.NormalEquations(
    Matrix<double>.Build.DenseOfColumnArrays(shortRatingList, mediumRatingList, longRatingList),
    Vector<double>.Build.Dense(weekReturnList));
  • 0
    Это будет генерировать коэффициент для каждой точки выборки? Я думаю, что я правильно использую этот термин
  • 0
    Это позволит найти 3 коэффициента, которые минимизируют ошибку для 5704 выборок данных, так что p1 * short + p2 * medium + p3 * long ~ = weekReturn. Имеет ли это хоть какой-то смысл? Вы на самом деле не указали модель, для которой вы хотите регрессию;)
Показать ещё 5 комментариев

Ещё вопросы

Сообщество Overcoder
Наверх
Меню