Trăn Gram-Schmidt

Xem các phiên từ Hội nghị chuyên đề WiML về các mô hình khuếch tán với KerasCV, ML trên thiết bị, v.v. Xem theo yêu cầu

  • TenorFlow
  • Tài nguyên
  • xác suất
  • API

tfp. môn Toán. gram_schmidt Sắp xếp ngăn nắp với các bộ sưu tập Lưu và phân loại nội dung dựa trên sở thích của bạn

Thực hiện thuật toán chỉnh hình Gram-Schmidt đã sửa đổi

tfp.math.gram_schmidt[
    vectors, num_vectors=None
]

Ở đây ta giả sử rằng các vectơ độc lập tuyến tính. Các vectơ không sẽ không thay đổi, nhưng cũng sẽ sử dụng một phép lặp đối với num_vectors

Từ 1]. "MGS tương đương về mặt số với phân tích thừa số QR của Chủ nhà được áp dụng cho ma trận A được tăng cường bằng ma trận vuông không có phần tử nào ở trên cùng. "

Ghi chú lịch sử, xem [1]. Gram-Schmidt "đã sửa đổi" được tạo ra bởi Laplace [2], để loại bỏ và không phải là một thuật toán trực giao. Gram-Schmidt "cổ điển" thực sự đến sau [2]. Gram-Schmidt cổ điển đôi khi có sự mất trực giao nghiêm trọng đối với các ma trận có điều kiện kém, điều này sẽ được thảo luận thêm trong [1]

Người giới thiệu

[1] Bjorck, A. [1994]. Số trực giao gram-schmidt. Đại số tuyến tính và các ứng dụng của nó, 197, 297-316

[2] P. S. Laplace, Lý thuyết phân tích xác suất. Bổ sung hàng đầu, thưa bà. Tòa án, Paris, 1816

[3] E. Schmidt, über die Auflosung linearer Gleichungen mit unendlich vielen Unbekannten, Rend. lưu thông. Chiếu. Pulermo [1] 25. 53-77 [1908]

Việc thực hiện được lấy từ Smile. https. //github. com/haifengl/smile/blob/master/core/src/main/java/smile/projection/RandomProjection. java

double[][] X;
Math.unitize[X[0]];
for [int i = 1; i < p; i++] {
    for [int j = 0; j < i; j++] {
        double t = -Math.dot[X[i], X[j]];
        Math.axpy[t, X[j], X[i]];
    }
    Math.unitize[X[i]];
}

ở đâu

  • Math.unitize unit-chuẩn hóa vector
  • Math.axpy cập nhật một mảng bằng cách thêm bội số của một mảng khác y = a * x + y
  • ở đây X[i] là cột thứ $i$ của $X$

con trăn

def normalize[v]:
    return v / np.sqrt[v.dot[v]]

n = len[A]

A[:, 0] = normalize[A[:, 0]]

for i in range[1, n]:
    Ai = A[:, i]
    for j in range[0, i]:
        Aj = A[:, j]
        t = Ai.dot[Aj]
        Ai = Ai - t * Aj
    A[:, i] = normalize[Ai]


thừa số QR

Chúng ta có thể nghĩ về Quy trình Gram-Schmidt bằng ngôn ngữ ma trận [như đối với Loại bỏ Gaussian đưa chúng ta đến Nhân tố hóa LU]

Trong đại số tuyến tính, các cơ số trực giao có nhiều tính chất hay. Ví dụ, các ma trận bao gồm các vectơ cột trực giao [a. k. một. ma trận trực giao] có thể dễ dàng đảo ngược bằng cách chuyển đổi ma trận. Ngoài ra, chẳng hạn, việc chiếu các vectơ trên các không gian con được kéo dài bởi các vectơ trực giao với nhau sẽ dễ dàng hơn. Quá trình Gram-Schmidt là một thuật toán quan trọng cho phép chúng ta chuyển đổi một cơ sở tùy ý thành một cơ sở trực giao bao trùm cùng một không gian con. Trong bài đăng này, chúng tôi sẽ triển khai và trực quan hóa thuật toán này ở dạng 3D với thư viện Nguồn mở phổ biến manim

