2016-02-08 8 views
5

मुझे scipy.stats.multivariate_normal का उपयोग करने का प्रयास करने में परेशानी हो रही है, उम्मीद है कि आप में से कोई भी मदद कर सकता है।scipy.stats.multivariate_normal raising 'LinAlgError: एकवचन मैट्रिक्स' भले ही मेरा कॉन्वर्सिस मैट्रिक्स उलटा

मैं एक 2x2 मैट्रिक्स जो numpy.linalg.inv() का उपयोग करने का उलटा खोजने के लिए संभव है, लेकिन जब मैं मैं प्राप्त एक LinAlgError करते हुए कहा कि यह एक विलक्षण मैट्रिक्स है multivariate_normal में सहप्रसरण मैट्रिक्स के रूप में उपयोग करने का प्रयास:

In [89]: cov = np.array([[3.2e5**2, 3.2e5*0.103*-0.459],[3.2e5*0.103*-0.459, 0.103**2]]) 

In [90]: np.linalg.inv(cov) 
Out[90]: 
array([[ 1.23722158e-11, 1.76430200e-05], 
     [ 1.76430200e-05, 1.19418880e+02]]) 

In [91]: multivariate_normal([0,0], cov) 
--------------------------------------------------------------------------- 
LinAlgError        Traceback (most recent call last) 
<ipython-input-91-44a6625beda5> in <module>() 
----> 1 multivariate_normal([0,0], cov) 

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __call__(self, mean, cov, allow_singular, seed) 
    421   return multivariate_normal_frozen(mean, cov, 
    422           allow_singular=allow_singular, 
--> 423           seed=seed) 
    424 
    425  def _logpdf(self, x, mean, prec_U, log_det_cov, rank): 

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __init__(self, mean, cov, allow_singular, seed) 
    591   """ 
    592   self.dim, self.mean, self.cov = _process_parameters(None, mean, cov) 
--> 593   self.cov_info = _PSD(self.cov, allow_singular=allow_singular) 
    594   self._dist = multivariate_normal_gen(seed) 
    595 

/mnt/ssd/Enthought_jli199/Canopy_64bit/User/lib/python2.7/site-packages/scipy/stats/_multivariate.pyc in __init__(self, M, cond, rcond, lower, check_finite, allow_singular) 
    217   d = s[s > eps] 
    218   if len(d) < len(s) and not allow_singular: 
--> 219    raise np.linalg.LinAlgError('singular matrix') 
    220   s_pinv = _pinv_1d(s, eps) 
    221   U = np.multiply(u, np.sqrt(s_pinv)) 

LinAlgError: singular matrix 
+2

आप किस प्रकार के numpy का उपयोग करते हैं? मैं सफलतापूर्वक कोड 1.10.1 पर कोड चला सकता हूं। ध्यान दें कि मैट्रिक्स * तकनीकी रूप से * उलटा होने के बावजूद, यह बहुत बुरी तरह से स्केल किया गया है। – kazemakase

+0

हाय काज़ेमेक, यह संस्करण 1.9.2 है। – Jonnyishman

उत्तर

8

डिफ़ॉल्ट रूप से multivariate_normal जांचता है कि क्या कॉन्वर्सिस मैट्रिक्स के किसी भी प्रकार के ईगेंवल्यूज़ इसके टाइपिंग और इसके सबसे बड़े ईगेंवल्यू के आयाम के आधार पर चुने गए कुछ सहिष्णुता से कम हैं (पूर्ण विवरण के लिए scipy.stats._multivariate._PSD और scipy.stats._multivariate._eigvalsh_to_eps के लिए स्रोत कोड पर नज़र डालें)।

के रूप में ऊपर उल्लेख किया @kazemakase, जबकि अपने सहप्रसरण मैट्रिक्स np.linalg.inv द्वारा इस्तेमाल किया मापदंड के अनुसार उलटी हो सकता है, यह अभी भी बहुत बीमार वातानुकूलित है और अधिक कठोर multivariate_normal द्वारा इस्तेमाल किया परीक्षण विफल रहता है।

आप इस परीक्षण को छोड़ने के लिए allow_singular=Truemultivariate_normal पास कर सकते हैं, लेकिन सामान्यतः यह आपके डेटा को पुन: सहेजना बेहतर होगा ताकि पहले स्थान पर ऐसी बीमार स्थिति वाले कॉन्वर्सिस मैट्रिक्स को पार करने से बचें।

+0

हाय ali_m, आपकी मदद के लिए धन्यवाद। मैं अब multivariate_normal के लिए स्रोत कोड के अंदर किए गए चेक देख रहा हूं। मैं अपने डेटा को मानकीकृत करने जा रहा हूं ताकि इस तरह के एक असुरक्षित कॉन्वर्सिस मैट्रिक्स से बचें। – Jonnyishman

संबंधित मुद्दे