線性代數中,科列斯基分解(英語:Cholesky decomposition 或 Cholesky factorization)是指將一個正定的埃爾米特矩陣分解成一個下三角矩陣與其共軛轉置之乘積。這種分解方式在提高代數運算效率、蒙特卡羅方法等場合中十分有用。實數矩陣的科列斯基分解由安德烈-路易·科列斯基最先發明。實際應用中,科列斯基分解在求解線性方程組中的效率約兩倍於LU分解。[1]
此條目的參照需要清理,使其符合格式。 (2017年8月30日) |
描述
對正定埃爾米特矩陣進行科列斯基分解,即求矩陣使下式成立
其中,是一個下三角矩陣且所有對角元素均為正實數,表示的共軛轉置。每一個正定埃爾米特矩陣都有一個唯一的科列斯基分解。[2]
當矩陣是一個半正定的埃爾米特矩陣,若允許的對角線元素為零,則也存在上述形式的分解。[3]
當為實數矩陣,則也為實數矩陣且科列斯基分解可改寫成。[4]
當是正定矩陣時,科列斯基分解是唯一的,即只存在一個對角元素均嚴格大於零的下三角矩陣,使成立。然而,當是半正定時,分解則不一定是唯一的。
LDL分解
經典科列斯基分解的一個變形是LDL分解,即
該分解與經典科列斯基分解猶有關聯,如下:
或者,由於的對角元素必須為,且與都是下三角矩陣,故如果已知經典科列斯基分解,則形式可依下式求出,設S是包含的對角元素的對角矩陣,
LDL變形如果得以有效執行,構造及使用時所需求的空間及計算的複雜性與經典科列斯基分解是相同的,但是可避免提取平方根。[5]某些不存在科列斯基分解的不定矩陣,也可以執行LDL分解,此時矩陣中會出現負數元素。因此人們更傾向於使用LDL分解。對於實數矩陣,該種分解的形式可被改寫成
實例
以下乃一個實對稱矩陣的科列斯基分解︰
以下乃其LDLT分解︰
應用
科列斯基分解主要被用於線性方程組的求解。如果A是對稱正定的,我們可以先求出,隨後借向後替換法對y求解,再以向前替換法對x求解即得最終解。
另一種可避免在計算時需要解平方根的方法就是計算,然後對y求解,最後求解
對於可以被改寫成對稱矩陣的線性方程組,科列斯基分解及其LDL變形是一個較高效率及較高數值穩定性的求解方法。相比之下,其效率幾近為LU分解的兩倍。[來源請求]
若欲對埃爾米特矩陣直接求逆,可以通過科列斯基分解,類似求解線性方程組一般求出逆矩陣,這需要次運算(次乘法運算)。 該方法即便要求逐步計算也非常有效率。
非埃爾米特矩陣也可以通過下例性質求逆,因為其中總是埃爾米特矩陣︰
計算
有各種各樣的方法用於計算科列斯基分解。 常用的演算法的計算複雜度在一般情況下為。[來源請求]
下面的演算法何者較快取決於執行時的具體條件。總體而言,第一個演算法會稍慢,因為其以一種不太尋常的方式讀取數據。
用於計算矩陣的科列斯基演算法,是以高斯消元法為基礎而調整得來的。
遞歸演算法由開始,令
在步驟,矩陣的形式如下:
其中,代表維的單位矩陣。
此時定義矩陣為
隨即可以被改寫成
其中
注意︰在此是一個外積。
重複此步驟直到從到。步之後,我們得到。因此,所求的下三角矩陣為
寫出等式,
則得到矩陣的元素的計算公式如下︰
只要是實數正定矩陣,則平方根下的表達式恆為正。
對於複埃爾米特矩陣,則適用如下公式:
因此,要計算只需利用其的左、上方元素的值。計算通常是以以下其中一種順序進行的。
- 科列斯基-巴那齊耶維茨演算法從矩陣L的左上角開始,依行進行計算。
- 科列斯基-克勞特演算法從矩陣L的左上角開始,依列進行計算。
若有需要,整個矩陣可以逐個元素計算得出,無論使用何種順序讀取。
假設我們要求解一個良置的線性方程組。採用了LU分解的演算法,除非進行某種繞軸旋轉,否則是不穩定的;如果演算法進行了繞軸旋轉,則其誤差取決於矩陣的增長因子,這個數通常(但非總是)很小。
現在,假設演算法適用科列斯基分解。如上所述,演算法的效率將會是原來的兩倍。此外,無必要進行繞軸旋轉且誤差總是很小。具體而言,若要求解,表示已計算出的解,然後能解出干擾方程組,其中
在這裏,是指矩陣2-範數,而是一個取決於的小常數,表示單位捨入。
值得一提的是,科列斯基分解與平方根的使用有關。如果被分解的矩陣是正定的,那麽只要運算精確,矩陣中帶有平方根的元素的平方根下的數字永遠是正數。不幸的是,由於存在捨入誤差,這些數字可能為負數,並使演算法擱淺。然而,此種情況僅當矩陣為病態時才會出現。一種可解決此問題的方法,是增添一個對角修正矩陣至待分解矩陣,以增加矩陣的正定性。[6] 此法雖或將減少分解的準確性,但有在某些情況卻頗有作為;譬如,執行應用於最佳化的牛頓法時,若初期值距最優值較遠,則此時引入對角矩陣可以提高演算法的穩定性。
科列斯基分解的另一種形式——LDL分解的計算方式如下所示,
如果 是實數矩陣,下述之遞歸計算式適用於矩陣 及 中的所有元素︰
如果 是複埃爾米特矩陣,則矩陣 及 的計算適用以下公式:
同樣地,若有需求,該讀取順序可以逐一計算矩陣中的每一個元素。
當是一個不定矩陣時,LDL分解在未經過謹慎的繞軸旋轉的情況下是不穩定的;[7] 特別是,分解出的矩陣的元素可能是任意的。一個可取的改進手段是執行矩陣分塊後再執行分解,通常將原矩陣分為包含的小矩陣的分塊矩陣:[8]
在此,矩陣中每一個元素都是一個子矩陣。故此,可依照上述遞歸公式模擬計算:
上述計算涉及矩陣相乘同精確的求逆,故而實踐中不能使用過大的分塊矩陣。
在實踐中經常有修正科列斯基分解的需求。即,經已計算一些矩陣的科列斯基分解,然後在上稍作修改而產生的矩陣,欲對其進行一個修正的科列斯基分解。問題是,能否用已知的的分解去修正的分解。
如果修正矩陣,則其修正的分解被稱為秩為1的修正(相加)。。
以下是一個 MATLAB 語言寫的實現秩為1的修正的小程式:
function [L] = cholupdate(L,x)
n = length(x);
for k=1:n
r = sqrt(L(k,k)^2 + x(k)^2);
c = r / L(k, k);
s = x(k) / L(k, k);
L(k, k) = r;
L(k+1:n,k) = (L(k+1:n,k) + s*x(k+1:n)) / c;
x(k+1:n) = c*x(k+1:n) - s*L(k+1:n,k);
end
end
如果,那麽只有當仍然是正定的時候該方法才適用。
此條件下,上面的代碼也可用於相減的情況,只需要將r
和L(k+1:n,k)
的賦值式的加號替換成減號。
證明半正定矩陣的科列斯基分解唯一
上面的演算法表明,每一個正定矩陣都有一個科列斯基分解。此結論可以加入一些限制條件後,推廣到半正定的情況。但該條件並未被完全建立,例如,它未給出明確的數值演算法以計算科列斯基因子。
如果是一個的半正定矩陣,則序列是一個由正定矩陣構成的序列。而且,在算子範數中
在正定的情形下,每一個都有其科列斯基分解。根據算子範數的性質,
因而是算子巴拿赫空間上的一個有界集,因此是相對緊空間(因為基礎向量空間是有限維的)。因此,它有一個帶有限制收斂子序列,也記作。容易驗證,矩陣具有所需的特性,例如,滿足以及是下三角矩陣且其對角元素非負。對於所有的和都有,
因此,。因為基礎向量空間是有限維的,所以算子空間的所有拓撲結構都是等價的。故此,範數上收斂於,意味着,的每個元素都獨立地收斂於。此同時暗示,由於每個都是對角元素非負的下三角矩陣,亦如此。
推廣
科列斯基分解可以推廣到元素中包含算子的矩陣(稱為算子矩陣)。[來源請求]令是希爾伯特空間上的一個序列。考慮如下算子矩陣
滿足直和
其中每一個
都是一個有界算子。如果是正定或半正定的,即對於有限的及任意的
都有,則存在一個下三角的算子矩陣使得。此外也可以把的對角元素化為正數。
用程式語言實現
- C語言︰GNU科學庫提供了幾個科列斯基分解的實現。
- Maxima電腦代數系統︰函數Cholesky可用於計算科列斯基分解。
- GNU Octave數值計算系統提供了一些函數以計算,修正和應用科列斯基分解。
- LAPACK庫提供了一個高效能的科列斯基分解的實現,可以以Fortran,C語言及其他大多數語言讀取。
- 在Python中,numpy.linalg模組中的命令Cholesky可執行科列斯基分解。
- 在Matlab中,chol命令可以簡單地對一個矩陣進行科列斯基分解。
- 在R語言中,chol函數可進行科列斯基分解。
- 在Wolfram Mathematica中,函數CholeskyDecomposition可以對一個矩陣執行科列斯基分解。
- 在C++中,armadillo庫中的命令chol可執行科列斯基分解。特徵庫提供了稀疏矩陣和稠密矩陣的科列斯基分解。
- 在Analytica中,函數Decompose提供科列斯基分解。
- Apache Commons數學庫中有科列斯基分解的實現,可應用於Java、Scala及任何其他JVM語言。
參見
腳註
參考文獻
外部連結
Wikiwand in your browser!
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.