Получение l1 нормализованных собственных векторов из питона вместо l2? - PullRequest
0 голосов
/ 11 декабря 2018

Рассмотрим эту матрицу:

[.6, .7]
[.4, .3]

Это матрица цепи Маркова;в столбцах каждая сумма равна 1. Это может представлять распределение населения, коэффициенты перехода и т. д.

Чтобы получить население в равновесии, возьмите собственные значения и собственные векторы ...

Из вольфрам альфа,Собственные значения и соответствующие им собственные векторы:

l1 = 1, v1 = [4/7, 1]
l2 = -1/10, v2 = [-1,1]

Для популяции в состоянии равновесия возьмите собственный вектор, соответствующий собственному значению 1, и масштабируйте его так, чтобы общее значение = 1.

Vector = [7/4, 1]
Total = 11/4

Итак, умножьте вектор на 4/11 ...

4/11 * [7/4, 1] = [7/11, 4/11]

Поэтому в состоянии равновесия первое государство имеет 7/11 населения, а другое - 4/11.

Если вы возьмете нужный собственный вектор, [7/4, 1] и l2 нормализует его (так что все квадратичные значения суммируют до 1), вы получите примерно [.868, .496].

Все в порядке.Но когда вы получаете собственные векторы из питона ...

mat = np.array([[.6, .7], [.4, .3]])
vals, vecs = np.linalg.eig(mat)
vecs = vecs.T #(because you want left eigenvectors)

Один из собственных векторов, которые он выделяет, - это [.868, .496], для l2 нормированных.Теперь вы можете довольно легко снова масштабировать его, так что сумма каждого значения равна 1 (вместо суммы КВАДРАТА каждого значения) равной 1 ... просто сделайте вектор * 1 / сумма (вектор).Но есть ли способ пропустить этот шаг?Зачем добавлять вычислительные расходы в мой сценарий, когда каждый раз, когда я делаю это, нужно суммировать вектор?Можете ли вы заставить numpy, scipy и т. Д. Выплевывать нормализованный вектор l1 вместо нормализованного вектора l2?Кроме того, является ли это правильным использованием терминов l1 и l2 ...?

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

1 Ответ

0 голосов
/ 11 декабря 2018

Я думаю, вы предполагаете, что np.linalg.eig вычисляет собственные векторы и собственные значения так, как вы это делаете вручную.Это не так. Под капотом используется высокооптимизированная (и знаменитая) библиотека FORTRAN под названием LAPACK.Эта библиотека использует числовые методы, которые находятся вне области видимости, но вкратце, она не вычисляет собственные значения для 2x2, как вы бы делали вручную.Я полагаю, что он использует алгоритм QR большую часть времени, а иногда QZ или даже другие.Не все так просто: я думаю, что иногда даже выбираются разные алгоритмы на основе структуры / размера матрицы (я не эксперт по LAPACK, поэтому не цитируйте меня здесь).Что я действительно знаю, так это то, что LAPACK проверялся около 40 лет, и он чертовски быстр, и с большой скоростью возникает большая сложность.

Вольфрам Альфа, с другой стороны, использует Mathematica на бэкэнде,который является символическим решателем (то есть не арифметика с плавающей точкой).Вот почему вы получаете «тот же» результат, как если бы вы делали это вручную.

Короче говоря, просить вас получить норму L1 от np.linalg.eig просто невозможно: Если вы посмотрите на алгоритм QR, каждая итерация будет иметь нормализованный вектор L2 (который сходится к собственному вектору).Вам будет трудно получить его из большинства числовых библиотек по той простой причине, что многие из них зависят от LAPACK или используют схожие алгоритмы (например, MATLAB также выводит единичные векторы).

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

HTH.

...