Điều gì nên là tiêu chí để chấp nhận / từ chối các giá trị số ít?


8

Tôi đang giải quyết một hệ thống sử dụng phân rã giá trị số ít. Các giá trị số ít (trước khi chia tỷ lệ) là:

1.82277e+29
1.95011e+27
1.15033e+23
1.45291e+21
4.79336e+17
7.48116e+15
8.31087e+12
1.71838e+11
5.63232e+08
2.17863e+08
9.02783e+07
1.72345e+07
1.73889e+05
8.09382e+02
2.16644e+00

Tôi đã thấy rằng việc chấp nhận tất cả các giá trị số ít và đóng góp liên quan của chúng vào vectơ giải pháp của tôi mang lại kết quả kém. Tôi chia tỷ lệ tất cả cho chúng bằng số lớn nhất, mang lại các giá trị số ít của:

1.0
1.06986e-02
6.31091e-07
7.97089e-09
2.62971e-12
4.10428e-14
4.55948e-17
9.42732e-19
3.08998e-21
1.19523e-21
4.95281e-22
9.45510e-23
9.53980e-25
4.44040e-27
1.18854e-29

Giải pháp tốt nhất chỉ bắt đầu trở nên tồi tệ nếu tôi bao gồm hai người cuối cùng, và chỉ trở nên tốt trong khoảng thời gian 1019 .

Có sự giảm mạnh về độ chính xác khi tôi bao gồm 2 điều khoản cuối cùng. Tại sao vậy? Các tiêu chí để bao gồm / không bao gồm các giá trị số ít là gì?

Phương trình ma trận của tôi xuất phát từ một bình phương tối thiểu tuyến tính phù hợp trong đó tôi đang sử dụng bộ cơ sở đa thức để phù hợp với một số dữ liệu nhiễu mà tôi đã tạo. Tôi giải quyết hệ thống overdetermined chuẩn ( ma trận nơi m » n ) bằng cách nhân mỗi bên ( Một X = B ) do chuyển vị của A ( A Một X = Một X ) và thực hiện SVD về điều đó.m×nmnAX=BAAAX=AX

Tôi đang đánh giá các câu trả lời cho các giải pháp của mình bằng cách nó gần đúng với dữ liệu ồn ào của tôi.

Tôi cũng đã nhận thấy rằng, ngay cả trên mức độ 'tốt', tôi cũng không phù hợp lắm gần 0 (dữ liệu của tôi nằm trong khoảng từ đến 10 ). Tại sao vậy?1010


Nếu bạn đề cập đến những thẻ bạn muốn tạo trong bài đăng hoặc bình luận, ai đó có đại diện cao hơn có thể chăm sóc nó cho bạn.
David Z

@DavidKetcheson: Tôi không chắc là chúng ta có thực sự cần những thẻ cụ thể này không ... Có thể khi chúng ta có rất nhiều câu hỏi về SVD ... nhưng tôi nghĩ đại số tuyến tính nên là một thẻ đủ cho bây giờ.
JM

Câu trả lời:


11

max(m,n)ϵA2Am×nϵA2A

Như đã nói, như JM đã đề cập, sẽ ổn định hơn nhiều để tránh hình thành :AHA

Trước tiên, chúng ta cần tính toán phân tách giá trị số ít sau đó, chúng ta có thể xác định giả ngẫu nhiên thông qua trong đó

