मैं एक्सएक्सएक्स 'और एक्स'एक्स के ईजेनवल्यू अपघटन के माध्यम से एक्स का एक वैध एसवीडी क्यों नहीं प्राप्त कर सकता हूं?


9

मैं हाथ से SVD करने की कोशिश कर रहा हूँ:

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)

लेकिन अंतिम पंक्ति mवापस नहीं आती है। क्यों? ऐसा लगता है कि इन eigenvectors के संकेतों के साथ कुछ करना है ... या क्या मैंने इस प्रक्रिया को गलत समझा?



मुझे बार-बार कहा जाता है कि
SVDs

@Amoeba स्पष्ट करने के लिए धन्यवाद। मैं कोड के बजाय अंग्रेजी प्रश्न पर ध्यान केंद्रित कर रहा था। फेलस्टैटिस्टिशियन: देखें कि क्या D=diag(c(-1,1,1)*sqrt(eigen(m%*%t(m))$values))करता है और यह ध्यान में रखता है कि वर्गमूल (साथ ही किसी भी सामान्य आइगेनवीक्टर) को केवल साइन अप करने के लिए परिभाषित किया गया है। और अधिक जानकारी के लिए, परिवर्तन के लिए mकरने के लिए m <- matrix(-2,1,1)और शामिल ,1,1)करने के लिए कॉल में से प्रत्येक के अंत में diag। यह है एक1×1उदाहरण जो एक ही समस्या पैदा करता है - लेकिन यह इतना सरल है कि समस्या की प्रकृति पूरी तरह से स्पष्ट हो जाएगी।
whuber

1
समझ गया। धन्यवाद! क्या आपके पास वेक्टर सी (-1, 1, 1) का निर्धारण करने का एक सामान्य नियम है? या दो अपघटन के संकेत कैसे जुड़े होने चाहिए?
फेलस्टैटिशियन

1
ध्यान दें कि @ whuber की चाल c(-1,1,1)काम नहीं करती है, लेकिन Dइस तरह परिभाषित की गई है कि आप एकवचन मान नहीं दे रहे हैं। एकवचन मान सभी परिभाषा द्वारा सकारात्मक होना चाहिए। के संकेतों को कैसे जोड़ा जाए Uऔर Vअच्छा हो, का प्रश्न और मेरे पास कोई उत्तर नहीं है। तुम सिर्फ एक SVD क्यों नहीं करते? :-)
अमीबा

जवाबों:


13

समस्या का विश्लेषण

मैट्रिक्स का SVD कभी भी विशिष्ट नहीं होता है। मैट्रिक्स करते हैं आयाम हैं n× और इसके एसवीडी होने दो

=यूडीवी'

एक के लिए n×पी आव्यूह यू असामान्य स्तंभों के साथ, एक विकर्ण पी×पी आव्यूह डी गैर-नकारात्मक प्रविष्टियों के साथ, और ए ×पी आव्यूह वी असामान्य स्तंभों के साथ।

अब चुनें, मनमाने ढंग से , किसी भी विकर्णपी×पी आव्यूह एस होने ±1विकर्ण पर है, ताकि एस2=मैं है पी×पी पहचान मैंपी। फिर

=यूडीवी'=यूमैंडीमैंवी'=यू(एस2)डी(एस2)वी'=(यूएस)(एसडीएस)(वीएस)'

यह भी है एक की SVD चूंकि

(यूएस)'(यूएस)=एस'यू'यूएस=एस'मैंपीएस=एस'एस=एस2=मैंपी
यह दर्शाता है यूएस ऑर्थोनॉमिक कॉलम और एक समान गणना प्रदर्शित करता है वीएसअसामान्य स्तंभ हैं। इसके अलावा, के बाद सेएस तथा डी विकर्ण हैं, वे हंगामा करते हैं, जहां
एसडीएस=डीएस2=डी
दिखाता है डी अभी भी गैर-नकारात्मक प्रविष्टियाँ हैं।

