Neden XX 've X'X'in özdeğer ayrışması yoluyla geçerli bir X SVD elde edemiyorum?


9

Elle SVD yapmaya çalışıyorum:

m<-matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U=eigen(m%*%t(m))$vector
V=eigen(t(m)%*%m)$vector
D=sqrt(diag(eigen(m%*%t(m))$values))

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d)

U1%*%D1%*%t(V1)
U%*%D%*%t(V)

Ancak son satır geri mdönmez. Neden? Bu özvektörlerin işaretleri ile ilgisi var gibi görünüyor ... Yoksa prosedürü yanlış mı anladım?



Tekrar tekrar SVD'lerde işaretin önemli olmadığı söylendi ... böyle
başarısız devletçi

@Amoeba Bunu açıkladığın için teşekkürler. Kod yerine İngilizce soruya odaklanıyordum. Başarısız devletçi: D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))kare kökün (ve herhangi bir normalize edilmiş özvektörün) sadece imzalamak için tanımlandığını unutmayın ve unutmayın. Daha kapsamlı bilgi, değişiklik için miçin m <- matrix(-2,1,1)ve dahil ,1,1)çağrıları her birinin sonunda diag. Bu, aynı sorunu yaratan örneğidir - ancak sorunun doğası tamamen açık hale gelecektir. 1×1
whuber

1
Anladım. Teşekkür ederim! C (-1, 1, 1) vektörünü belirlemenin genel bir kuralı var mı? Ya da iki ayrışmanın belirtileri nasıl bağlanmalı?
failstatistician

1
@ Whuber'ın hile c(-1,1,1)çalıştığını unutmayın, ancak Dbunun gibi tanımlanmış size tekil değerler vermiyor. Tekil değerlerin hepsi tanım gereği pozitif olmalıdır. İşaretlerini nasıl bağlayacağım Uve Viyi olduğu sorusu ve benim bir cevabım yok. Neden sadece SVD yapmıyorsun? :-)
amoeba

Yanıtlar:


13

Sorunun Analizi

Bir matrisin SVD'si asla benzersiz değildir. matrisinin boyutlarına sahip olmasına ve SVD'sininAn×k

A=UDV

ortonormal sütunları olan bir matrisi , negatif olmayan girişleri olan bir çapraz matrisi ve ortonormal sütunları olan bir matrisi için.n×pUp×pDk×pV

Şimdi, keyfi olarak , diyagonal üzerinde s olan herhangi bir çapraz matrisi , böylece , kimliği . Sonrap×pS±1S2=Ip×pIp

A=UDV=UIDIV=U(S2)D(S2)V=(US)(SDS)(VS)

aynı zamanda , bir SVD için gösterir ortonormal sütun var ve benzer bir hesaplama gösteriyor ortonormal sütun var. Dahası, ve diyagonal olduğundan, işe giderler, bu nedenle , hala negatif olmayan girişleri olduğunu gösterir.A

(US)(US)=SUUS=SIpS=SS=S2=Ip
USVSSD
SDS=DS2=D
D

SVD bulmak için kodda uygulanan yöntem köşegenleştiren bir bulur ve benzer şekilde köşegenleştiren bir bulunan özdeğerler açısından hesaplamasına devam eder . Sorun, bu sütunlarının sütunlarıyla tutarlı bir şekilde eşleşmesini sağlamaz .U

AA=(UDV)(UDV)=UDVVDU=UD2U
V
AA=VD2V.
DD2UV

Bir çözüm

Bunun yerine, böyle bir ve böyle bir bulduktan sonra , bunları hesaplamak için kullanın.UV

UAV=U(UDV)V=(UU)D(VV)=D

doğrudan ve verimli. Bu nin diyagonal değerleri mutlaka pozitif değildir. D (Bunun nedeni, veya köşegenleştirme işlemi hakkında, bu iki işlem ayrı olarak gerçekleştirildiğinden, bunu garanti edecek hiçbir şey olmamasıdır .) girdilerinin işaretleri eşit böylece, tüm olumlu değerleri vardır. Bunu ile çarparak telafi edin :AAAASDSDUS

A=UDV=(US)(SD)V.

Bu bir SVD.

Misal

Let olan . SVDn=p=k=1A=(2)

(2)=(1)(2)(1)

ile , ve .U=(1)D=(2)V=(1)

köşegenize ederseniz, doğal olarak ve seçersiniz . Aynı şekilde köşegenize ederseniz seçersiniz . Ne yazık ki, Bunun yerine, Bu negatif olduğu için . Bu ayarlar için ve için . Eğer elde edilmiştir iki olası SVDs biri (ancak özgün olarak aynı değildir!).AA=(4)U=(1)D=(4)=(2)AA=(4)V=(1)

UDV=(1)(2)(1)=(2)A.
D=UAV=(1)(2)(1)=(2).
S=(1)UUS=(1)(1)=(1)DSD=(1)(2)=(2)
A=(1)(2)(1),

kod

İşte değiştirilmiş kod. Çıktıları

  1. Yöntem mdoğru şekilde yeniden oluşturulur .
  2. U ve gerçekten hala birimdik.V
  3. Ancak sonuç, geri gönderilen SVD ile aynı değildir svd. (Her ikisi de eşit derecede geçerlidir.)
