Sự hiểu biết của tôi là numpy.linalg.lstsq dựa trên dgelsd thường quy LAPACK .
Vấn đề là giải quyết:
minimize(overx)∥Ax−b∥2
Tất nhiên, điều này không có một giải pháp duy nhất cho ma trận A có thứ hạng nhỏ hơn độ dài của vectơ . Trong trường hợp hệ thống không xác định, cung cấp giải pháp sao cho:bdgelsd
z
- Az=b
- ∥z∥2≤∥x∥2 cho tất cả thỏa mãn . (tức là là giải pháp định mức tối thiểu cho hệ thống không xác định.xAx=bz
Ví dụ: nếu hệ thống là , numpy.linalg.lstsq sẽ trả về .x+y=1x=.5,y=.5
Làm thế nào để dgelsd làm việc?
dgelsd
Thường trình tính toán phân rã giá trị số ít (SVD) của A.
Tôi sẽ chỉ phác thảo ý tưởng đằng sau bằng cách sử dụng một SVD để giải quyết một hệ thống tuyến tính. Sự phân hủy giá trị đơn lẻ là một nhân tử UΣV′=A nơi U và V là ma trận trực giao và Σ là một ma trận đường chéo nơi các mục chéo được gọi là giá trị duy nhất.
Thứ hạng hiệu quả của ma trận A sẽ là số lượng các giá trị số ít có hiệu quả khác không (nghĩa là đủ khác với 0 so với độ chính xác của máy, v.v ...). Đặt S là ma trận đường chéo của các giá trị số ít khác không. Do đó, SVD là:
A=U[S000]V′
Giả nghịch đảo của A được cho bởi:
A†=V[S−1000]U′
Xét nghiệm x=A†b . Sau đó:
Ax−b=U[S000]V′V[S−1000]U′b−b=U[I000]U′b−b
Về cơ bản có hai trường hợp ở đây:
- Ib
- Ax−b=0
U
Sự tương đương của giả nghịch đảo
AA†=A′(AA′)−1
Đối với một hệ thống không xác định, bạn có thể chỉ ra rằng giả nghịch đảo cung cấp cho bạn giải pháp định mức tối thiểu.
AA†=(A′A)−1A′