Bài 26: Singular Value Decomposition

Bài 26: Singular Value Decomposition

Trên trang này:

  • 1. Giới thiệu
  • 2. Một chút về đại số tuyến tính
    • 2.1. Eigenvalues ​​và Eigenvectors
    • 2.2. Hệ thống trực giao và trực giao
    • 3. Phân rã giá trị số ít
      • 3.1. khai báo svd
      • 3.2. Nguồn gốc của sự phân tách giá trị đơn lẻ của tên
      • 3.3. Nén svd
      • 3.4. Đoạn svd bị cắt ngắn
      • 3.5. Thứ hạng tốt nhất (k ) gần đúng
      • 4. svd
        • Một số ứng dụng của 4.1. Nén hình ảnh
        • 4.2. Svd được cắt ngắn cho các hệ thống tư vấn
        • 5. Thảo luận
        • 6. Tài liệu tham khảo
        • 1. Giới thiệu

          Bạn có thể nhớ một loại bài toán mà bạn thường làm khi học đại số tuyến tính: các bài toán về đường chéo hóa ma trận. Vấn đề là: nếu có một ma trận đường chéo ( mathbf {d} ) và một ma trận khả nghịch ( mathbf {p} ) sao cho: [ mathbf {a} = mathbf {p} mathbf {d} mathbf {p} ^ {-1} ~~~~ (1) ] Số phần tử khác không của ma trận đường chéo ( mathbf {d} ) là hạng của ma trận ( mathbf {một}).

          Bạn Đang Xem: Bài 26: Singular Value Decomposition

          Nhân cả hai vế của ((1) ) với ( mathbf {p} ), ta được:

          [ mathbf {ap} = mathbf {pd} ~~~~ (2) ]

          lần lượt gọi ( mathbf {p} _i, mathbf {d} _i ) ma trận ( mathbf {p} ) và ( mathbf {d) column (i ))} ) . Vì mọi cột ở bên trái và bên phải của ((2) ) phải bằng nhau, chúng ta nhận được:

          [ mathbf {ap} _i = mathbf {pd} _i = d_ {ii} mathbf {p} _i ~~~~ (3) ] trong đó (d_ {ii} ) là phần tử (i ) của ( mathbf {p} _i ).

          Dấu bằng thứ hai xuất hiện vì ( mathbf {d} ) là ma trận đường chéo, tức là ( mathbf {d} _i ) chỉ có một thành phần (d_ {ii} ) riêng biệt. 0, nếu bạn nhớ, biểu thức ((3) ) có nghĩa là mỗi phần tử (d_ {ii} ) phải là ( mathbf {a} ) và mỗi vectơ cột ( mathbf {p} _i ) phải là mã riêng của ( mathbf {a} ) tương ứng với giá trị riêng (d_ {ii} ).

          Phân tích các ma trận vuông như ((1) ) còn được gọi là phân tích eigendecomposition.

          Một điểm quan trọng là phân tích cú pháp như ((1) ) chỉ hoạt động cho ma trận vuông và không phải lúc nào cũng tồn tại. Nó chỉ tồn tại nếu ma trận ( mathbf {a} ) có (n ) các ký tự riêng độc lập tuyến tính, vì nếu không thì không có ma trận ( mathbf {p} ) khả nghịch. Hơn nữa, phân tích này không phải là duy nhất, bởi vì nếu ( mathbf {p}, mathbf {d} ) thỏa mãn ((1) ) thì (k mathbf {p}, mathbf {d} ) cũng thỏa mãn rằng (k ) là bất kỳ số thực nào khác.

          So sánh ma trận với tích của nhiều ma trận đặc biệt khác (thừa số hóa ma trận hoặc thừa số hóa ma trận) mang lại nhiều lợi ích quan trọng: giảm số chiều dữ liệu, nén dữ liệu, hiểu thuộc tính của dữ liệu, giải hệ phương trình tuyến tính, phân cụm và nhiều ứng dụng khác. Hệ thống khuyến nghị cũng là một trong nhiều ứng dụng của phân tích nhân tử ma trận.

          Trong bài viết này, tôi sẽ giới thiệu với các bạn một phương pháp nhân tử hóa ma trận rất hay trong đại số tuyến tính. Phương pháp này được gọi là phân rã giá trị số ít (svd). Như bạn sẽ thấy, bất kỳ ma trận nào, không nhất thiết là vuông, có thể được phân tích như là tích của ba ma trận đặc biệt.

          Dưới đây, tôi sẽ giải thích svd và các đặc điểm và ứng dụng điển hình của nó.

          Đầu tiên, chúng ta cần xem lại đại số tuyến tính. Lưu ý rằng ma trận trong bài viết này được mặc nhiên giả định là thực .

          2. Một chút về đại số tuyến tính

          2.1. Eigenvalues ​​và Eigenvectors

          Đối với ma trận vuông ( mathbf {a} in mathbb {r} ^ {n times n} ), nếu vô hướng ( lambda ) và vectơ ( mathbf {x) } neq mathbf {0} in mathbb {r} ^ n ) thỏa mãn:

          [ mathbf {ax} = lambda mathbf {x} ] thì ( lambda ) được gọi là ( mathbf {a} ) và ( mathbf {x} ) được gọi là Eigenvector tương ứng với eigenvalue này.

          Một số thuộc tính:

          1. Nếu ( mathbf {x} ) là ký tự riêng của ( mathbf {a} ) tương ứng với ( lambda ), thì (k mathbf {x} , k neq 0 ) cũng là eigenvector tương ứng với eigenvalue.

          2. Tất cả các ma trận vuông có thứ tự (n ) có (n ) giá trị riêng (bao gồm các lần lặp), có thể là số phức.

          3. Đối với ma trận đối xứng, tất cả các giá trị riêng đều là số thực.

          4. Có một ma trận xác định dương mà các giá trị riêng của nó đều là các số thực dương. Đối với ma trận bán xác định dương, tất cả các giá trị riêng của nó là các số thực không âm.

            Thuộc tính cuối cùng có thể được suy ra từ định nghĩa của ma trận xác định dương (bán). Trên thực tế, hãy để ( mathbf {u} neq mathbf {0} ) là ký tự riêng tương ứng với các giá trị riêng ( lambda ) của ma trận xác định dương ( mathbf {a} ), chúng ta có: [ mathbf {au} = lambda mathbf {u} rightarrow mathbf {u} ^ t mathbf {au} = lambda mathbf {u} ^ t mathbf {u} = lambda || mathbf {u} || _2 ^ 2 ]

            Vì ( mathbf {a} ) là bán xác định dương, cho tất cả ( mathbf {u} neq mathbf {0} ): ( mathbf {u} ^ t mathbf { au} geq 0 ); ( mathbf {u} neq 0 ) nên (|| mathbf {u} || _2 ^ 2> 0 ). Theo đó ( lambda ) là một số không âm.

            2.2. Hệ thống trực giao và trực giao

            Một hệ thống cơ bản ({ mathbf {u} _1, mathbf {u} _2, dot, mathbf {u} _m in mathbb {r} ^ m} ) được cho là trực giao là (trực giao) nếu mỗi vectơ khác 0 và tích của hai vectơ phân biệt bất kỳ bằng 0:

            [ mathbf {u} _i neq mathbf {0}; ~~ mathbf {u} _i ^ t mathbf {u} _j = 0 ~ forall ~ 1 leq i neq j leq m ]

            Hệ cơ sở ({ mathbf {u} _1, mathbf {u} _2, dot, mathbf {u} _m in mathbb {r} ^ m} ) được gọi là hệ chính quy) nếu nó là một hệ trực chuẩn và độ dài Euclid (chuẩn 2) của mỗi vectơ là 1:

            [ begin {eqnarray} mathbf {u} _i ^ t mathbf {u} _j = left { begin {matrix} 1 & amp; text {if} & amp; i = j newline 0 & amp; text {else} end {matrix} right. ~~~~ (4) end {eqnarray} ]

            Với ({ mathbf {u} _1, mathbf {u} _2, dot, mathbf {u} _m in mathbb {r} ^ m} ) là trực giao, thì bạn có thể tính toán ngay lập tức ((4) ):

            [ mathbf {uu} ^ t = mathbf {u} ^ t mathbf {u} = mathbf {i} ]

            Trong đó ( mathbf {i} ) là ma trận nhận dạng của thứ tự (m ). Chúng tôi gọi ( mathbf {u} ) là một ma trận trực giao. Loại ma trận này không được gọi là ma trận trực giao, và ma trận trực giao không được xác định.

            Một số thuộc tính:

            1. ( mathbf {u} ^ {- 1} = mathbf {u} ^ t ): Nghịch đảo của ma trận trực giao là chuyển vị của nó.

            2. Nếu ( mathbf {u} ) là trực giao, thì phép chuyển vị ( mathbf {u} ^ t ) của nó cũng là một ma trận trực giao.

            3. Định thức của ma trận trực giao là (1 ) hoặc (- 1 ). Điều này có thể nhận được từ ( det ( mathbf {u}) = det ( mathbf {u} ^ t) ) và ( det ( mathbf {u}) det ( mathbf {u} ^ t) = det ( mathbf {i}) = 1 ).

            4. biểu diễn một ma trận trực giao cho phép quay vectơ. Giả sử có hai vectơ ( mathbf {x, y} in mathbb {r} ^ m ) và một ma trận trực giao ( mathbf {u} in mathbb {r} ^ {m times m} ). Sử dụng ma trận này để xoay hai vectơ trên, chúng ta nhận được ( mathbf {ux}, mathbf {uy} ). Tích số chấm của hai vectơ mới là: [( mathbf {ux}) ^ t ( mathbf {uy}) = mathbf {x} ^ t mathbf {u} ^ t mathbf {uy} = mathbf {x} ^ t mathbf {y} ] Vì vậy, phép quay không thay đổi tích số chấm giữa hai vectơ.

            5. Giả sử ( hat { mathbf {u}} in mathbb {r} ^ {m times r}, r & lt; m ) là một ma trận trực giao ( mathbf {u} ) được tạo từ cột (r ) của ( mathbf {u} ), chúng ta nhận được ( hat { mathbf {u}} ^ t hat { mathbf {u}} = mathbf {i} _ {r} ). Điều này có thể được suy ra từ ((4) ).

              3. Phân rã giá trị đơn lẻ

              Xem Thêm : [STOP] Dominant Finance là gì? Tìm hiểu và đánh giá về Dominant Finance lợi nhuận lên tới 20% mỗi tháng

              Vì chúng ta cần biết kích thước của từng ma trận trong phần này, tôi sẽ thay đổi ký hiệu một chút để chúng ta dễ hình dung hơn. Chúng tôi sẽ sử dụng các kích thước của nó để biểu diễn một ma trận, ví dụ ( mathbf {a} _ {m times n} ) biểu thị một ma trận ( mathbf {a} in mathbb {r} ^ {m times n} ).

              3.1. giọng nói svd

              Mọi ma trận ( mathbf {a} _ {m times n} ) đều có thể được phân tích cú pháp thành:

              [ mathbf {a} _ {m times n} = mathbf {u} _ {m times m} mathbf { sigma} _ {m times n} ( mathbf {v} _ {n lần n}) ^ t ~~~~ (5) ]

              Trong đó ( mathbf {u}, mathbf {v} ) là ma trận trực giao, ( mathbf { sigma} ) là một đường chéo với các phần tử trên ( sigma_1 geq sigma_2 geq dot geq sigma_r geq 0 = 0 = dot = 0 ) và (r ) là thứ hạng của ma trận ( mathbf {a} ). Lưu ý rằng mặc dù ( sigma ) không phải là ma trận vuông, chúng ta vẫn có thể coi nó như một ma trận đường chéo nếu các thành phần khác 0 của nó chỉ nằm trên đường chéo, tức là chỉ có các đường chéo. Số hàng và chỉ số cột giống nhau.

              Số phần tử khác không trong

              ( sigma ) là hạng của ma trận ( mathbf {a} ).

              Nếu bạn muốn xem bằng chứng về sự tồn tại của svd, bạn có thể kiểm tra nó tại đây.

              Lưu ý rằng ((5) ) không phải là duy nhất, vì chúng ta chỉ cần thay đổi các dấu của ( mathbf {u} ) và ( mathbf {v} ), sau đó ((5 ) ) vẫn hài lòng. Tuy nhiên, mọi người vẫn sử dụng “the svd” thay vì “a svd”.

              Hình 1 mô tả svd của ma trận ( mathbf {a} _ {m times n} ) trong hai trường hợp: (m & lt; n ) và (m & gt; n ). Trường hợp (m = n ) có thể được phân loại là một trong hai trường hợp trên.

              3.2. Nguồn gốc của tên phân tách giá trị số ít

              Hiện tại, bỏ qua các kích thước của mỗi ma trận, từ ((5) ), chúng ta có: [ begin {eqnarray} mathbf {aa} ^ t & amp; = & amp; mathbf {u} mathbf { sigma} mathbf {v} ^ t ( mathbf {u} mathbf { sigma} mathbf {v} ^ t) ^ t newline & amp; = & amp; mathbf {u} mathbf { sigma} mathbf {v} ^ t mathbf {v} mathbf { sigma} ^ t mathbf {u} ^ t newline & amp; = & amp; mathbf {u} mathbf { sigma} mathbf { sigma } ^ t mathbf {u} ^ t = mathbf {u} mathbf { sigma} mathbf { sigma} ^ t mathbf {u} ^ {- 1} ~~~~~~ (6) kết thúc {eqnarray} ]

              Dấu bằng

              cuối cùng xuất hiện vì ( mathbf {v} ^ t mathbf {v} = mathbf {i} ) vì ( mathbf {v} ) là một ma trận trực giao.

              Quan sát rằng ( sigma sigma ^ t ) là một ma trận đường chéo với các phần tử đường chéo ( sigma_1 ^ 2, sigma_2 ^ 2, dot ). Vì vậy, ((6) ) là bản phân tích riêng của ( mathbf {a} mathbf {a} ^ t ). Ngoài ra, ( sigma_1 ^ 2, sigma_2 ^ 2, dot ) là các giá trị riêng của ( mathbf {a} mathbf {a} ^ t ).

              Ma trận ( mathbf {a} mathbf {a} ^ t ) luôn là một ma trận bán xác định dương, vì vậy các giá trị riêng của nó đều không âm. ( sigma_i ) là căn bậc hai của các giá trị riêng của ( mathbf {a} mathbf {a} ^ t ), còn được gọi là các giá trị số ít của ( mathbf {a} ). Đây là nơi mà sự phân rã giá trị số ít nhận được tên của nó.

              Ngoài ra, mỗi cột của ( mathbf {u} ) là một ký tự riêng của ( mathbf {a} mathbf {a} ^ t ). Chúng tôi gọi mỗi cột này là vectơ số ít bên trái của ( mathbf {a} ). Tương tự như vậy, các cột của ( mathbf {a} ^ t mathbf {a} = mathbf {v} sigma ^ t sigma mathbf {v} ^ t ) và ( mathbf {v} ) vectơ số ít bên phải được gọi là ( mathbf {a} ).

              Trong python, để tính svd của ma trận, chúng tôi sử dụng mô-đun linalg của numpy như sau:

              Lưu ý rằng biến trả về s chỉ chứa các phần tử trên đường chéo ( sigma ). Biến được trả về bởi v là ( mathbf {v} ^ t ) trong ((5) ).

              3.3. svd nhỏ gọn

              Viết lại biểu thức ((5) ) dưới dạng tổng của ma trận hạng 1: [ mathbf {a} = sigma_1 mathbf {u} _1 mathbf {v} ^ t_1 + sigma_2 mathbf { u} _2 mathbf {v} _2 ^ 2 + dấu chấm + sigma_r mathbf {u} _r mathbf {v} _r ^ t ]

              Lưu ý rằng mỗi ( mathbf {u} _1 mathbf {v} ^ t_i, 1 leq i leq r ) là một ma trận hạng 1.

              Rõ ràng, trong biểu diễn này, ma trận ( mathbf {a} ) chỉ phụ thuộc vào cột đầu tiên của (r ) ( mathbf {u, v} ) và (r) ) Các giá trị 0 trên đường chéo của một ma trận không phải ( sigma ). Vì vậy, chúng tôi có một phân tích nhỏ gọn hơn, gọi nó là svd nhỏ gọn:

              [ mathbf {a} = { mathbf {u}} _ r { sigma} _r ({ mathbf {v}} _ r) ^ t ]

              Trong đó ( mathbf {u} _r, mathbf {v} _r ) là ma trận được tạo bởi (r ) trong cột đầu tiên của ( mathbf {u} ) và (tương ứng. mathbf {v} ). ( sigma_r ) là một ma trận con được tạo bởi hàng đầu tiên của ( sigma ) và cột đầu tiên của (r ). Nếu thứ hạng của ma trận ( mathbf {a} ) nhỏ hơn nhiều so với số hàng và cột (r ll m, n ), chúng ta sẽ được lợi rất nhiều về mặt lưu trữ.

              Sau đây là ví dụ về (m = 4, n = 6, r = 2 ).

              3.4. svd bị cắt ngắn

              Lưu ý rằng trong ma trận ( sigma ) các giá trị trên đường chéo không âm và theo thứ tự giảm dần ( sigma_1 geq sigma_2 geq dot, geq sigma_r geq 0 = 0 = dấu chấm = 0 ). Thông thường chỉ một số ( sigma_i ) có giá trị lớn, còn lại thường nhỏ và gần bằng 0, khi đó chúng ta có thể tính gần đúng ma trận ( mathbf {a} ) bằng cách tính tổng. (k & lt; r ) ma trận hạng 1:

              [ mathbf {a} Gần đúng mathbf {a} _k = mathbf {u} _k sigma_k ( mathbf {v} _k) ^ t = sigma_1 mathbf {u} _1 mathbf {v } ^ t_1 + sigma_2 mathbf {u} _2 mathbf {v} _2 ^ 2 + dot + sigma_k mathbf {u} _k mathbf {v} k ^ t ~~~~ (7) ] Dưới đây Đây là một định lý thú vị. Định lý này nói rằng sai số do tính gần đúng ở trên là căn bậc hai của tổng bình phương của các giá trị đơn lẻ mà chúng ta đã bỏ qua ở cuối ( sigma ). Sai số ở đây được định nghĩa là chuẩn xác đáng của sự khác biệt giữa hai ma trận:

              Lý thuyết: [|| mathbf {a} – mathbf {a} _k || _f ^ 2 = sum_ {i = k + 1} ^ r sigma_i ^ 2 ~ ~~ (8) ]

              Bằng chứng:

              Sử dụng các thuộc tính (|| mathbf {x} || _f ^ 2 = text {trace} ( mathbf {x} mathbf {x} ^ t) ) và ( text {trace} ( mathbf {xy}) = text {trace} ( mathbf {yx}) ) Đối với tất cả các ma trận ( mathbf {x, y} ) chúng ta có:

              [ begin {eqnarray} || mathbf {a} – mathbf {a} _k || _f ^ 2 & amp; = & amp; || sum_ {i = k + 1} ^ r sigma_i mathbf {u} _i mathbf {v} _i ^ t || _f ^ 2 & amp; (9) newline & amp; = & amp; text {trace} left { left ( sum_ {i = k + 1 } ^ r sigma_i mathbf {u} _i mathbf {v} _i ^ t right) left ( sum_ {j = k + 1} ^ r sigma_j mathbf {u} _j mathbf {v} _j ^ t right) ^ t right } & amp; (10) newline & amp; = & amp; text {trace} left { sum_ {i = k + 1} ^ r sum_ {j = k + 1} ^ r sigma_i sigma_j mathbf {u} _i mathbf {v} _i ^ t mathbf {v} _j mathbf {u} _j ^ t right } & amp; (11) newline & amp; = & amp; text {trace} left { sum_ {i = k + 1} ^ r sigma_i ^ 2 mathbf {u} _i mathbf {u} _i ^ t right } & amp; (12) newline & amp; = & amp; text {trace} left { sum_ {i = k + 1} ^ r sigma_i ^ 2 mathbf {u} _i ^ t mathbf {u} _i right } & amp; (13) newline & amp; = & amp; text {trace} left { sum_ {i = k + 1} ^ r sigma_i ^ 2 right } & amp; (14) newline & amp; = & amp; sum_ {i = k + 1} ^ r sigma_i ^ 2 & amp; (15) end {eqnarray} ]

              Dấu bằng

              tại ((12) ) là do ( mathbf {v} ) là một ma trận trực giao (xem ((4) )).

              Dấu bằng

              tại ((13) ) là do hàm ( text {trace} ) là giao hoán.

              Dấu bằng

              trong ((15) ) là do biểu thức trong dấu ngoặc đơn ((14) ) là một đại lượng vô hướng.

              Thay thế (k = 0 ) ta được: [|| mathbf {a} || _f ^ 2 = sum_ {i = 1} ^ r sigma_i ^ 2 ~~~~ (16) ]

              Xem Thêm : Định cư Úc diện visa 309: Điều kiện, đối tượng, quyền lợi

              Từ đó:

              [ frac {|| mathbf {a} – mathbf {a} _k || _f ^ 2} {|| mathbf {a} || _f ^ 2} = { frac { sum_ { i = k + 1} ^ r sigma_i ^ 2} { sum_ {j = 1} ^ r sigma_j ^ 2}} ~~~~ (17) ]

              Do đó, nếu phần giá trị số ít bị cắt ngắn nhỏ hơn phần giá trị số ít được giữ lại, thì lỗi do tính gần đúng sẽ nhỏ hơn. Đây là một định lý quan trọng để xác định các xấp xỉ của ma trận dựa trên lượng thông tin cần bảo toàn.

              Ví dụ: nếu chúng tôi muốn giữ ít nhất 90% thông tin trong ( mathbf {a} ), trước tiên chúng tôi tính toán ( sum_ {j = 1} ^ r sigma_j ^ 2 ), sau đó chọn ( sum_ {j = 1} ^ r sigma_j ^ 2 ) (k ) là số nhỏ nhất sao cho:

              [ frac { sum_ {i = 1} ^ k sigma_i ^ 2} { sum_ {j = 1} ^ r sigma_j ^ 2} geq 0.9 ]

              Khi (k ) nhỏ, hạng của ma trận ( mathbf {a} _k ) là (k ), là một ma trận hạng nhỏ. Do đó, svd cắt ngắn cũng được coi là một phương pháp xấp xỉ cấp thấp.

              3.5. Xếp hạng tốt nhất (k ) xấp xỉ

              Có thể chứng minh rằng (phân rã giá trị số ít-Princeton) ( mathbf {a} _k ) là giải pháp cho vấn đề tối ưu hóa:

              [ begin {eqnarray} min _ { mathbf {b}} & amp; & amp; || mathbf {a} – mathbf {b} || _f newline text {s.t.} & amp; & amp; text {rank} ( mathbf {b}) = k ~~~~~~~~~~~~~~~ (17) end {eqnarray} ]

              Như được hiển thị ở trên (|| mathbf {a} – mathbf {a} _k || _f ^ 2 = sum_ {i = k + 1} ^ r sigma_i ^ 2 ).

              Nếu chúng ta sử dụng tiêu chuẩn 2 của ma trận thay vì tiêu chuẩn frobenius để đo lỗi, ( mathbf {a} _k ) cũng là giải pháp cho vấn đề tối ưu hóa:

              [ begin {eqnarray} min _ { mathbf {b}} & amp; & amp; || mathbf {a} – mathbf {b} || _2 newline text {s.t.} & amp; & amp; text {rank} ( mathbf {b}) = k ~~~~~~~~~~~~~~~~ (18) end {eqnarray} ]

              và lỗi: (|| mathbf {a} – mathbf {a} _k || _2 ^ 2 = sigma_ {k + 1} ^ 2 ). Chuẩn mực ma trận 2 được định nghĩa là:

              [|| mathbf {a} || _2 = max_ {|| mathbf {x} || _2 = 1} || mathbf {ax} || _2 ]

              Đây là lý do tại sao căn bậc hai của tổng bình phương của các phần tử của ma trận không được gọi là chuẩn 2 như một vectơ.

              Nếu bạn muốn biết thêm: [|| mathbf {a} || _2 = sigma_1 ] tức là chuẩn 2 của ma trận là giá trị kỳ dị lớn nhất của ma trận đó.

              Định mức frobenius và định mức 2 là hai định mức được sử dụng phổ biến nhất trong ma trận. Do đó, svd bị cắt ngắn cho giá trị gần đúng nhất dựa trên hai thông số kỹ thuật này. Vì vậy, svd bị cắt ngắn còn được gọi là xấp xỉ thứ hạng thấp tốt nhất.

              4. Một số ứng dụng của svd

              4.1. Nén hình ảnh

              Hãy xem xét ví dụ trong Hình 3 bên dưới:

              Hình 3 mô tả chất lượng hình ảnh khi các giá trị khác nhau của (k ) được chọn. Khi (k ) gần bằng 100, lượng thông tin bị mất ít hơn 2% và hình ảnh thu được có chất lượng giống như hình ảnh gốc.

              Để lưu hình ảnh svd bị cắt ngắn, chúng tôi sẽ lưu ma trận ( mathbf {u} _k in mathbb {r} ^ {m times k}, sigma_k in mathbb {r} ^ {k times k}, mathbf {v} _k in mathbb {r} ^ {n times k} ). Tổng số phần tử cần lưu trữ là (k (m + n + 1) ), lưu ý rằng chúng ta chỉ cần lưu giá trị trên đường chéo của ( sigma_k ). Giả sử mỗi phần tử được lưu trữ bởi một số thực 4 byte, thì số byte cần lưu trữ là (4k (m + n + 1) ). Nếu giá trị này được so sánh với hình ảnh gốc có kích thước (mn ), thì mỗi giá trị là một số nguyên 1 byte và tỷ lệ nén là:

              [ frac {4k (m + n + 1)} {mn} ] Khi (k ll m, n ) chúng ta nhận được thang điểm nhỏ hơn 1. Trong ví dụ của chúng tôi (m = 960, n = 1440, k = 100 ), chúng tôi có tỷ lệ nén khoảng 0,69, tiết kiệm khoảng 30% bộ nhớ.

              4.2. Svd bị cắt ngắn cho hệ thống tư vấn

              Như đã đề cập ở điểm 1, svd là một phương pháp nhân tử hóa ma trận, vì vậy nó cũng có thể được áp dụng cho bài toán hệ thống khuyến nghị trong Bài 25.

              Ý tưởng hoàn toàn giống nhau, chúng tôi sẽ chuẩn hóa gần đúng ma trận tiện ích (dựa trên người dùng hoặc dựa trên mục). Các giá trị của ma trận xấp xỉ hạng thấp là các giá trị được dự đoán.

              Sử dụng cơ sở dữ liệu tương tự như Bài 25, kết quả (rmse) là:

              • Số tiền kiếm được 100k, dựa trên người dùng: 1,018 (tốt hơn 1,06 cho phép phân tích nhân tử của ma trận).

              • những người làm phim 100k, dựa trên dự án: 1,014 (tốt hơn 1,05)

              • những người làm phim dài 1m, dựa trên dự án: 0,95 (tốt hơn 0,98)

                Do đó, svd bị cắt ngắn cho kết quả tốt hơn một chút so với việc phân tích nhân tử ma trận được giải quyết bằng phương pháp giảm dần gradient.

                Giải thích thú vị về mối quan hệ giữa svd và ma trận tiện ích và người dùng-

                5. Thảo luận

                • Ngoài hai ứng dụng trên, svd cũng có liên quan mật thiết đến phép nghịch đảo giả moore penrose. (Xem thêm Moore-penrose pseudoinverse (toán 33a – ucla)). Các phép nghịch đảo giả đóng một vai trò quan trọng trong việc giải các hệ phương trình tuyến tính. Một ví dụ đã được đề cập trong Bài 3: Hồi quy tuyến tính.

                • svd còn nhiều tính năng và ứng dụng thú vị khác mà chúng ta sẽ tìm hiểu dần dần. Đầu tiên là giảm kích thước bằng cách sử dụng phân tích thành phần chính. Chúng tôi sẽ thảo luận về điều này trong bài viết tiếp theo.

                • Khi ma trận ( mathbf {a} ) lớn, việc tính toán svd của nó mất nhiều thời gian. Làm thế nào để tính toán một svd bị cắt ngắn với small (k ) bằng cách tính toán svd như tôi đã sử dụng trong bài viết trở nên không thể. Thay vào đó, có một phương pháp lặp lại để tính toán hiệu quả các giá trị riêng và ký tự riêng của một ma trận lớn, chúng ta chỉ cần tìm giá trị riêng lớn nhất của ( mathbf {aa} ^ t ) (k ) và các ký hiệu riêng tương ứng , điều này sẽ tiết kiệm rất nhiều thời gian. Độc giả có thể đọc thêm về phương pháp lũy thừa để ước tính giá trị riêng. Phương pháp này cũng là một phần chính của thuật toán google pagerank nổi tiếng, và mình sẽ đăng bài khi cảm thấy phù hợp.

                • Mã nguồn

                  6. Tài liệu tham khảo

                  [1] Phân tích giá trị đơn lẻ – Đại học Stanford

                  [2] Phân tích giá trị số ít-Prince

                  [3] cs168: Bài giảng Hộp công cụ thuật toán hiện đại # 9: Phân tích giá trị đơn lẻ (svd) và xấp xỉ ma trận hạng thấp – Stanford

                  [4] Phép nghịch đảo Moore-penrose (toán 33a – ucla)

Nguồn: https://anhvufood.vn
Danh mục: Kinh Nghiệm

Trả lời

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *