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:
Ở đâ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 svd
tất cả float32
là như nhau.)
Việc cắt ngắn đơn giản float32
thậ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.