m <- matrix(c(1,0,1,2,1,1,1,0,0),byrow=TRUE,nrow=3)

U <- eigen(tcrossprod(m))$vector
V <- eigen(crossprod(m))$vector
D <- diag(zapsmall(diag(t(U) %*% m %*% V)))
s <- diag(sign(diag(D)))  # Find the signs of the eigenvalues
U <- U %*% s              # Adjust the columns of U
D <- s %*% D              # Fix up D.  (D <- abs(D) would be more efficient.)

U1=svd(m)$u
V1=svd(m)$v
D1=diag(svd(m)$d,n,n)

zapsmall(U1 %*% D1 %*% t(V1)) # SVD
zapsmall(U %*% D %*% t(V))    # Hand-rolled SVD
zapsmall(crossprod(U))        # Check that U is orthonormal
zapsmall(tcrossprod(V))       # Check that V' is orthonormal

1
+1. Bu çok açık. Ben sadece pratikte ya ya Uda Vsonra hesaplamak ile çarparak başka bir matris elde etmek için yeterli olduğunu ekleyebilirim A. Bu şekilde kişi sadece bir (iki yerine) öz kompozisyonu gerçekleştirir ve işaretler doğru şekilde ortaya çıkar.
amoeba

2
@Amoeba Bu doğru: Açıkçası bir eğitim alıştırması olan bir SVD'nin elle hesaplanması ruhu içinde, burada verimliliğe dikkat edilmiyor.
whuber

2
Nazik yardımınız için teşekkürler! Sanırım bu konuyu anlıyorum (sonunda).
failstatistician

3
@Federico Bu hatırlatma için teşekkür ederim. Oldukça haklısınız - dolaylı olarak tüm özdeğerlerin farklı olduğunu varsaydım, çünkü aslında bu kesinlikle istatistiksel uygulamalarda kesinlikle olacak ve biri "dejenere" özdeğerlerle olan belirsizlikleri dikkate alma alışkanlığından kurtuluyor.
whuber

3
Haklısın, bu sadece bir uç dava ve gerçekten zor bir dava. Bir anlamda, cevabınızda ana hatlarıyla belirttiğiniz aynı sorunun başka bir tezahürüdür, bu yöntem ve sütunları arasında bir "eşleşme" sağlamamaktadır . Öz kompozisyonlardan başlayarak SVD'nin hesaplanması hala harika bir öğrenme örneğidir. UV
Federico Poloni

5

@ Whuber'ın cevabına yaptığı bir açıklamada belirttiğim gibi, SVD'yi hesaplamak için bu yöntem her matris için işe yaramaz . Sorun sadece işaretlerle sınırlı değil.

Sorun öz değerlerini orada tekrarlanabilir olması ve bu durumda bir eigendecomposition ve benzersiz değil ve her seçim değildir ve SVD diyagonal faktörünü almak için kullanılabilir. Örneğin, herhangi bir çapraz olmayan dikey matris alırsanız (örneğin, ), o zaman . Özvektörü matrisi tüm olası seçenekleri arasında , döner bu durumda bu nedenle, çapraz değildir.AAAAUVA=[3/54/54/53/5]AA=AA=IIeigenU=V=IUAV=A

Sezgisel olarak, bu, @whuber'ın belirttiği aynı problemin başka bir tezahürüdür, ve sütunları arasında bir "eşleşme" olması ve iki öz kompozisyonun ayrı ayrı hesaplanması bunu sağlamaz.UV

tüm tekil değerleri farklıysa, özdeğişim benzersizdir (ölçeklendirme / işaretlere kadar) ve yöntem çalışır. Açıklama: öyle hala kullanmak iyi bir fikir değil sen ürünler oluştururlar zaman çünkü, kayan nokta aritmetik bir bilgisayarda üretim kodunda ve bilgisayarlı sonuç sırasına bir miktar ile tedirgin olabilir , burada makine hassasiyetidir. Tekil değerlerin büyüklükleri büyük ölçüde farklılık gösteriyorsa ( kabaca den fazla ), bu en küçük değerlerin sayısal doğruluğuna zarar verir.birbir'birbirbir'bir2uu2x10-1610-8

SVD'yi iki öz bileşimden hesaplamak harika bir öğrenme örneğidir, ancak gerçek hayatta uygulamalar her zaman R'nin svdfonksiyonunu tekil değer ayrışmasını hesaplamak için kullanır.


1
Bu yorum iyi bir tavsiye. Bununla birlikte, bu iş parçacığının SVD'yi hesaplamanın doğru yolu ile ilgili olmadığını lütfen unutmayın (ve kimsenin tavsiyenize karşı tartışmayacağına inanıyorum). OP, örtük olarak bu svdişi kabul eder . Gerçekten de, amacı, svdherhangi bir şekilde değiştirmemek yerine, anlayışı kontrol etmek olan bir el hesaplamasını karşılaştırmak için bir standart olarak kullanırlar .
whuber

@whuber Doğru gözlem; Son paragrafı yeniden yazdım.
Federico Poloni
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.