การเพิ่มมาตรฐานเพื่อทำให้ SVD มีความเสถียรเท่าไร


10

ฉันใช้ SVD ของ Intel MKL ( dgesvdผ่าน SciPy) และสังเกตว่าผลลัพธ์จะแตกต่างกันอย่างมากเมื่อฉันเปลี่ยนความแม่นยำระหว่างfloat32และfloat64เมื่อเมทริกซ์ของฉันมีเงื่อนไขไม่ดี / ไม่เต็มอันดับ มีแนวทางเกี่ยวกับจำนวนขั้นต่ำของการทำให้เป็นมาตรฐานที่ฉันควรเพิ่มเพื่อให้ผลลัพธ์ที่ไม่ไวต่อการเปลี่ยนแปลงfloat32-> float64หรือไม่?

โดยเฉพาะการทำ A=UDVTฉันเห็นว่า L บรรทัดฐานของ VTXย้ายประมาณ 1 เมื่อฉันเปลี่ยนความแม่นยำของระหว่างและfloat32float64L2 บรรทัดฐานของ A คือ 105 และมีค่าลักษณะเฉพาะประมาณ 200 ศูนย์จากทั้งหมด 784

กำลังทำ SVD λI+A กับ λ=103 ทำให้ความแตกต่างหายไป


ขนาดคืออะไร N ของ N×N มดลูก Aสำหรับตัวอย่างนั้น (มันเป็นเมทริกซ์จตุรัส) หรือไม่? 200 ค่าศูนย์หรือค่าเอกพจน์? บรรทัดฐาน Frobenius||A||Fสำหรับตัวอย่างที่เป็นตัวแทนก็มีประโยชน์เช่นกัน
Anton Menshov

ในกรณีนี้เมทริกซ์ 784 x 784 แต่ฉันสนใจมากขึ้นในเทคนิคทั่วไปเพื่อค้นหาค่าแลมบ์ดาที่ดี
Yaroslav Bulatov

ดังนั้นความแตกต่างคือ Vเฉพาะในคอลัมน์สุดท้ายที่สอดคล้องกับค่าเอกพจน์ศูนย์หรือไม่
Nick Alger

2
หากมีค่าเอกพจน์ที่เท่ากันหลายค่า svd จะไม่ซ้ำกัน ในตัวอย่างของคุณฉันเดาว่าปัญหามาจากค่าเอกพจน์หลายศูนย์และความแม่นยำที่แตกต่างกันนำไปสู่การเลือกพื้นฐานที่แตกต่างกันสำหรับพื้นที่เอกพจน์ที่เกี่ยวข้อง ผมไม่ทราบว่าทำไมไม่เปลี่ยนแปลงเมื่อคุณเป็นระเบียบ ...
เดิร์ค

1
...คืออะไร X?
Federico Poloni

คำตอบ:


1

แม้ว่าคำถามจะมีคำตอบที่ดี แต่นี่เป็นกฎง่ายๆสำหรับค่าเอกพจน์ขนาดเล็กที่มีพล็อต

หากค่าเอกพจน์เป็นค่าที่ไม่ใช่ศูนย์ แต่มีขนาดเล็กมากคุณควรกำหนดค่าส่วนกลับให้เป็นศูนย์เนื่องจากค่าที่ชัดเจนอาจเป็นสิ่งประดิษฐ์ของข้อผิดพลาดของ roundoff ไม่ใช่จำนวนที่มีความหมาย คำตอบที่เป็นไปได้สำหรับคำถาม "มีขนาดเล็กแค่ไหน" คือการแก้ไขในลักษณะนี้ทุกค่าเอกพจน์ที่มีอัตราส่วนต่อใหญ่ที่สุดน้อยกว่าN คูณความแม่นยำของเครื่อง ϵ .

- สูตรอาหารหน้าตัวเลข 795

เพิ่ม: คู่ของบรรทัดต่อไปนี้คำนวณกฎของหัวแม่มือ

#!/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


ดูเหมือนว่าเมทริกซ์ของ Hilbert จะถูกใช้อย่างกว้างขวางเป็นกรณีทดสอบสำหรับข้อผิดพลาด roundoff:

ป้อนคำอธิบายรูปภาพที่นี่

นี่บิตต่ำลำดับใน mantissas ของเมทริกซ์ฮิลแบร์ตจะกลายเป็นศูนย์, A.astype(np.float__).astype(np.float64)จากนั้นจะดำเนินการในnp.linalg.svd float64(ผลลัพธ์ที่มีsvdทั้งหมดfloat32เหมือนกัน)

