Юля: Связывание LAPACK 2.0 в Linux

Я использую функцию eigs() в Julia для вычисления собственных значений и собственных векторов. Результаты недетерминированы и часто полны 0,0. Временное решение — связать LAPACK 2.0.

Есть идеи, как это сделать в Linux Ubuntu? Пока я не могу связать это, и я не знаю, насколько сложны навыки администрирования Linux, поэтому было бы хорошо, если бы кто-нибудь мог опубликовать руководство о том, как правильно связать его.

Большое спасибо.

Изменить:

Я хотел добавить результаты, но заметил один недостаток в коде. Я использовал matrix = sparse(map(collect,zip([triple(e,"weight") for e in edges(g)]...))..., num_vertices(g), num_vertices(g)). Это ответ от вас на один из моих вопросов. Это работает нормально, когда вершины индексируются с 1. Но мои вершины имеют случайные индексы из-за их чтения из файла. Поэтому я изменил num_vertices, чтобы он был равен наибольшему индексу. Но я не заметил, чтобы он выполнял, например, вычисления с учетом 1000 вершин, когда вершина с максимальным индексом была 1000, хотя весь граф мог состоять из 3 вершин, например, 1, 10, 1000. Любая идея, как это исправить?

Редактировать 2:

#Content of matrix = matrix+matrix'
[2, 1]  =  10.0
[3, 1]  =  14.0
[1, 2]  =  10.0
[3, 2]  =  10.0
[5, 2]  =  2.0
[1, 3]  =  14.0
[2, 3]  =  10.0
[4, 3]  =  20.0
[5, 3]  =  20.0
[3, 4]  =  20.0
[2, 5]  =  2.0
[3, 5]  =  20.0
[6, 5]  =  10.0
[5, 6]  =  10.0   

matrix = matrix+matrix'
(d, v) = eigs(matrix, nev=1, which=:LR, maxiter=1)

5 выполнений кода выше:

[-0.3483956604402672
 -0.3084333257587648
 -0.6697046040724708
 -0.37450798643794125
 -0.4249810113292739
 -0.11882760090004019]

[0.3483956604402674
 0.308433325758765
 0.6697046040724703
 0.3745079864379416
 0.424981011329274
 0.11882760090004027]

[-0.3483956604402673
 -0.308433325758765
 -0.669704604072471
 -0.37450798643794114
 -0.4249810113292739
 -0.1188276009000403]

[0.34839566044026726
 0.30843332575876503
 0.6697046040724703
 0.37450798643794114
 0.4249810113292739
 0.11882760090004038]

[0.34839566044026715
 0.30843332575876503
 0.6697046040724708
 0.3745079864379412
 0.4249810113292738
 0.11882760090004038]

person M.Puk    schedule 20.04.2016    source источник
comment
Можете ли вы добавить пример кода для недетерминизма и 0.0s? Обычно полезно сфокусировать ответ на проблеме.   -  person Dan Getz    schedule 21.04.2016
comment
Пожалуйста, не могли бы вы ответить на мое редактирование? Это связано с одним из ваших ответов на мой вопрос. Спасибо.   -  person M.Puk    schedule 21.04.2016
comment
@J.J.Jesenius Я предлагаю вам сделать минимальный пример с кодом, который мы можем запустить, который воспроизводит проблему. Вы можете поместить код, например. вкратце (gist.github.com)   -  person David P. Sanders    schedule 22.04.2016
comment
Индекс вершины 1000 может привести к тому, что матрица смежности станет большой и в основном пустой, что объясняет собственные значения 0,0. Возможно, лучше как-то перенумеровать вершины (используя Dict), чтобы сделать матрицу более плотной. В любом случае +1 к предложению D.P.Sanders для минимального примера кода.   -  person Dan Getz    schedule 22.04.2016


Ответы (1)


Алгоритм действительно недетерминирован (как видно из примера в вопросе). Но в ответах есть два вида недетерминизма:

  1. полная смена знака собственного вектора.
  2. небольшие погрешности точности.

Если вектор является собственным вектором, то и каждый скаляр, кратный ему (математически, собственный вектор является частью подпространства собственных векторов, принадлежащих собственному значению). Таким образом, если v — собственный вектор, то и λv тоже. Когда λ = -1, это изменение знака. Но 2v также является собственным вектором. Функция eigs нормализует векторы к норме 1, так что единственная оставшаяся свобода — это смена знака. Чтобы решить эту недетерминированность, вы можете выбрать знак для первой ненулевой координаты вектора (скажем, положительной) и умножить собственный вектор, чтобы сделать его таким. В коде:

v = v*sign(v[findfirst(v)])

Что касается второго источника недетерминизма (неточности), важно отметить, что истинные собственные значения и собственные векторы часто являются действительными числами, которые не могут быть точно представлены с помощью Float64, поэтому возвращаемые значения всегда отключены. Если требуемый уровень точности достаточно низок, детерминистическое округление значений должно сделать результирующее приближение одинаковым. Если это непонятно, рассмотрим алгоритм вычисления sqrt(2). Он может быть недетерминированным и возвращать 1.4142135623730951, а иногда и 1.4142135623730949, но округление до 5 знаков после запятой всегда дает 1.41421.

Вышеизложенное должно служить руководством для того, чтобы сделать результаты более детерминированными. Но учтите:

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

  2. Действительно ли приложение требует такого детерминизма?

(Спасибо за фрагменты кода - они помогают. Еще лучше, когда их можно быстро вырезать и вставить).

person Dan Getz    schedule 22.04.2016
comment
Спасибо, это очень помогло. Я знаю, что фрагменты кода не так просто просто вставить и запустить программу. Но я не хочу размещать здесь весь код. Я просто понял это ранее из некоторых проблем с github, что это должно быть детерминированным, потому что, когда вы используете eigs в python, это всегда одно и то же решение. Но после некоторого размышления ответ - недетерминизм не требуется. Большое спасибо. - person M.Puk; 22.04.2016