В Python как решить обобщенную задачу на собственные значения для матриц разной размерности? - PullRequest
1 голос
/ 22 марта 2020

Есть ли способ использовать numpy.linalg.eigh() или scipy.linalg.eigh() для решения обобщенной проблемы собственных значений A⋅x = λB⋅x при A и B не имеют подходящих размеров? Например, когда A является матрицей 4x4, а B является матрицей 5x5. Или есть еще одна Python функция, которая может справиться с этим? Если я пытаюсь использовать eigh(A, B), я получаю следующую ошибку для версии scipy:

    valueError: wrong b dimensions (6, 6), should be (4, 4)

и эта ошибка в версии numpy:

    'numpy.ndarray' object has no attribute 'upper'

Я нашел этот ответ Решить обобщенную проблему собственных значений в Numpy, что хорошо для случаев, когда обе матрицы имеют одинаковые измерения, но я работаю над проблемой множественной линейной регрессии, пытаясь предсказать целевые значения из входных объектов, где A и B являются симметричными c матрицами, но имеют разные размеры относительно друг друга. Я также пробовал это решение: https://guihongwan.github.io/2018/11/The-Generalized-Eigenvector-and-Eigenvalue-Problem/, но получаю ошибку по той же причине несоответствия размеров.

Справочная информация: я пытаюсь использовать набор входных функций, X ∈ R n × d , где n - количество наблюдений и d - количество входных объектов и соответствующий набор выходных значений, Y ∈ R n × p , где p - количество выходных измерений для сопоставления X с Y , чтобы попытаться прогнозировать новый Y_hat выход. В качестве мини-примера с фиктивными числами, скажем, X представляет собой входную матрицу 5 x 4 из 5 наблюдений и 4 признаков, а Y целевая матрица 5 x 2 из 5 наблюдений и 2 выходных значений:

    X = [[1,2,3,4],
         [5,6,7,8],
         [4,3,2,1],
         [8,7,6,5],
         [9,6,4,2]]

    Y = [[8,7],
         [6,5],
         [4,3],
         [2,1],
         [1,9]]

Я вычисляю ковариационную матрицу для ввода X :

    A = np.cov(X, rowvar=False)    # A = 4x4 matrix

Затем я вычисляю ковариационную матрицу для ввода и вывода:

    Cxy = np.hstack((X, Y))
    B = np.cov(Cxy, rowvar=False)    # B = 6x6 matrix

Затем я пытаюсь использовать A и B , чтобы вычислить собственные значения и собственные векторы, используя eigh(), но это то, где я застрял. Кто-нибудь может предложить решение, пожалуйста или укажите, где я ошибся?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...