Quy trình Gram-Schmidt

Xét một vài không gian con ddd tùy ý AA=a1,,ad

được kéo dài bởi các vectơ độc lập tuyến tính a1,…,ada_1, \dots, a_da1< . Chúng tôi muốn tìm cơ sở sau bao trùm cùng một không gian con. ,,ad. We want to find the following basis spanning the same subspace: A=⟨q1,…,qd⟩A = \langle q_1, \dots, q_d \rangleA=q1,,qd

Quy trình Gram-Schmidt là một thuật toán lập trình động điển hình, vì ý tưởng cốt lõi đằng sau nó là tạo ra ⟨q1,…,qi⟩\langle q_1, \dots, q_i . Công trình thi công như sau. q1,,qi an orthogonal basis assuming ⟨q1,…,qi−1⟩\langle q_1, \dots, q_{i-1} \rangleq1,,qi1 is already such a basis. The construction works as follows:

Bước 1. Đối với q1q_1q1 . a1a_1a1 and normalize it: q1. =a1∥a1∥q_1. = \frac{a_1}{\lVert a_1 \rVert}q1:=a1a1

Bước 2. q2q_2q2 phải . Chúng ta có thể làm điều này bằng cách trừ đi hình chiếu của ⟨q1⟩\langle q_1 \rangleq1, so we need to find out the component of a2a_2a2 that is orthogonal to ⟨q1⟩\langle q_1 \rangleq1. We can do this by subtracting the projection of a2a_2a2​< . onto ⟨q1⟩\langle q_1 \rangleq1 from a2a_2a2: q2′. =a2−[q1⊤a2]q1q1⊤q1=a2−[q1⊤a2]q1q'_2. = a_2 - \frac{[q_1^\top a_2] q_1}{q_1^\top q_1} = a_2 - [q_1^\top a_2] q_1q2:=a2q1q1[q1a2]q1=a2[q1a2]q1

Dạng thứ hai đúng vì chúng tôi đã chuẩn hóa q1q_1q1 vector and the denominator is thus equal to one.

Bước này có thể được hình dung như sau

Cuối cùng, chúng ta cần chuẩn hóa véc-tơ kết quả. q2. =q2′∥q2′∥q_2. = \frac{q'_2}{\lVert q'_2 \rVert}q2:=q2q2

Bước 3. q3q_3q3 phải . ⟨q1,q2⟩\langle q_1, q_2 \rangleq1,q2, which is already an orthogonal basis, so q3q_3q3 must be orthogonal to both ⟨q1⟩\langle q_1 \rangleq1 and ⟨q2⟩\langle q_2 \rangleq2 which means that we need to subtract the projections of a3a_3a3 onto both ⟨q1⟩\langle q_1 \rangleq1 and ⟨q2⟩\langle q_2 \rangleq2 from a3a_3a3: q3′. =a3−[q1⊤a3]q1−[q2⊤a2]q2q'_3. = a_3 - [q_1^\top a_3] q_1 - [q_2^\top a_2] q_2q3′ . :=a3[q1a3]q1[q2a2]q2

Như trong bước trước, chúng ta chuẩn hóa véc-tơ. q3. =q3′∥q3′∥q_3. = \frac{q'_3}{\lVert q'_3 \rVert}q3:=q3q3

Tổng quát hơn, chúng ta có thể viết công thức cho bước 1≤i≤d1 \le i \le d1id as follows:

Bước i. qiq_iqi phải . Bởi vì trong các bước trước chúng ta đã thực hiện ⟨q1,…,qi−1⟩\langle q_1, \dots, q_{i-1} \rangleq1,,qi1. Because in the previous steps we made ⟨q1,…,qi−1⟩\langle q_1, \dots, q_{i-1} \rangle⟨ . jq1,,qi1 an orthogonal basis, it follows that qiq_iqi must be orthogonal to each vector from {qj:j

Chủ Đề