Eger kovaryans matrisleri ile ugrasiyorsak bazen bu matrislerin tersini almamiz gerekebiliyor. Eger elimizdeki kovaryans matrisi essiz (singular) degil ise (kovaryans matrisi zaten pozitif kesin olur) o zaman matris tersini alma islemini Cholesky ayristirmasi ile yapabiliriz.
Diyelim ki \(\boldsymbol{\Sigma}\) bir pozitif kesin kovaryans matrisi. O zaman Cholesky ayrıştırması
\[\boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^T\]
ki \(\mathbf{L}\) bir alt üçgensel (lower triangular) matristır, ve dikgendeki öğeler pozitiftir. Bulmak istediğimiz \(\boldsymbol{\Sigma}^{-1}\). Bu işlemi ayrıştırmaya uygularsak,
\[\boldsymbol{\Sigma} = \mathbf{L}\mathbf{L}^T\]
İki tarafın tersini alalım,
\[\boldsymbol{\Sigma}^{-1} = (\mathbf{L}\mathbf{L}^T)^{-1}\]
Şu özelliği kullanalım, \((\mathbf{A}\mathbf{B})^{-1} = \mathbf{B}^{-1}\mathbf{A}^{-1}\):
\[\boldsymbol{\Sigma}^{-1} = (\mathbf{L}^T)^{-1}\mathbf{L}^{-1}\]
Ya da
\[\boldsymbol{\Sigma}^{-1} = \mathbf{L}^{-T}\mathbf{L}^{-1}\]
Ya da
\[ \boldsymbol{\Sigma}^{-1} = (\mathbf{L}^{-1})^T \mathbf{L}^{-1} \]
ki \(\mathbf{L}^{-T}\) büyüklüğü şu ile aynı \((\mathbf{L}^T)^{-1}\).
Bu hesap hesapsal açıdan daha verimlidir çünkü,
\(L\) hesabı: Cholesky’nin hesapsal yükü \(O(n^3/3)\) (dikkat bölü 3 bir sabit fakat gerçek dünya uygulamalarında bu fark yaratıyor).
\(L\) tersi: \(\mathbf{L}\) iş üçgensel olduğu için \(\mathbf{L}^{-1}\) işlemi geriye değer sokma (back-substitution) ile \(O(n^3/3)\), genel matris tersini alma işleminden daha hızlı.
A = np.random.rand(3,3)
B = A @ A.T
L = np.linalg.cholesky(B)
Linv = np.linalg.inv(L)
Binv1 = Linv.T @ Linv
print ('Cholesky ile')
print (Binv1,'\n')
print (u'Klasik yöntem')
Binv2 = np.linalg.inv(B)
print (Binv2)Cholesky ile
[[ 404.6037679 -313.9944771 -106.74225974]
[-313.9944771 258.50401095 65.98449623]
[-106.74225974 65.98449623 48.13729976]]
Klasik yöntem
[[ 404.6037679 -313.9944771 -106.74225974]
[-313.9944771 258.50401095 65.98449623]
[-106.74225974 65.98449623 48.13729976]]