2011-02-11 5 views
5

मैं मैटलैब से पायथन तक कुछ कोड पोर्ट करने की कोशिश कर रहा हूं और मैंने एक समस्या में भाग लिया है। मैं svds के बराबर नहीं लग रहा है।पायथन: बड़े सरणी के लिए मैटलैब के एसवीडीएस (ए, के) के बराबर?

मैंने numpy.corrcoef और फिर numpy.linalg.eig का उपयोग करने की कोशिश की, लेकिन numpy.corrcoef बड़े सरणी (500 x 20000 कहें) के लिए काम नहीं करता है।

यहाँ matlab में कोड है, के मामले में यह किसी भी फर्क नहीं पड़ता:

s = size(data, 2) 
mean = sum(data, 2)/s 
m_data = (data - repmat(mean, 1, s))/sqrt(s - 1) 
[res_u,res_s] = svds(m_data, s) 
eigenvals = diag(res_s).^2 
eigenvecs = res_u 
+0

क्या 'numpy.linalg.svd' अपर्याप्त है? – kwatford

+0

@kwatford समस्या eig/svd नहीं है, यह corrcoef है। और काम करने के लिए या तो eig या svd के लिए, मुझे पहले corrcoef का उपयोग करना होगा। खैर, मेरे वर्तमान दृष्टिकोण के साथ। इससे संपर्क करने का एक और तरीका हो सकता है कि मुझे पता नहीं है। – digdin

+0

'सहसंबंध गुणांक' पर अधिक विस्तार करने की देखभाल? वे आपके 'matlab'-code से कैसे संबंधित हैं। मेरा जवाब देखें, वास्तव में 'सहसंबंध गुणांक' की प्रसंस्करण को जोड़ने में कोई समस्या नहीं होनी चाहिए। लेकिन उनके लिए आपका न्याय क्या है? कृपया, जो आप लक्ष्य कर रहे हैं उसे और समझने के लिए कृपया 'सहसंबंध गुणांक' की गणना के साथ, अपना पूरा 'matlab' कोड दिखाएं! धन्यवाद – eat

उत्तर

2

यदि आपका मैट्रिक्स विरल है, तो आप एक हाल ही में scipy वितरण में scipy.sparse.linalg.svds उपयोग कर सकते हैं। यह ARPACK में स्पैस एसवीडी रूटीन लपेटता है। मेरे अनुभव में, यह छोटी है (यकीन नहीं है कि यह scipy या ARPACK की गलती है), इसलिए मैं जांचने के लिए परीक्षण परीक्षण की सलाह देता हूं कि एकवचन मूल्यों की अपेक्षा की जाती है।

यदि आपका मैट्रिक्स घना है, 50000 20000 बड़ा है लेकिन इन दिनों कमोडिटी डेस्कटॉप पर अचूक नहीं है। numpy.linalg.svdfull_matrices=False के साथ कॉल कर रहे हैं, है ना?

आप numpy.corrcoef का उपयोग कर रहे हैं? ऐसा कुछ भी नहीं है जिसे आपने पोस्ट किया गया MATLAB कोड स्निपेट में दिखाई देता है।

+0

मुझे एक मैट्रिक्स देखने में दिलचस्पी होगी जिसके लिए Scipy's svds सही तरीके से काम नहीं करता है। क्या आप एक आपूर्ति कर सकते हैं? स्रोत कोड बहुत सरल है। –

3

आप के लिए तो क्या देख रहे हैं, python और numpy में कुछ इस तरह होगा (मैं स्वतंत्रता नहीं ले लिया 'सीधे अनुवाद कर' के लिए python और numpy को matlab -code, बजाय मैं यह एक छोटा सा पुनर्संशोधित करने के लिए 'लग रहा है 'अधिक pythonic [काफी समान रिफैक्टरिंग रूप में अच्छी तरह matlab -code लागू किया जा सकता of'course]):

import numpy as np 

def _cas(D): 
    """Center at mean and standardize.""" 
    return (D- D.mean(1)[:, None])/ (D.shape[1]- 1)** .5 

def example(D): 
    """Eigenvalues and -vectors, based on SVD.""" 
    u, s, v= np.linalg.svd(D, full_matrices= False); 
    return np.diag(s)** 2, u 

if __name__ == '__main__': 
    data= np.random.rand(5, 20) 
    data= _cas(data) # preprocess data according to your requirements 
    eigenvals, eigenvecs= example(data) 
    print eigenvals 
    print eigenvecs 

लेकिन आप इसके साथ एक प्रदर्शन समस्या है?

क्या अब आप अपने वर्तमान प्रदर्शन के अधिक विशिष्ट हो सकते हैं, और आप वास्तव में कितनी उम्मीद कर सकते हैं इसे बढ़ाया जाना चाहिए? मेरे मामूली कंप्यूटर में एफटीआईडब्ल्यू, एक यादृच्छिक (500, 20000) मैट्रिक्स example(.) निष्पादित करने में कुछ 20 सेकेंड खर्च करेगा।

मैं त्रिभुज (मूल रैखिक बीजगणित के कारण) निष्पादन समय को 2.5 सेकंड (लगभग 10 गुना सुधार) जैसे स्तर तक कम कर सकता हूं! अब, यदि आप इससे बेहतर प्रदर्शन की तलाश में हैं, तो कृपया अपने data की 'प्रकृति' पर अधिक विस्तृत स्तर में विस्तृत करें!

आपका डेटा कहां से आ रहा है? गणना किए गए eigenvalues, और -विक्टर का उपयोग करने के लिए आपका विशिष्ट मामला क्या है? यानी आपका मुख्य लक्ष्य क्या हासिल करना है?

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