밀집된 조건부 행렬의 대각선 화


10

밀도가 높고 조건이 잘못된 행렬을 대각선으로하려고합니다. 기계 정밀도에서 결과는 부정확합니다 (음의 고유 값을 반환하고 고유 벡터에는 예상 대칭이 없습니다). 임의 정밀도를 이용하기 위해 Mathematica의 Eigensystem [] 기능으로 전환했지만 계산 속도가 매우 느립니다. 나는 여러 솔루션에 열려 있습니다. 조건이 좋지 않은 문제에 적합한 패키지 / 알고리즘이 있습니까? 전제 조건 전문가가 아니므로 이것이 얼마나 도움이 될지 잘 모르겠습니다. 그렇지 않으면, 내가 생각할 수있는 모든 것은 병렬 임의 정밀도 고유 값 솔버이지만 Mathematica, MATLAB 및 C ++ 이외의 것은 익숙하지 않습니다.

문제에 대한 배경 지식을 제공하기 위해 행렬은 크지 만 크지 않습니다 (최대 4096x4096 ~ 32768x32768). 이들은 실제적이고 대칭이며 고유 값은 0과 1 사이 (제외)로 제한되며 많은 고유 값은 0에 매우 가깝고 1에 가깝지 않습니다. 행렬은 본질적으로 컨볼 루션 연산자입니다. 모든 행렬을 대각선으로 기울일 필요는 없지만 갈 수있을수록 클수록 좋습니다. 많은 프로세서와 분산 컴퓨팅 기능을 갖춘 컴퓨팅 클러스터에 액세스 할 수 있습니다.

감사합니다


2
실제 대칭 행렬을 대각선 화하기 위해 어떤 루틴을 사용하고 있습니까? 그리고 어떤 의미에서 고유 값 분해가 부정확합니까?
잭 폴슨

Arnold의 답변과 관련된 아이디어는 다음과 같습니다. SPD 행렬의 hole 레 스키 분해를 수행 한 다음 방금 얻은 hole 레 스키 삼각형의 특이 값을 찾고 정확도를 유지하기 위해 dqd 유형 알고리즘을 사용합니다.
JM

1
@JM : 수치 적으로 특이한 양의 정한 정렬 행렬의 hole 레 스키 분해물을 형성하는 것은 음의 피벗이 발생할 가능성이 있기 때문에 일반적인 방법으로는 수치 적으로 불안정합니다. (예를 들어, Matlab의 chol (A)는 일반적으로 실패합니다.)이를 0으로 설정하고 요인의 해당 행을 소멸시켜야합니다. 이렇게하면 숫자로 된 null 공간을 안정적으로 얻을 수 있습니다.
아놀드 노이 마이어

@Arnold, 메모리가 제공되면 매트릭스가 양의 반정의 (또는 거의) 긍정적 인 경우 대칭 피벗을 사용하는 Cholesky의 적응이 있습니다 . 아마도 그것들은 사용될 수 있습니다.
JM

@JM : 반 정확한 경우를 해결하기 위해 피벗 할 필요는 없습니다. 내가 준 요리법으로 충분합니다. 나는 표준 통조림 프로그램을 사용할 수 없지만 스스로 수정해야한다는 것을 지적하고 싶었습니다.
Arnold Neumaier

답변:


7

스펙트럼 분해 대신 SVD를 계산합니다. 행렬이 대칭으로 정의되어 있기 때문에 결과는 정확한 산술에서 동일하지만 유한 정밀도 산술에서는 작은 고유 값을 훨씬 더 정확하게 얻을 수 있습니다.

편집 : Demmel & Kahan, Bidiagonal Matrixs의 정확한 특이 값, SIAM J. Sci. 통계 계산. 11 (1990), 873-912]에 기재되어있다.
ftp://netlib2.cs.utk.edu/lapack/lawnspdf/lawn03.pdf

편집 2; 하나의 ulp로 단일 항목을 변경하면 이미 작은 고유 값을 많이 변경할 수 있으므로 사용 된 기계 정확도의 표준 시간보다 작은 고유 값을 해석 할 수있는 방법은 없습니다. 따라서 매우 작은 값 대신에 제로 고유 값을 얻는 것이 적절하며, (고정밀 도로 작업하는 것을 제외하고) 어떤 방법도 해당 고유 벡터를 얽 히지 않지만 일반적인 숫자 널 공간의 기본을 반환합니다.


