Giới thiệu
Phân tích QR là một trong những vấn đề được quan tâm nhất trong Đại số tuyến tính khoảng nửa cuối thế kỉ trước [22]. Giả sử chúng ta có ma trận A, với các không gian tạo bởi các cột đầu tiên của A: 𝑎1, 𝑎2, …của ma trận A, nghĩa là các không gian 〈𝑎1〉, 〈𝑎1, 𝑎2〉, 〈𝑎1, 𝑎2, 𝑎3〉, …Ta có:
〈𝑎1〉 ⊆ 〈𝑎1, 𝑎2〉 ⊆ 〈𝑎1, 𝑎2, 𝑎3〉 ⊆ ⋯
Trong đó, 〈𝑎1〉 là không gian một chiều tạo bởi cơ sở {𝑎1}, 〈𝑎1, 𝑎2〉 là không gian 2 chiều tạo bởi {𝑎1, 𝑎2}, …và các 𝑎𝑖 phải độc lập tuyến tính.
Lưu ý: Một hệ các vector {𝑎1, 𝑎2, … , 𝑎𝑁} trong không gian vector A được gọi là
độc lập tuyến tính nếu chỉ tồn tại các số 𝑘1, 𝑘2, …, 𝑘𝑁 đồng thời bằng 0 (ngược lại với
định nghĩa “phụ thuộc tuyến tính” sao cho:
k1𝑎1 + k2𝑎2 + … + kN𝑎𝑁 = 0
Mặc dù các không gian này tồn tại và ta biết tập sinh của chúng, nhưng không chắc rằng các vector cơ sở này trực giao với nhau. Ý tưởng chính của phân tích QR là
70 đi tìm một dãy các vector q1, q2, …, qj độc lập tuyến tính, trực giao và tạo thành cơ sở trực chuẩn cho các không gian nói trên.
Nói một cách chính xác, cho trước ma trận A ∈ Cm x n, m≥n có hạng là n (nghĩa là các cột của A độc lập tuyến tính). Ta muốn tìm dãy các vector q1, q2, …, qj thỏa tính chất:
〈q1, q2, … , qj〉 = 〈𝑎1, 𝑎2, … , 𝑎𝑗〉 j = 1, …, n
Để đảm bảo tính chất này, với mỗi j thì 𝑎1, 𝑎2, … , 𝑎𝑗 là tổ hợp tuyến tính của q1, q2, … , qj. Như vậy ta có:
Hay ngắn gọn hơn:
A = QR
Trong đó, Q ∈ Cm x n có các cột là các vector trực giao, và R ∈ Cm x n là ma trận tam giác trên. Phép phân tích như vậy (nếu có) gọi là phân tích QR rút gọn của ma trận A.
Các phương pháp phân tích QR
Có 3 phương pháp thường được dùng để tính phân tích QR của ma trận là Trực chuẩn hóa Gram-Schmidt (Gram-Schmidt orthogonalization), chéo hóa Householder (Householder triangularization) và phép quay Given [22]. Vì phép quay Given tác giả không tìm được nhiều tài liệu nói về nó, nên phần này sẽ nói sơ qua tư tưởng chính của 2 phương pháp Householder và Gram-Schmidt cùng với chi phí tính toán của chúng.
Phương pháp Gram–Schmidt:
Trong phương pháp Gram-Schmidt, ta lần lượt nhân bên phải ma trận A với các ma trận tam giác trên R1, R2,… Rn sao cho ma trận kết quả cuối cùng:
71 Phương pháp Householder:
Ngược lại, phương pháp Householder lần lượt nhân bên trái ma trận A với các ma trận unitary Q1, Q2,… Qn cơ sở sao cho ma trận kết quả:
Q1Q2… QnA = R Ta có bảng so sánh sau [22]:
Bảng 4.1. So sánh 2 phương pháp Gram-Schmidt và Householder
Nhìn chung phương pháp Householder tỏ ra stable hơn Gram-Schmidt. Với ma trận A∈ Cm x n thì phương pháp Gram-Schmidt có độ phức tạp tính toán khoảng 2mn2, trong khi Householder có độ phức tạp tính toán khoảng 2mn2 - 2
3n3, vì vậy ta chọn thuật toán Householder để phân tích QR.
Thuật toán HouseHolder
Phương pháp lặp Householder để tính QR decomposition được Alston Householder đề xuất năm 1958. Ý tưởng chính của phương pháp này là chọn các ma trận unitary Qk sao cho Qn… . Q2Q1A là ma trận tam giác trên.
Tức là:
Q1, Q2, …QnA = R
Để làm được điều đó, Qk phải được chọn sao cho nó sẽ làm cho các phần tử bên dưới đường chéo chính của cột k trong ma trận A thành 0. Ví dụ với ma trận 5x3 thì sẽ cần 3 phép nhân ma trận như sau (Trong đó x là các phần tử không nhất thiết bằng 0, và các phần tử in đậm là những phần tử thay đổi sau mỗi bước).
72 Một cách tổng quát, Qk sẽ làm việc trên các dòng từ k đến m của A. Tại thời điểm bắt đầu của bước thứ k, trên các dòng từ k đến m đã có sẵn k - 1 cột bằng 0. Việc áp Qk lên những cột này cũng có nghĩa là thực hiện tổ hợp tuyến tính của chúng, và tổ hợp tuyến tính của những dòng bằng 0 cũng bằng 0. Cuối cùng sau n bước, tất cả các phần tử bên dưới đường chéo chính đều bằng 0, và Qn… Q2Q1A = R là ma trận tam giác trên.
Vấn đề làm sao tính được Qk ?
Cách tiếp cận chuẩn mực thường sử dụng Qk là ma trận unitary có dạng sau [22]: Qk = [I 0
0 F]
Trong đó I là ma trận đơn vị kích thước (k - 1) × (k - 1) và F là ma trận unitary kích thước (m – k + 1) × (m – k + 1). Khi thực hiện phép nhân Qk với A thì F có nhiệm vụ tạo các giá trị 0 trên cột thứ k của A. Phương pháp Householder sử dụng một dạng ma trận F đặc biệt gọi là Householder reflector.
Giả sử tại bước thứ k, ta gọi các phần tử từ k đến m của cột k là vector x ∈ Cm−k+1. Để có thể gán 0 cho các phần tử bên dưới đường chéo chính thì F phải thực hiện được ánh xạ sau:
73 Hình 4.6. Householder reflection
Hình trên thể hiện ý tưởng để thực hiện ánh xạ này. Ma trận F thể hiện phép đối xứng điểm x qua siêu phẳng H vuông góc với v = ‖x‖e1 - x. Khi đó đối xứng của x qua H sẽ là ‖x‖e1. Người ta đã chứng minh được [23] phép chiếu trực giao của một điểm y ∈ Cm lên siêu phẳng H được biểu diễn bằng ma trận:
Py = (I −vvT
vTv)y = y – v(vTy vTv)
Như vậy để tìm điểm đối xứng của y qua H, ta cần tiến thêm một đoạn gấp đôi trên cùng phương đó. Do vậy Householder reflector Fy sẽ là:
Fy = (I − 2vvT vTv)y = y – 2v(vTy vTv) Do đó ma trận F là: F = I – 2vv T vTv
Hình 4.6 được vẽ đơn giản để dễ hiểu, trên thực tế có nhiều siêu phẳng H khác nhau để đối xứng điểm x thành z||x||e1 với z là giá trị vô hướng nào đó sao cho |z| = 1. Trong trường hợp 2 chiều đang xét, nếu A là ma trận phức thì có thể có một vòng tròn các điểm đối xứng, trong trường hợp là số thực thì cũng có 2 phép đối xứng qua 2 siêu phẳng H+ và H− khác nhau:
74 Hình 4.7. Householder 2 khả năng lựa chọn
Về mặt toán học, ta có thể chọn bất kì phép đối xứng nào vì chúng đều thỏa mãn yêu cầu. Tuy nhiên đến đây thì vai trò của việc tính toán sẽ ảnh hưởng đến việc chọn phép đối xứng nào là “tốt nhất”. Chúng ta muốn chọn phép đối xứng sao cho z||x||e1 không quá gần với bản thân x, để phép trừ v = z||x||e1 - x không bị làm tròn về 0 (nếu v = 0 thì ma trận F sẽ không tính được). Để làm được điều này, ta có thể chọn z = - sign(x1), trong đó x1 là phần tử đầu tiên của vector x. Như vậy vector pháp tuyến của siêu phẳng H sẽ là v = -sign(x1) ||x||e1 - x, hay bỏ các dấu trừ, ta có:
v = sign(x1) ||x||e1 + x Với sign(x1) = 1 x1 ≥ 0
Để đễ hiểu hơn, ta xét một ví dụ dưới đây: Giả sử ta có ma trận:
Chúng ta khởi tạo 1 ma trận sao chép của A, ta gọi là 𝐴(0) = A.
Việc cần làm là tìm các ma trận trực giao 𝐐𝐤 sao cho ma trận A biến thành ma trận tam giác trên.
Bước 1: Tính vector trực giao v
Ở ví dụ này, tác giả sẽ chọn vector v là mặt phẳng 𝐻− để có sự “khác biệt” như đã đề cập tới về việc chọn siêu phẳng.
75 vi = a1 - sign(a11)||a1||e1
Trong đó:
vi: vector trực giao với siêu phẳng H
𝑎1: độ dài vector cột thứ nhất trong ma trận Ak 𝑎11: phần tử dòng 1, cột 1 của ma trận Ak
Sign(𝑎11): nếu 𝑎11 là số dương thì Sign(𝑎11) = 1, ngược lại Sign(𝑎11) = -1. e1: cột thứ nhất của ma trận đơn vị cỡ bằng với Ak
Chú ý: Trong ngôn ngữ lập trình, vị trí bắt đầu từ 0. Cụ thể:
v1 = 𝑎1 - sign(𝑎11)||𝑎1||e1
Bước 2: Tính ma trận reflector H (Thực chất chính là Qk mà ta muốn tìm) Hi = I – 2 vivi
T
viTvi Trong đó:
I: Ma trận đơn vị
viT: vector chuyển vị của vi Cụ thể:
76 Bước 4: Sau khi tổ hợp Q1 với A, ta thấy cột đầu tiên của ma trận A đã về dạng mà ta mong muốn (các giá trị từ k - 1 trở đi đều bằng 0), từ đây ta cắt ma trận A(1) tại vị trí bắt đầu từ dòng 2, cột 2. Như vậy ta có:
Bước 5: Lặp lại bước 1, với vector trực giao v2
Bước 6: Tính ma trận reflector H (hay Q)
77 Ma trận A(2) đã trở thành ma trận tam giác trên.
Từ đó, ta tính ngược lại được ma trận Q:
Vậy là chúng ta đã xong thuật toán phân tích ma trận QR, ta đã có ma trận Q và R, từ đây ta sẽ qua bước lặp QR để tìm trị riêng.