Cần thêm bao nhiêu chính quy để làm cho SVD ổn định?


10

Tôi đã sử dụng SVD của Intel MKL ( dgesvdthông qua SciPy) và nhận thấy rằng kết quả khác biệt đáng kể khi tôi thay đổi độ chính xác giữa float32float64khi ma trận của tôi bị điều hòa kém / không xếp hạng đầy đủ. Có hướng dẫn nào về số lượng chính quy tối thiểu tôi nên thêm để làm cho kết quả không nhạy cảm với float32-> float64thay đổi không?

Đặc biệt, làm , tôi thấy rằng L chỉ tiêu V T X di chuyển khoảng 1 khi tôi thay đổi chính xác giữa và . Chỉ tiêu L 2 của A10 5 và nó có khoảng 200 giá trị riêng trong tổng số 784.A=UDVTLVTXfloat32float64L2A105

Làm SVD trên với λ = 10 - 3 đã biến mất sự khác biệt.λI+Aλ=103


Kích thước là gì của một N × N ma trận Một ví dụ đó (được nó ngay cả một ma trận vuông)? 200 giá trị riêng hoặc giá trị số ít? Một tiêu chuẩn Frobenius | | Một | | F cho một ví dụ đại diện cũng sẽ hữu ích. NN×NA||A||F
Anton Menshov

Trong trường hợp này là ma trận 784 x 784, nhưng tôi quan tâm nhiều hơn đến kỹ thuật chung để tìm ra giá trị tốt của lambda
Yaroslav Bulatov

Vì vậy, sự khác biệt về chỉ trong các cột cuối cùng tương ứng với các giá trị số ít không? V
Nick Alger

2
Nếu có một vài giá trị số ít bằng nhau, svd không phải là duy nhất. Trong ví dụ của bạn, tôi đoán rằng vấn đề xuất phát từ nhiều giá trị số ít bằng 0 và độ chính xác khác nhau dẫn đến một lựa chọn khác nhau về cơ sở cho không gian số ít tương ứng. Tôi không biết tại sao điều đó lại thay đổi khi bạn thường xuyên hóa ...
Dirk

1
... là gì? X
Federico Poloni

Câu trả lời:


1

Mặc dù câu hỏi có một câu trả lời tuyệt vời, đây là một quy tắc ngón tay cái cho các giá trị số ít, với một cốt truyện.

Nếu một giá trị số ít là khác không nhưng rất nhỏ, bạn nên xác định giá trị đối ứng của nó bằng 0, vì giá trị rõ ràng của nó có thể là một yếu tố của lỗi vòng, không phải là một số có ý nghĩa. Một câu trả lời hợp lý cho câu hỏi "nhỏ như thế nào là nhỏ?" là để chỉnh sửa theo cách này tất cả các giá trị đặc biệt mà tỷ lệ so với lớn nhất là ít hơn lần so với máy chính xác ε .Nϵ

- Công thức toán số p. 795

Đã thêm: một vài dòng sau đây tính quy tắc này.

#!/usr/bin/env python2

from __future__ import division
import numpy as np
from scipy.sparse.linalg import svds  # sparse, dense or LinOp

#...............................................................................
def howsmall( A, singmax=None ):
    """ singular values < N float_eps sing_max  may be iffy, questionable
        "How small is small ?"
        [Numerical Recipes p. 795](http://apps.nrbook.com/empanel/index.html?pg=795)
    """
        # print "%d singular values are small, iffy" % (sing < howsmall(A)).sum()
        # small |eigenvalues| too ?
    if singmax is None:
        singmax = svds( A, 1, return_singular_vectors=False )[0]  # v0=random

    return max( A.shape ) * np.finfo( A.dtype ).eps * singmax


Ma trận Hilbert dường như được sử dụng rộng rãi như một trường hợp thử nghiệm cho lỗi vòng:

nhập mô tả hình ảnh ở đây

Ở đây các bit có thứ tự thấp trong các mantissas của ma trận Hilbert bằng 0 A.astype(np.float__).astype(np.float64), sau đó np.linalg.svdđược chạy trong float64. (Kết quả với svdtất cả float32là như nhau.)

Việc cắt ngắn đơn giản float32thậm chí có thể hữu ích cho việc từ chối dữ liệu chiều cao, ví dụ như để phân loại thử nghiệm / đào tạo.

Trường hợp thử nghiệm thực sự sẽ được hoan nghênh.


btw, scipy dường như thêm một yếu tố 1e3 cho float32 và 1e6 cho float64, tò mò những thứ này đến từ đâu
Yaroslav Bulatov

@Yaroslav Bulatov numpyscipy.linalg.svdgọi LAPACK gesdd , xem tham số JOBRtrong dgejsv: "Chỉ định RANGE cho các giá trị số ít. Cấp giấy phép để đặt thành các giá trị số ít dương nhỏ nếu chúng ở bên ngoài ..." ( scipy.sparse.linalg.svdsbao bọc ARPACK và có tham số tol, Dung sai cho các giá trị số ít.)
denis

13

A=ATM=UΣVT

H=[0MMT0]=[U00V][0ΣΣ0][U00V]T

ϵ>0

Aϵ=[1ϵϵ1]=VΛϵVT,Bϵ=[1+ϵ001ϵ]=UΛϵUT
Λϵ=diag(1+ϵ,1ϵ)
V=12[1111],U=[1001].
AϵBϵVUϵ>0U,VUV

M0=U0Σ0V0Tfloat64Mϵ=UϵΣϵVϵTfloat32Σ0,Σϵϵ107U0,UϵV0,Vϵ



1
Đó là một tài liệu tham khảo tuyệt vời. Tôi không biết, tôi đã học được ví dụ cụ thể này nhiều năm trước trong lớp toán :-)
Richard Zhang
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.