การตัดทอนfloat32อาจเป็นประโยชน์สำหรับการแยกข้อมูลมิติสูงเช่นการจำแนกรถไฟ / การทดสอบ

กรณีทดสอบจริงจะได้รับการต้อนรับ


btw, scipy ดูเหมือนว่าจะเพิ่มปัจจัย 1e3 สำหรับ float32 และ 1e6 สำหรับ float64 อยากรู้ว่าสิ่งเหล่านี้มาจากไหน
Yaroslav Bulatov

@Yaroslav Bulatov numpyและscipy.linalg.svdเรียก LAPACK gesddดูพารามิเตอร์JOBRในdgejsv: "ระบุ RANGE สำหรับค่าเอกพจน์ออกใบอนุญาตเพื่อตั้งค่าเอกพจน์เชิงบวกค่าศูนย์ขนาดเล็กถ้าพวกเขาอยู่นอก ... " ( scipy.sparse.linalg.svdsล้อม ARPACK และมีพารามิเตอร์tolความอดทน สำหรับค่าเอกพจน์)
denis

13

การสลายตัวของค่าเอกฐานสำหรับเมทริกซ์สมมาตร A=AT เป็นหนึ่งเดียวกับ eigendecomposition บัญญัติของมัน (เช่นกับเมทริกซ์ orthonormal-of-eigenvectors) ในขณะที่สิ่งเดียวกันสำหรับเมทริกซ์สมมาตรไม่สมมาตร M=UΣVT เป็นเพียงค่า eigenvalue ที่ได้รับการยอมรับสำหรับเมทริกซ์สมมาตร

H=[0MMT0]=[U00V][0ΣΣ0][U00V]T
ดังนั้นโดยไม่สูญเสียความเป็นสามัญให้เราพิจารณาคำถามที่เกี่ยวข้องอย่างใกล้ชิด: หากเมทริกซ์สมมาตรสองตัวมีค่าเท่ากันเราควรคาดหวังว่า eigendecompositions ซึ่งเป็นที่ยอมรับของพวกเขาจะเหมือนกันหรือไม่

คำตอบคือไม่น่าแปลกใจ ปล่อยϵ>0 มีขนาดเล็กและพิจารณาเมทริกซ์สองตัว

Aϵ=[1ϵϵ1]=VΛϵVT,Bϵ=[1+ϵ001ϵ]=UΛϵUT
ทั้งคู่มีค่าลักษณะเฉพาะ Λϵ=diag(1+ϵ,1ϵ)แต่มี eigenvector อยู่
V=12[1111],U=[1001].
ในขณะที่เมทริกซ์ AϵBϵ มีค่าเท่ากันเมทริกซ์ของผู้ใช้ไอคิว V และ Uแตกต่างกันมาก แท้จริงแล้วเนื่องจาก eigendecompositions นั้นมีลักษณะเฉพาะสำหรับϵ>0ไม่มีทางเลือกจริงๆ U,V ดังนั้น UV

ตอนนี้ใช้ความเข้าใจด้านนี้กลับไปที่แผนกบริการภายใต้ความแม่นยำแน่นอนขอให้เราเขียน M0=U0Σ0V0Tเป็นเมทริกซ์ของคุณในfloat64 ความแม่นยำและMϵ=UϵΣϵVϵT เป็นเมทริกซ์เดียวกันในfloat32ความแม่นยำ หากเราสมมติว่าแผนกบริการตนเองนั้นแน่นอนแล้วค่าเอกพจน์Σ0,Σϵ จะต้องแตกต่างกันไม่มากไปกว่าปัจจัยคงที่ขนาดเล็ก ϵ107แต่เป็นเวกเตอร์เอกพจน์ U0,Uϵ และ V0,Vϵ สามารถแตกต่างกันตามปริมาณมากโดยพล ดังนั้นดังที่แสดงไม่มีวิธีที่จะทำให้ SVD "เสถียร" ในความหมายของเวกเตอร์เอกพจน์


ตัวอย่างนี้มาจาก: users.math.msu.edu/users/markiwen/Teaching/MTH995/Papers/หรือไม่
Memming

1
เป็นการอ้างอิงที่ดีมาก ฉันไม่รู้ฉันเรียนรู้ตัวอย่างนี้เมื่อหลายปีก่อนในวิชาคณิตศาสตร์ :-)
Richard Zhang
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.