[0,;,0]

2
@ JackPoulson : 요점은 bidiagonal 형식이 작은 특이 값을 훨씬 잘 결정한다는 것입니다. 연관된 대칭 3 각형 형태는 대각선에 0을 가지며, 3 각형에 적용된 QR에 의해서는 아니지만 2 각형이 대각선으로 축소되어 보존됩니다.
Arnold Neumaier

1
참고? Jacobi의 방법 은 매우 정확하지만 느리다고 알려져 있습니다.
잭 폴슨

@ JackPoulson : 시도하고 참조하십시오. Demmel & Kahan, 2 중 행렬의 정확한 특이 값, 202.38.126.65/oldmirrors/ftp.netlib.org/lapack/lawnspdf/…
Arnold Neumaier

[0,;,0]

1

이 제안에 감사드립니다. Mathematica의 SVD 명령을 시도했지만 눈에 띄는 개선이 없었습니다 (아직 적절한 대칭이 누락되었지만 '고유 값'은 이전에 부정적으로 나왔던 위치에서 0이 잘못되었습니다). 내장 함수 대신 위에서 설명한 알고리즘 중 하나를 구현해야 할 수도 있습니다. 나는 그것이 상당한 개선을 제공 할 것이라고 미리 확신하지 않는 한 이와 같은 특정 방법을 사용하는 데 어려움을 겪고 싶지 않을 것입니다.

@ JackPoulson, 나는 당신이 언급 한 Jacobi의 방법에 대한 논문을 감추었 고, 유망 해 보인다. 고유 시스템을 찾기 위해 Jacobi의 방법을 구현하는 좋은 방법을 추천 할 수 있습니까? MATLAB에서 직접 코딩하면 속도가 느릴 것으로 추측합니다.


나는 그것을 테스트하지는 않았지만 여기 MATLAB 구현이 있습니다 : groups.google.com/forum/?fromgroups#!msg/sci.math.num-analysis/…
Jack Poulson

하나의 ulp로 단일 항목을 변경하면 이미 작은 고유 값을 많이 변경할 수 있으므로 사용 된 기계 정확도의 표준 시간보다 작은 고유 값을 해석 할 수있는 방법은 없습니다. 따라서 매우 작은 값 대신에 제로 고유 값을 얻는 것이 적절하며, (고정밀 도로 작업하는 것을 제외하고) 어떤 방법도 해당 고유 벡터를 얽 히지 않지만 일반적인 숫자 널 공간의 기본을 반환합니다. 고유 값이 무엇입니까?
Arnold Neumaier

@ArnoldNeumaier : MATLAB에서 [0,1] 범위의 고유 값을 사용하여 일부 테스트를 실행했으며, 하나의 고유 값은 6.3e-16과 같은 값으로 수동 설정되고 옥타브의 SVD 루틴 (dgesvd를 기반으로, 두 대각선으로 축소 및 QR)은 Octave의 eig보다 훨씬 정확하게이 값을 선택합니다. 연결된 Jacobi 코드는 적당한 크기의 매트릭스에서도 사용하기에 너무 느린 것 같습니다.
잭 폴슨

@JackPoulson : 그렇습니다. 그러나 Leigh는 여러 개의 매우 작은 고유 값 에 대해 불평하는 것처럼 보이며 , 고유 벡터는 거의 설계되지 않았지만 어떤 방법을 사용하더라도 자유롭게 혼합됩니다. 그리고 양의 매우 작은 양의 값 (1e-16보다 작은)은 물론 0으로 나타납니다.
Arnold Neumaier

@ArnoldNeumaier는 매우 작은 고유 값을 여러 개 발견하는 것이 옳습니다. 이는 문제를 악화시킵니다. 나는 1e-16보다 작은 고유 값이 부동 소수점에서 0이 될 것이라는 것을 알지 못했습니다 (돌이켜 보면 분명합니다). 숫자를 저장할 수 있지만 더 큰 숫자를 추가하면 반올림 오류가 발생합니다. 고유 벡터는 특정 문제를 해결할 수 있는지 알려줍니다. 고유 벡터를 사용하면 문제를 해결할 수있는 부분과 해결할 수없는 부분으로 분해 할 수 있습니다. 기본적으로 정밀도가 제한되어 있다면 더 빠른 솔루션을 위해 패키지를 추천 할 수 있습니까?
Leigh
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.