åºæå¤åé¡
Pythonã§åºæå¤åé¡ãè§£ãæ¹æ³ã«ã¤ãã¦ã¡ã¢ãã¦ããã
ã¡ã¸ã£ã¼ãªæ¹æ³ã¨ãã¦ã以ä¸ã®3ã¤ããã
- numpy.linalgã®é¢æ°ã使ãã
- scipy.linalgã®é¢æ°ã使ãã
- scipy.sparse.linalgã®é¢æ°ã使ãã
numpy.linalgã¨scipy.linalgã«ã¯ä»¥ä¸ã®4ã¤ã®é¢æ°ãããã
- eigï¼ä¸è¬ã®è¡åã®åºæå¤ã»åºæãã¯ãã«ãæ±ããã
- eighï¼ã¨ã«ãã¼ãï¼or å®å¯¾ç§°ï¼è¡åã®åºæå¤ã»åºæãã¯ãã«ãæ±ããã
- eigvalsï¼ä¸è¬ã®è¡åã®åºæå¤ã®ã¿ãæ±ããã
- eigvalshï¼ã¨ã«ãã¼ãï¼or å®å¯¾ç§°ï¼è¡åã®åºæå¤ã®ã¿ãæ±ããã
颿°åã®hã¯Hermitianã®ç¥ãScipyã ã¨ä¸è¬ååºæå¤åé¡*1ããªãã·ã§ã³ã§åºæ¥ãã
ã¡ãªã¿ã«ãscipy.linalgã¯numpy.linalgã«å«ã¾ãã颿°ã¯ãã¹ã¦å«ãã§ãã¦ãããã«è¿½å ã§ä»ã®é¢æ°ãå«ãã§ãããã¾ããscipy.linalgã常ã«BLAS/LAPACKã§ã³ã³ãã¤ã«ãããã®ã«å¯¾ããnumpy.linalgã¯ããã¨ã¯éããªãã®ã§ãscipyã®æ¹ãæ©ãå ´åãããããªã®ã§ãç¹å¥ãªçç±ï¼ã³ã¼ããæ¢ã«numpy.linalgã§æ¸ããã¦ãã¦ãæ¸ããªããã®ãããã©ãã¨ãï¼ããªãéããscipy.linalgã使ãã»ããããããã¶ãã
http://docs.scipy.org/doc/scipy-0.14.0/reference/tutorial/linalg.html
scipy.sparse.linalgã«ã¯ä»¥ä¸ã®2ã¤ã®é¢æ°ãããã
- eigsï¼ä¸è¬ã®è¡åã®åºæå¤ï¼ã»åºæãã¯ãã«ï¼ãæ±ããã
- eigshï¼ã¨ã«ãã¼ãï¼or å®å¯¾ç§°ï¼è¡åã®åºæå¤ï¼ã»åºæãã¯ãã«ï¼ãæ±ããã
颿°åã®sã¯sparseã®ç¥ãä¸è¬ååºæå¤åé¡ãåºæ¥ãã
詳細
以ä¸ã§ãç°¡åã«ä½¿ãæ¹ã解説ããã
w, v = numpy.linalg.eigh(A, UPLO='L')
- ã¨ã«ãã¼ãï¼or å®å¯¾ç§°ï¼è¡åAã®åºæå¤ã»åºæãã¯ãã«ãæ±ããã
- UPLOã¯è¡åAã®ä¸ä¸è§ã®é¨åã使ãã(âLâ)ãä¸ä¸è§ã®é¨åã使ãã(âUâ)ãæå®ããï¼ããã©ã«ãã§ã¯âLâï¼ãAã¯ã¨ã«ãã¼ããªã®ã§ãã©ã¡ãã使ã£ã¦ãåãçµæãå¾ãããã¯ãã
- è¿ãå¤ã¯åºæå¤w(ã¨ã«ãã¼ããã常ã«å®)ã¨åºæãã¯ãã«ãããªãè¡åv(ã¦ãã¿ãªâè¡å)ããã ããåºæå¤wã®é çªã¯ç¹ã«æ±ºã¾ã£ã¦ããªã*2ãvã®åv[:, i]ãåºæå¤w[i]ã«å¯¾å¿ããè¦æ ¼åãããåºæãã¯ãã«ã
- åºæå¤ã ãã§ãããªãã numpy.linalg.eigvalsh(A, UPLO=âLâ)ã使ãã°ããã
- ã¡ãªã¿ã«ãä¸èº«ã¯LAPACKã®_ssyevd, _heevd*3ã使ããã¦ãããããã
è¡åãã¨ã«ãã¼ãã§ãªãä¸è¬ã®è¡åã®æã¯
numpy.linalg.eig(A) or numpy.linalg.eigvals(A)
ã使ãã
- ãã®æã¯ãvã®ã©ã³ã¯ã¯æå¤§ã§ãªãå¯è½æ§ãã¤ã¾ããåºæãã¯ãã«ãç·å½¢ç¬ç«ã§ãªãå¯è½æ§ãããã
- vã®åã¯å³åºæãã¯ãã«ã§ãä¸è¬ã«å·¦åºæãã¯ãã«ã¯å³åºæãã¯ãã«ã®ã¨ã«ãã¼ãå ±å½¹ã¨ã¯ä¸è´ããªãã®ã§æ³¨æãå·¦åºæãã¯ãã«ãæ±ãããæã¯Aã®ã¨ã«ãã¼ãå ±å½¹ãåã£ããã®ã®åºæå¤ã»åºæãã¯ãã«ãæ±ããã°ããããã ããScipyã使ãã°ãªãã·ã§ã³ã§æåããå·¦åºæãã¯ãã«ãæ±ããããã®ã§ãScipyã使ã£ãæ¹ã楽ã
- ä¸èº«ã¯LAPACKã®_geevã使ã£ã¦ãããããã
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eigh.html
http://docs.scipy.org/doc/numpy/reference/generated/numpy.linalg.eig.html
scipy.linalg.eig(a, left=False, right=True, overwrite_a=False, check_finite=True)
- leftãrightã¯å·¦ï¼å³ï¼åºæãã¯ãã«ãæ±ãããã©ãããæå®ããã
- overwrite_aã¯aã䏿¸ããããã©ããï¼Trueã«ããã¨æ§è½ãä¸ããæãããï¼ã
- check_finiteã¯a,bãinfinities or NaNãå«ãã§ããªãããã§ãã¯ãããã©ããã
- è¿ãå¤ã¯åºæå¤wã¨å·¦åºæãã¯ãã«vlã¨å³åºæãã¯ãã«vrãåºæå¤w[i]ã«å¯¾å¿ããè¦æ ¼åãããå·¦åºæãã¯ãã«ã¯åvl[:,i]åºæå¤w[i]ã«å¯¾å¿ããè¦æ ¼åãããå³åºæãã¯ãã«ã¯åvr[:,i]
http://docs.scipy.org/doc/scipy/reference/generated/scipy.linalg.eig.html
scipy.linalg.eigh(a, lower=True, eigvals_only=False, overwrite_a=False, eigvals=None, check_finite=True)
- åºæå¤wã¯numpy.linalg.eighã¨éã£ã¦ãæé ã«ä¸¦ãã§ããã
- lowerã¯aã®ä¸ä¸è§ããã¨ãããä¸ä¸è§ããåããã
- eigvals_onlyã¯åºæãã¯ãã«ãè¨ç®ãããã©ããã
- eigvalsã¯æ±ããåºæå¤ã»åºæãã¯ãã«ã®ç¯å²ï¼æå®ããªããã°å ¨ã¦æ±ããï¼ã
http://docs.scipy.org/doc/scipy-dev/reference/generated/scipy.linalg.eigh.html
注æ
import scipy as spã§ã¤ã³ãã¼ããã¦ãsp.linalg.eighã§ä½¿ããã¨ããã¨ã
Traceback (most recent call last):
File "eigen.py", line 16, in
eval, evec = sp.linalg.eigh(A)
AttributeError: 'module' object has no attribute 'linalg'
ã®ãããªã¨ã©ã¼ãã§ãã
ããã¯åã«Scipyãã¤ã³ãã¼ãããã ãã§ã¯ãNumpyã¨éã£ã¦ãµãããã±ã¼ã¸ã¾ã§ã¯ã¤ã³ãã¼ãããªãããï¼Scipyã¯ããªãå¤ãã®ãµãããã±ã¼ã¸ãå«ãã§ããã®ã§ããã®ãããªä»æ§ã«ãªã£ã¦ããã¿ããï¼ã
ãã¨ãã°ãfrom scipy import linalgã§ã¤ã³ãã¼ããã¦ãscipy.linalg.eighã§ä½¿ãããã«ããã°ããã
http://stackoverflow.com/questions/9819733/scipy-special-import-issue
注æ
å·¦åºæãã¯ãã«ã®å®ç¾©ããããããï¼æ®éã¨éãï¼ã®ã§æ³¨æã
http://stackoverflow.com/questions/15560905/is-scipy-linalg-eig-giving-the-correct-left-eigenvectors
scipy.sparse.linalg.eigs(A, k=6, sigma=None, which='LM', v0=None, ncv=None, maxiter=None, tol=0, return_eigenvectors=True)
- scipy.sparseã®å ´åã¯Aã«ndarrayã ãã§ãªããçè¡åãLinearOperatorã使ããã
- k: æ±ããåºæå¤ã»åºæãã¯ãã«ã®æ°ãAã®æ¬¡å Nããå°ãããªãã¨ã ãï¼ãã¹ã¦ã®åºæå¤ã¯æ±ããããªãï¼ã
- sigmaã¯shift-invert modeããã®å¤ã®ãããã®åºæå¤ãæ±ããæã«ãæå®ããã¨æå¹ã
- v0ã¯iterationã®Initial vectorã®æå®ã
- ncv:Lanczosãã¯ãã«ã®æ°ãkãã大ãããªãã¨ãã¡ã
- which:ã©ã®åºæå¤ãæ±ããããï¼æå¤§åºæå¤ãæ±ããæ'LM'ã¯ãªãã¦ãããããæå°åºæå¤'SM'ãæ±ããæã¯sigmaãæå®ããã»ãããããï¼
- maxiter: Arnoldiã®iterationã®åæ°ã®æå¤§å¤ã
- tol: åºæå¤ã®ç¸å¯¾ç²¾åº¦ï¼iterationãã¹ãããããå¤ï¼ã
- return_eigenvectors: åºæå¤ãæ±ãããã©ããã
- è¿ãå¤ã¯kåã®åºæå¤wã¨kåã®åºæãã¯ãã«v[:,i]
- ARPACKã®SNEUPD, DNEUPD, CNEUPD, ZNEUPDã¨ãã颿°ã®ã©ããã¼ãä¸èº«ã¯the Implicitly Restarted Arnoldi Methodã使ã£ã¦ããã
http://docs.scipy.org/doc/scipy/reference/generated/scipy.sparse.linalg.eigs.html
scipy.sparse.linalg.eigsh(A, k=6, M=None, sigma=None, which='LM', v0=None, ncv=None, maxiter=None, tol=0, return_eigenvectors=True)
- ARPACKã®SSEUPDã¨DSEUPDã¨ãã颿°ã®ã©ããã¼ãä¸èº«ã¯Restarted Lanczos Methodãåãã¦ããã
注æï¼æå°åºæå¤ãæ±ããå ´å
ARPACKã¯æå¤§åºæå¤ãæ±ããæã«æé©åããã¦ãããããªã®ã§ãæå°åºæå¤ã®å ´åã¯å·¥å¤«ããæ¹ãããï¼ãã®ã¾ã¾ã ã¨åæã«å¤±æãããããï¼ã
- tolerance (tol) ãå¢ããã¦ãã¯ããåæããããâ åæã«ã¯æåããããç²¾åº¦ãæªããªãã
- maximum number of iterations (maxiter)ãå¢ãããâ 精度ã¯ããããæéããããã
- shift-invert modeã(sigma)使ããâ çãæéã§ç²¾åº¦ãè¯ãã
ãããã®ã§ãsigmaãæå®ããã®ãããããã
http://students.mimuw.edu.pl/~pbechler/scipy_doc/tutorial/arpack.html
ä½¿ãæ¹
ã¨ã«ãã¼ãè¡åã®åºæå¤ã»å³åºæãã¯ãã«ãscipy.linalgã¨scipy.sparse.linalgã§ã
import numpy as np import scipy.linalg import scipy.sparse.linalg N = 3; np.random.seed(5) A = np.random.rand(N,N); A = np.dot(A, A.conj().T) #make Hermitian matrix w1, v1 = scipy.linalg.eigh(A) print 'eigenvalues =', w1 print 'A v =', np.dot(A, v1); print 'v w =', np.dot(v1, np.diag(w1)) w2, v2 = scipy.sparse.linalg.eigsh(A, k=2) print 'eigenvalues =', w2 i = 0 print 'A v[:,i] =', np.dot(A, v2[:, i]); print 'w[i] v[:,i] =', w2[i] * v2[:, i]
çµæã¯
eigenvalues = [ 0.02340572 0.34973568 2.87713176]
A v = [[-0.00366442 0.30775003 1.29047002]
[-0.0131621 -0.15834243 1.99081348]
[ 0.01900418 -0.05032536 1.62764737]]
v w = [[-0.00366442 0.30775003 1.29047002]
[-0.0131621 -0.15834243 1.99081348]
[ 0.01900418 -0.05032536 1.62764737]]
eigenvalues = [ 0.34973568 2.87713176]
A v[:,i] = [-0.30775003 0.15834243 0.05032536]
w[i] v[:,i] = [-0.30775003 0.15834243 0.05032536]
scipy.linalgã§ã¯ãåºæå¤ãæé ã«ä¸¦ãã§ããã
scipy.sparse.linalgã§ã¯ãå
¨ã¦ã®åºæå¤ãæ±ãããã¨ã¯åºæ¥ããæ±ãããåºæå¤ã®æ°kãè¨å®ããï¼kã¯è¡åAã®æ¬¡å
ããå°ãããªãã¨ãããªãï¼ã
scipy.sparse.linalgãåºæå¤ã¯æé ã«ä¸¦ã¶ã
è¡åAã®åºæå¤wã¨å³åºæãã¯ãã«ãããªãè¡åVï¼åºæå¤w[i]ã«å¯¾å¿ããå³åºæãã¯ãã«ãv[:,i]ï¼ã¯
A V = V W â A v[:,i] = w[i] v[:,i]
ãæºããã
å·¦åºæãã¯ãã«
ã¨ã«ãã¼ãã®æï¼eig(s)hï¼ã¯ãå³åºæãã¯ãã«ã®ã¨ã«ãã¼ãå
±å½¹ãã¨ãã°ãå·¦åºæãã¯ãã«ãä½ããã®ã§ãèªæã
ããã§ãä¸è¬ã®è¡åã®å³åºæãã¯ãã«ãèããã
scipy.linalg.eigã¯å³åºæãã¯ãã«ãæ±ãããã©ããã®ãªãã·ã§ã³ï¼left=Trueï¼ãããã®ã§ãããã使ãã°ããï¼ãã ããå³åºæãã¯ãã«ã®å®ç¾©ãæ®éã¨éãã®ã§ã注æããï¼ã
scipy.sparse.linalg.eigsã«ã¯ãã®ãããªãªãã·ã§ã³ã¯ãªãã®ã§ãã¨ã«ãã¼ãå
±å½¹ãåã£ãè¡åã«å¯¾ãã¦ãå³åºæãã¯ãã«ãæ±ãããã¨ã§ãå
ã®è¡åã®å·¦åºæãã¯ãã«ãæ±ããã:
import numpy as np import scipy.linalg import scipy.sparse.linalg N = 3; np.random.seed(5) B = np.random.rand(N,N) w1, v1_left = scipy.linalg.eig(B, left=True, right=False) print np.dot(B.conj().T, v1_left) - np.dot(v1_left, np.diag(w1.conj())) print np.dot(v1_left.conj().T, B) - np.dot(np.diag(w1), v1_left.conj().T) w2, v2_left = scipy.sparse.linalg.eigs(B.conj().T, k=1) w2= w2.conj(); v2_left = v2_left.conj().T i = 0 print np.dot(v2_left[i,:], B) - w2[i] * v2_left[i,:]
çµæ
[[ 4.44089210e-16+0.j 2.77555756e-17+0.j -6.59194921e-17+0.j]
[ 8.88178420e-16+0.j 1.11022302e-16+0.j -1.94289029e-16+0.j]
[ 3.33066907e-16+0.j -5.55111512e-17+0.j -2.77555756e-17+0.j]]
[[ 4.44089210e-16+0.j 8.88178420e-16+0.j 2.22044605e-16+0.j]
[ 2.77555756e-17+0.j 1.11022302e-16+0.j -8.32667268e-17+0.j]
[ -6.59194921e-17+0.j -1.94289029e-16+0.j -2.77555756e-17+0.j]]
[ 2.22044605e-16+0.j 2.22044605e-16+0.j 0.00000000e+00+0.j]
ããã¥ã¢ã«ã«ããããã«ãscipy.linalg.eig(B, left=True)ã§æ±ããããå·¦åºæãã¯ãã«v_leftã¯
B.H v_left[:,i] = w[i].conj() v_left[:,i] â B.H V_left = V_left W
â V_left.H B = W V_left.H
ãæºãããã®(.Hã¯ã¨ã«ãã¼ãå
±å½¹ã®æå³)ã
æ®éãå³åºæãã¯ãã«ã¯
V_left B = W V_left â v_left[i,:] B = w[i] v_left[i,:]
â B.H V_left.H = V_left.H W.conj()
ã§å®ç¾©ãããã®ã§ãscipy.linalg.eigã§æ±ããããå·¦åºæãã¯ãã«ã¯æ®éã®å®ç¾©ã®ã¨ã«ãã¼ãå
±å½¹ã«ãªã£ã¦ããã
scipy.sparse.linalg.eigsã§ã¯ãè¡åã®ã¨ã«ãã¼ãå
±å½¹ãåã£ã¦ãã®ã®åºæå¤ã»å³åºæãã¯ãã«ãæ±ããããããè¤ç´ å
±å½¹ã»ã¨ã«ãã¼ãå
±å½¹ãã¨ãã°ãæ±ãããåºæå¤ã»å·¦åºæãã¯ãã«ãå¾ãããã
æ¯è¼
3ã¤ã®æ¹æ³ã®éããã¾ã¨ãã¦ããã
- numpy.linalg
- scipy.linalg
- scipy.sparse.linalg
- 1ã¯ä¸è¬ååºæå¤åé¡ã¯åºæ¥ãªãã
- 1ã¯å³åºæãã¯ãã«ã¯æ±ããããªãã
- 1,2ã¯LAPACK(Linear Algebra PACKage)ã3ã¯ARPACK(ARnoldi PACKage)ãä¸ã§åãã¦ããã
- 3ã¯numpy.ndarrayã ãã§ãªããscipy.sparse.csr_matrixãscipy.sparse.linalg.LinearOperatorã«ã使ããã
linalg.eig(s)ã§ã¯
- 1,2ã¯å¸¸ã«å
¨ã¦ã®åºæå¤ãæ±ããã®ã«å¯¾ãã3ã¯æ±ããåºæå¤ã®æ°ã¨ã©ãããåºæå¤ã®ã¿ãæ±ãããï¼whichã使ãï¼ãæå®ã§ããï¼ãã ããå
¨ã¦ã®åºæå¤ã¯æ±ããããªãï¼ãã¾ãã1,2ã§ã¯åºæå¤ã®ä¸¦ã³ã¯æ±ºã¾ã£ã¦ããªãã®ã«å¯¾ãã
3ã§ã¯åºæå¤ã®ä¸¦ã³ã¯æé ã
[2015.7.1 è¨æ£] scipy.sparseã§ãeigsã®åºæå¤ã®ä¸¦ã³ã¯æ±ºã¾ã£ã¦ãã¾ããã§ãããå®éãé©å½ã«ã©ã³ãã ãªè¡åãä½ã£ã¦è¨ç®ãåãã¦ã¿ãã¨ãæé ã«ãªãæããéé ã«ãªãæãããã©ãã©ã«ãªãæããããããªã®ã§ãåºæå¤ã®é ãæå®ãããã¨ãã¯ãã½ã¼ãããªãã¨ãããªãã
ã¨ã«ãã¼ãè¡åã®linalg.eig(s)hã§ã¯
- 1ã¯å¸¸ã«å ¨ã¦ã®åºæå¤ãæ±ããã®ã«å¯¾ãã2,3ã¯æ±ããåºæå¤ã®æ°ãæå®ã§ãããããã«ã3ã¯ã©ãããåºæå¤ã®ã¿ãæ±ãããï¼whichã使ãï¼ãæå®ã§ããï¼ãã ãã3ã¯å ¨ã¦ã®åºæå¤ã¯æ±ããããªãï¼ãåºæå¤ã®ä¸¦ã³ã¯ã1ã¯æ±ºã¾ã£ã¦ãããã2,3ã¯æé ã
â» 3.spaeseãå ¨ã¦ã®åºæå¤ãæ±ããããªãã®ã¯Lanczos or Arnoldiã«åºã¥ãã¦ããã®ã§ã
以ä¸ããã2.scipy.linalgã¯1.numpy.linalgã®ä¸ä½äºæãªã®ã§ã1ã使ãçç±ã¯ãªã(æ©ãã¯1ã¨2ã¯ã»ã¨ãã©åã)ã
2.scipy.linalgã¨3.scipy.sparse.linalgã®ã©ã¡ããé¸ã¶ã¹ããã¯ãåºæå¤ãæ±ãããè¡åã®æ§è³ªãä½ãæ±ããããã«ä¾ã£ã¦å¤ããï¼æ©ãã¯è¡åã®æ§è³ªã«ä¾ãï¼ã
ä¾ãã°ãå¯ãªè¡åã®å
¨ã¦ã®åºæå¤ãæ±ãããæã¯2ããçãªè¡åã®æå¤§åºæå¤ã®ã¿ãæ±ãããæã¯3ãé¸ã¶ï¼ãã ããæå¤§åºæå¤ãã»ã¼ç¸®éãã¦ããæã¯ã3ã¯iterative methodsãªã®ã§é
ãï¼ã
å¯è¡åã§ãã¢ãã¦ã¿ãã¨ãããæå¤§åºæå¤ã®ã¿ãæ±ããå ´åã縮éãããæã¯2ã®æ¹ã2åãããéãã縮éããªãæã¯3ã®æ¹ã100åãããæ©ãã£ãã
http://stackoverflow.com/questions/11083660/python-eigenvectors-differences-among-numpy-linalg-scipy-linalg-and-scipy-spar
http://stackoverflow.com/questions/24418534/least-eigenvalue-in-python
ã¾ããä¸ã®3ã¤ä»¥å¤ã«ãMPIã使ã£ãSLEPcã¨ãããããããã®ã§ã並ååãã人ã¯ããããã
http://stackoverflow.com/questions/6684238/whats-the-fastest-way-to-find-eigenvalues-vectors-in-python
*1:æ®éã®åºæå¤åé¡ãAx=axã«å¯¾ããä¸è¬ååºæå¤åé¡ã¯Ax=aMxã®ãããªåºæå¤åé¡ã®ãã¨ã
*2:numpy.linalg.eighã¯åºæå¤ã®é ãæããªãã®ã§ãnumpy.linalg.eighã§ã½ã¼ãããããªãã工夫ããªãã¨ã ããä¾ãã°ã以ä¸ããªã³ã¯ãåèãhttp://stackoverflow.com/questions/7839413/python-numpy-compute-first-eigenvalue-and-eigenvectorãhttp://d.hatena.ne.jp/nohzen/20140407/1396852091 ãã ããscipyã使ãã°ãåºæå¤ã®é ãæåããæãã¦ãããã®ã§ãScipyã使ã£ãæ¹ã楽ã§ãã
*3:ãããããå®å¯¾ç§°è¡åãã¨ã«ãã¼ãè¡åã®ãã¹ã¦ã®åºæå¤ãæ±ããåºæãã¯ãã«ãåå²çµ±æ²»æ³ã使ã£ã¦æ±ãã颿° http://d.hatena.ne.jp/blono/20080925/1222296801