Sebuah pertanyaan lama tentang Dekomposisi Nilai Singular membuat saya mengajukan pertanyaan ini: Bagaimana saya bisa memotong array 2-Dimensi, ke sejumlah kolom yang ditentukan oleh toleransi tertentu?

Secara khusus, harap pertimbangkan cuplikan kode berikut, yang mendefinisikan toleransi yang diterima dari 1e-4 dan menerapkan Dekomposisi Nilai Singular ke matriks 'A'.

#Python
tol=1e-4
U,Sa,V=np.linalg.svd(A)
S=np.diag(Sa)

Matriks diagonal nilai singular 'S' yang dihasilkan memiliki nilai singular non-negatif dalam urutan besarnya yang semakin menurun.

Yang ingin saya dapatkan adalah matriks 'S' yang terpotong, sedemikian rupa sehingga kolom-kolom matriks yang memiliki nilai tunggal lebih rendah dari 1e-4 akan dihapus. Kemudian, terapkan pemotongan ini ke matriks 'U'.

Apakah ada cara sederhana untuk melakukan ini? Saya telah mencari-cari, dan menemukan beberapa solusi untuk masalah Matlab, tetapi tidak menemukan yang serupa untuk Python. Untuk Matlab, kodenya akan terlihat seperti:

%Matlab
tol=1e-4
mask=any(Sigma>=tol,2);
sigRB=Sigma(:,mask);
mask2=any(U>=tol,2);
B=U(:,mask);

Terima kasih sebelumnya. Saya harap posting saya tidak terlalu berantakan untuk dipahami.

0
enricw 11 April 2020, 16:50

1 menjawab

Jawaban Terbaik

Saya tidak yakin apakah saya memahami Anda dengan benar. Jika solusi saya bukan yang Anda minta, harap pertimbangkan untuk menambahkan contoh ke pertanyaan Anda.

Kode berikut menghapus semua kolom dari larik s yang hanya terdiri dari nilai yang lebih kecil dari tol.

s = np.array([
    [1, 0, 0, 0, 0, 0],
    [0, .9, 0, 0, 0, 0],
    [0, 0, .5, 0, 0, 0],
    [0, 0, 0, .4, 0, 0],
    [0, 0, 0, 0, .3, 0],
    [0, 0, 0, 0, 0, .2]
])

print(s)

tol = .4
ind = np.argwhere(s.max(axis=1) < tol)

s = np.delete(s, ind, 1)

print(s)

Keluaran:

[[1.  0.  0.  0.  0.  0. ]
 [0.  0.9 0.  0.  0.  0. ]
 [0.  0.  0.5 0.  0.  0. ]
 [0.  0.  0.  0.4 0.  0. ]
 [0.  0.  0.  0.  0.3 0. ]
 [0.  0.  0.  0.  0.  0.2]]


[[1.  0.  0.  0. ]
 [0.  0.9 0.  0. ]
 [0.  0.  0.5 0. ]
 [0.  0.  0.  0.4]
 [0.  0.  0.  0. ]
 [0.  0.  0.  0. ]]

Saya menerapkan max ke sumbu 1 dan kemudian menggunakan np.argwhere untuk mendapatkan indeks kolom di mana nilai maks lebih kecil dari tol.

Sunting: Untuk memotong kolom matriks 'U', sehingga ukurannya bertepatan dengan matriks 'S' yang diperkecil, kode berikut berfungsi:

k = len(S[0])
Ured = U[:,0:k]
Uredsize = np.shape(Ured) # To check it has worked
print(Uredsize)
1
Lydia van Dyke 13 April 2020, 07:50