एसवीडी खोजने के लिए कोड में कार्यान्वित विधि एक पाता है यू यह विकर्ण करता है

'=(यूडीवी')(यूडीवी')'=यूडीवी'वीडी'यू'=यूडी2यू'
और, इसी तरह, ए वी यह विकर्ण करता है
'=वीडी2वी'
यह गणना करने के लिए आगे बढ़ता है डी में पाए गए प्रतिजन के संदर्भ में डी2समस्या यह है कि यह कॉलम के सुसंगत मिलान का आश्वासन नहीं देता हैयू के कॉलम के साथ वी

एक तरकीब

इसके बजाय, ऐसा खोजने के बाद यू और इस तरह एक वी, उन्हें गणना करने के लिए उपयोग करें

यू'वी=यू'(यूडीवी')वी=(यू'यू)डी(वी'वी)=डी

सीधे और कुशलता से। इस के विकर्ण मूल्यडीजरूरी नहीं कि सकारात्मक हो। (ऐसा इसलिए है क्योंकि विकर्ण करने की प्रक्रिया के बारे में कुछ भी नहीं है' या ' यह गारंटी देगा कि, चूंकि उन दो प्रक्रियाओं को अलग-अलग किया गया था।) विकर्ण के साथ प्रविष्टियों को चुनकर उन्हें सकारात्मक बनाएं एस की प्रविष्टियों के संकेतों के बराबर है डी, ताकि एसडीसभी सकारात्मक मूल्य हैं। इसके लिए राइट-गुणा करके मुआवजा देंयू द्वारा एस:

=यूडीवी'=(यूएस)(एसडी)वी'

वह एसवीडी है।

उदाहरण

चलो n=पी==1 साथ में =(-2)। एक SVD है

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

साथ में यू=(1), D=(2), तथा V=(1)

यदि आप विकर्ण करते हैं 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)। यह समायोजित करता हैU सेवा US=(1)(1)=(1) तथा D सेवा SD=(1)(2)=(2)। आपने प्राप्त कर लिया है
A=(1)(2)(1),
जो दो संभावित एसवीडी में से एक है (लेकिन मूल के समान नहीं है!)।

कोड

यहाँ संशोधित कोड है। इसकी आउटपुट पुष्टि करता है

  1. विधि mसही ढंग से पुनः बनाता है।
  2. U तथा V वास्तव में अभी भी असाधारण हैं।
  3. लेकिन परिणाम उसी एसवीडी द्वारा नहीं लौटाया जाता है 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

1
+1। यह बहुत स्पष्ट है। मैं केवल यह जोड़ना चाहूंगा कि व्यवहार में यह Uया तो गणना करने के लिए पर्याप्त है या Vफिर एक और मैट्रिक्स के साथ गुणा करने के लिए प्राप्त करने के लिए A। इस तरह से केवल एक (दो के बजाय) इगेंडेकोम्पोजिशन करते हैं, और संकेत सही निकलेंगे।
अमीबा

2
@ अम्मेबा यह सही है: एसवीडी को हाथ से कंप्यूटिंग करने की भावना में, जो स्पष्ट रूप से एक शैक्षिक अभ्यास है, यहां दक्षता पर कोई ध्यान नहीं दिया जाता है।
whuber

2
आपकी इस सदय सहायता के लिए धन्यवाद! मुझे लगता है कि मैं इस मुद्दे (अंत में) को समझता हूं।
फेलस्टैटिस्टिशियन

3
@ फ़ेडरिको उस अनुस्मारक के लिए धन्यवाद। आप काफी हद तक सही हैं - मैंने स्पष्ट रूप से माना है कि सभी eigenvalues ​​अलग-अलग हैं, वास्तव में यह निश्चित रूप से सांख्यिकीय अनुप्रयोगों में होने जा रहा है और एक "अध: पतन" eensenspaces के साथ अस्पष्टता पर विचार करने की आदत से बाहर निकलता है।
whuber

3
आप सही हैं, यह केवल एक किनारे का मामला है, और वास्तव में एक मुश्किल है। कुछ अर्थों में, यह उसी समस्या का एक और प्रकटीकरण है जिसे आप अपने उत्तर में रेखांकित करते हैं, कि यह विधि कॉलम के बीच "मिलान" सुनिश्चित नहीं करती हैU तथा V। एसिवडी को आइगेंडेकोम्पोजिशन से शुरू करना अभी भी एक महान उदाहरण है।
फेडेरिको पोलोनी

5

जैसा कि मैंने @ व्हिबर के उत्तर के लिए एक टिप्पणी में बताया है, एसवीडी की गणना करने का यह तरीका हर मैट्रिक्स के लिए काम नहीं करता है । मुद्दा केवल संकेतों तक सीमित नहीं है।

समस्या यह है कि बार-बार eigenvalues ​​हो सकते हैं, और इस मामले में eigendecomposition की AA तथा AA अद्वितीय नहीं है और सभी विकल्पों में से नहीं है U तथा VSVD के विकर्ण कारक को पुनः प्राप्त करने के लिए इस्तेमाल किया जा सकता है। उदाहरण के लिए, यदि आप कोई गैर-विकर्ण ऑर्थोगोनल मैट्रिक्स लेते हैं (कहते हैं,A=[3/54/54/53/5]), फिर AA=AA=I। के सभी संभव विकल्पों के बीच eigenvector मैट्रिक्सI, eigen लौट आएगाU=V=I, इस मामले में UAV=A विकर्ण नहीं है।

सहज रूप से, यह उसी समस्या का एक और प्रकटीकरण है जो @whuber की रूपरेखा है, कि स्तंभों के बीच "मिलान" होना है U तथा V, और दो अलग-अलग eigendecompositions कंप्यूटिंग यह सुनिश्चित नहीं करता है।

यदि सभी एकवचन का मान Aअलग-अलग हैं, फिर इगेंडेकोम्पोजिशन अद्वितीय है (स्केलिंग / संकेत तक) और विधि काम करती है। टिप्पणी: फ्लोटिंग अंक अंकगणित वाले कंप्यूटर पर उत्पादन कोड में इसका उपयोग करना अभी भी एक अच्छा विचार नहीं है , क्योंकि उत्पादों को बनाते समयAA तथा AA गणना किए गए परिणाम के क्रम की मात्रा से गड़बड़ी हो सकती है A2u, कहाँ पे u2×1016मशीन परिशुद्धता है। यदि एकवचन मानों का परिमाण बहुत भिन्न होता है (अधिक से अधिक)108, लगभग), यह सबसे छोटी की संख्यात्मक सटीकता के लिए हानिकारक है।

एसवीडी को दो ईगेंडेकोम्पोजिशन से समझना एक महान सीखने का उदाहरण है, लेकिन वास्तविक जीवन में अनुप्रयोग हमेशा svdएकवचन मान के अपघटन की गणना करने के लिए आर के फ़ंक्शन का उपयोग करते हैं।


1
यह टिप्पणी अच्छी सलाह है। कृपया ध्यान दें, हालांकि, यह धागा एसवीडी की गणना करने के उचित तरीके के बारे में चिंतित नहीं है (और मेरा मानना ​​है कि कोई भी आपकी सिफारिश के खिलाफ बहस नहीं करेगा)। ओपी निहित रूप से उस svdकार्य को स्वीकार करता है। वास्तव में, वे इसे एक मानक के रूप में उपयोग करते हैं, जिसके खिलाफ हाथ की गणना की जाती है, जिसका उद्देश्य svdकिसी भी तरह से प्रतिस्थापित करने के लिए नहीं, समझ की जांच करना है ।
whuber

@ शुभंकर सही अवलोकन; मैंने पिछले पैराग्राफ को फिर से लिखा है।
फेडेरिको पोलोनी
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.