[U,Σ,V]=svd(A)
A=Vf(Σ)UH,
f(σ)={1/σ,σmax(m,n)ϵA2,0,otherwise

Giải pháp sau đó có thể được tính là

X=AB.

2
Tôi nghĩ tốt hơn là nên nói rõ ràng và nói rằng ma trận 2 chỉ tiêu chính xác giống như giá trị số ít nhất ... cũng vậy, không cần phải vuông để áp dụng tiêu chí ngưỡng (nhưng người ta thay thế với cho ma trận ). Anmax(m,n)m×n
JM

1
thay vì A † = U f (Σ) * VH không nên là A † = V f (Σ) * U '?
drjrm3

Vâng, cảm ơn cả hai. Tôi vừa mới viết một thói quen giả song song cho ma trận Hermiti vài ngày trước, và dường như không nghĩ đủ về sự khác biệt liên quan đến trường hợp chung.
Jack Poulson

2
Pseudoinverses không phải là thuốc chữa cho tất cả các vấn đề về điều hòa, mặc dù chúng có xu hướng giúp đỡ. Nội suy đa thức bậc cao nổi tiếng là không điều hòa và tốt nhất nên tránh. Tôi khuyên bạn nên đọc bài viết Wiki về hiện tượng của Runge và sau đó chuyển sang một cơ sở khác cho phép nội suy của bạn (ví dụ: đa thức piecewise hoặc spline).
Jack Poulson

1
Thảo luận này không còn liên quan đến câu hỏi ban đầu của bạn; liệu việc bạn thực hiện một phép tính gần đúng bình phương tối thiểu có thể nghi ngờ có liên quan đến câu hỏi ban đầu của bạn hay không. Tôi đề nghị bạn gửi một câu hỏi khác nếu bạn vẫn còn bối rối.
Jack Poulson

11

Ừ !! Không, không , một ngàn lần, không !

Lý do mọi người sử dụng SVD chính xác là để tránh phải hình thành ma trận sản phẩm chéo , vì sự hình thành của ma trận này là một công thức hay để hình thành các hệ thống tuyến tính có điều kiện! Sự phân hủy có nghĩa là để được áp dụng trực tiếp để . (Xem thêm một số câu trả lời trước đây của tôi .)AAA

Tôi đã đề cập với bạn trước đây rằng tiêu chí thông thường để loại bỏ các giá trị số ít là so sánh chúng với sản phẩm có giá trị số ít nhất và epsilon của máy. Tuy nhiên, điều này được kết xuất bằng cách hình thành ma trận sản phẩm chéo của bạn. Vui lòng thử chạy phân tách lại, nhưng lần này, trên chính ma trận thiết kế thay vì ma trận sản phẩm chéo. Bất kỳ cách nào khác là lạm dụng trắng trợn phân hủy.


3
Không thể nâng cấp đủ điều này ... đây là điểm quan trọng nhất về việc sử dụng các kỹ thuật SVD một cách chính xác. Hãy nhớ rằng các giá trị số ít của là bình phương của các giá trị số ít của ! ATAA
khinsen

Đúng. Bình phương một số nhỏ dẫn đến một số nhỏ hơn. Xem xét thực tế rằng số điều kiện 2 chỉ tiêu là tỷ lệ của giá trị số nhỏ nhất với giá trị số nhỏ nhất, đây là một cách để thấy tại sao phương pháp phương trình bình thường có thể là một ý tưởng tồi cho các hệ thống lớn.
JM

2

Tôi nghĩ rằng một số người ở đây đã cung cấp những lời khuyên có giá trị cho vấn đề của bạn.

Tuy nhiên, để tham khảo trong tương lai, câu hỏi của bạn về cách giải quyết vấn đề bình phương tuyến tính nhỏ nhất có thể được trả lời bằng cách nhìn vào cơ thể mênh mông của vấn đề này.

Cụ thể, bạn có thể sử dụng TSVD (Phân tách giá trị số đơn lẻ) như một phương pháp đơn giản để có được giải pháp: trong đó là giá trị số ít thứ i, và là cột thứ i trong ma trận và từ hệ số hóa , là phía bên phải của vấn đề của bạn và ký hiệu có nghĩa là liên hợp phức tạp của các mục và sau đó chuyển sang một hàng vectơ, sao cho

xk=i=1kuiHbσivi
σiuiviUVUSVH=AbuHuHbmang lại một vô hướng (dotproduct). Do đó, giải pháp của bạn là vector .xk

Vấn đề chính trong cài đặt này, ngoài việc bị buộc phải tính toán SVD khá tốn kém, là làm thế nào để chọn số lượng giá trị số ít để sử dụng, tức là . Một lần nữa, có một số cách để làm điều đó, nhưng những cách phổ biến nhất sẽ là nguyên tắc Sai lệch, phương pháp Xác thực chéo tổng quát và đường cong L.k

Tất cả điều này (và nhiều hơn nữa) được thực hiện, trong Matlab, trong hộp công cụ tuyệt vời Công cụ Hợp thức , được viết bởi Giáo sư Per Christian Hansen, người cũng đã xuất bản một số giấy tờ và một vài cuốn sách về các vấn đề nghịch đảo. Hộp công cụ rất dễ sử dụng và khá dễ dịch sang các ngôn ngữ lập trình khác.

Tóm lại, trong khi những người khác đã cung cấp những hiểu biết quan trọng về ứng dụng của bạn cho thấy các cách tiếp cận khác phù hợp hơn, thì trên đây là tóm tắt nhanh về cách bạn có thể giải quyết vấn đề nếu bạn vẫn cần.


cảm ơn, tôi nhận thức được hầu hết điều này tôi đã tìm kiếm nhiều tài nguyên - vấn đề là các giải pháp của tôi ngày càng tệ hơn khi tôi phát triển bộ cơ sở của mình đang được sử dụng. Tôi đã đi đến kết luận rằng điều này là do số lượng giá trị số ít bị từ chối khi bộ cơ sở của tôi tăng lên tương ứng với số lượng các hàm cơ sở đang được sử dụng. nghĩa là, khi tôi sử dụng n = 100 hàm cơ bản, tôi phải loại bỏ 95 giá trị số ít và điều này mang lại kết quả tồi tệ hơn nếu tôi sử dụng 10 bộ cơ sở và chỉ ném ra một giá trị số ít.
drjrm3

Đúng - tốt, như những người khác đã đề xuất, bạn nên xem xét các hàm cơ sở của mình và có thể tìm một cơ sở gần đúng hơn với dữ liệu của bạn. Splines có thể là một lựa chọn. Kriging cũng vậy, mặc dù đó là một cách tiếp cận hoàn toàn khác, nó đã mang lại kết quả tốt cho tôi trong nhiều lần.
OscarB
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.