समस्या का विश्लेषण
मैट्रिक्स का SVD कभी भी विशिष्ट नहीं होता है। मैट्रिक्स करते हैंA आयाम हैं n×k और इसके एसवीडी होने दो
ए = यूडीवी'
एक के लिए एन × पी आव्यूह यू असामान्य स्तंभों के साथ, एक विकर्ण पी × पी आव्यूह डी गैर-नकारात्मक प्रविष्टियों के साथ, और ए के × पी आव्यूह वी असामान्य स्तंभों के साथ।
अब चुनें, मनमाने ढंग से , किसी भी विकर्णपी × पी आव्यूह एस होने ± १विकर्ण पर है, ताकि एस2= मैं है पी × पी पहचान मैंपी। फिर
ए = यूडीवी'= यूमैंडी आईवी'= यू(एस2) डी (एस2)वी'= ( यूएस) ( एसडी एस) ( वीएस)'
यह भी है एक की SVDए चूंकि
( यूएस)'( यूएस) =एस'यू'यूएस=एस'मैंपीएस=एस'एस=एस2=मैंपी
यह दर्शाता है
यूएस ऑर्थोनॉमिक कॉलम और एक समान गणना प्रदर्शित करता है
वीएसअसामान्य स्तंभ हैं। इसके अलावा, के बाद से
एस तथा
डी विकर्ण हैं, वे हंगामा करते हैं, जहां
एसडी एस= डीएस2= डी
दिखाता है
डी अभी भी गैर-नकारात्मक प्रविष्टियाँ हैं।
एसवीडी खोजने के लिए कोड में कार्यान्वित विधि एक पाता है यू यह विकर्ण करता है
एए'= ( यूडीवी') ( यूडीवी')'= यूडीवी'वीडी'यू'= यूडी2यू'
और, इसी तरह, ए
वी यह विकर्ण करता है
ए'ए = वीडी2वी'।
यह गणना करने के लिए आगे बढ़ता है
डी में पाए गए प्रतिजन के संदर्भ में
डी2।
समस्या यह है कि यह कॉलम के सुसंगत मिलान का आश्वासन नहीं देता हैयू के कॉलम के साथ वी।
एक तरकीब
इसके बजाय, ऐसा खोजने के बाद यू और इस तरह एक वी, उन्हें गणना करने के लिए उपयोग करें
यू'एक वी=यू'( यूडीवी') वी= (यू'यू) डी (वी'वी) = डी
सीधे और कुशलता से। इस के विकर्ण मूल्यडीजरूरी नहीं कि सकारात्मक हो। (ऐसा इसलिए है क्योंकि विकर्ण करने की प्रक्रिया के बारे में कुछ भी नहीं हैए'ए या एए' यह गारंटी देगा कि, चूंकि उन दो प्रक्रियाओं को अलग-अलग किया गया था।) विकर्ण के साथ प्रविष्टियों को चुनकर उन्हें सकारात्मक बनाएं एस की प्रविष्टियों के संकेतों के बराबर है डी, ताकि एसडीसभी सकारात्मक मूल्य हैं। इसके लिए राइट-गुणा करके मुआवजा देंयू द्वारा एस:
ए = यूडीवी'= ( यूएस) ( एसडी )वी'।
वह एसवीडी है।
उदाहरण
चलो n = p = k = 1 साथ में ए = ( - 2 )। एक SVD है
( - 2 ) = ( 1 ) ( 2 ) ( - 1 )
साथ में यू= ( 1 ), D=(2), तथा V=(−1)।
यदि आप विकर्ण करते हैं A′A=(4) आप स्वाभाविक रूप से चुनेंगे U=(1) तथा D=(4–√)=(2)। इसी तरह अगर आप विकर्ण करते हैंAA′=(4) आप चुनेंगे V=(1)। दुर्भाग्य से,
UDV′=(1)(2)(1)=(2)≠A.
इसके बजाय, गणना करें
D=U′AV=(1)′(−2)(1)=(−2).
क्योंकि यह नकारात्मक है, सेट करें
S=(−1)। यह समायोजित करता है
U सेवा
US=(1)(−1)=(−1) तथा
D सेवा
SD=(−1)(−2)=(2)। आपने प्राप्त कर लिया है
A=(−1)(2)(1),
जो दो संभावित एसवीडी में से एक है (लेकिन मूल के समान नहीं है!)।
कोड
यहाँ संशोधित कोड है। इसकी आउटपुट पुष्टि करता है
- विधि
m
सही ढंग से पुनः बनाता है।
- U तथा V वास्तव में अभी भी असाधारण हैं।
- लेकिन परिणाम उसी एसवीडी द्वारा नहीं लौटाया जाता है
svd
। (दोनों समान रूप से मान्य हैं।)
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