2012-08-25 100 views
7

मैं साइपी की स्पैस रैखिक बीजगणित लाइब्रेरी का उपयोग करके, बड़े (लेकिन अभी भी ट्रैक्टेबल) सिस्टम के लिए न्यूप्पी/साइपीपी का उपयोग करके स्पेक्ट्रल क्लस्टरिंग एल्गोरिदम लिखने की कोशिश कर रहा हूं। दुर्भाग्यवश, मैं eigsh() के साथ स्थिरता समस्याओं में भाग रहा हूं।छोटे eigenvalues ​​के लिए Scipy's sparse eigsh()

import numpy as np 
import scipy.sparse 
import scipy.sparse.linalg as SLA 
import sklearn.utils.graph as graph 

W = self._sparse_rbf_kernel(self.X_, self.datashape) 
D = scipy.sparse.csc_matrix(np.diag(np.array(W.sum(axis = 0))[0])) 
L = graph.graph_laplacian(W) # D - W 
vals, vects = SLA.eigsh(L, k = self.k, M = D, which = 'SM', sigma = 0, maxiter = 1000) 

sklearn पुस्तकालय एक विरल SciPy मैट्रिक्स से एक ग्राफ Laplacian की गणना के लिए विशेष रूप से this method, scikit सीखने पैकेज को दर्शाता है:

यहाँ मेरी कोड है।

_sparse_rbf_kernel एक तरीका है जिसे मैंने डेटा बिंदुओं की जोड़ी की गणना करने के लिए लिखा है। यह छवि डेटा से एक स्पैस एफ़िनिटी मैट्रिक्स बनाकर संचालित होता है, विशेष रूप से केवल प्रत्येक पिक्सेल के आस-पास 8-पड़ोस के लिए जोड़ीदार affinities की गणना करके (scikit-learn's rbf_kernel विधि के साथ सभी पिक्सेल के लिए जोड़ी की बजाय, जो रिकॉर्ड के लिए या तो इसे ठीक नहीं करता है)।

चूंकि लैपलासिअन असामान्य है, इसलिए मैं सिस्टम के सबसे छोटे eigenvalues ​​और इसी तरह के eigenvectors की तलाश में हूँ। मैं समझता हूं कि ARPACK is ill-suited for finding small eigenvalues, लेकिन मैं इन मानों को खोजने के लिए शिफ्ट-इनवर्टर का उपयोग करने की कोशिश कर रहा हूं और अभी भी बहुत सफलता नहीं है।

scipy.sparse.linalg.eigen.arpack.arpack.ArpackNoConvergence: ARPACK error -1: No convergence (1001 iterations, 0/5 eigenvectors converged) 

मैं सभी तीन अलग-अलग की कोशिश की है:

RuntimeError: Factor is exactly singular 
sigma = 0.001 साथ

, मुझे कोई दूसरी त्रुटि मिलती है:

ऊपर तर्कों (विशेष रूप से, sigma = 0), मैं निम्नलिखित त्रुटि मिलती है साथ

एक ही परिणाम के साथ mode के लिए मूल्य। एक बड़ी प्रणाली के छोटे eigenvalues ​​खोजने के लिए SciPy स्पैस पुस्तकालय का उपयोग करने के लिए कोई सुझाव?

उत्तर

11

आपको which='LM' का उपयोग करना चाहिए: शिफ्ट-उलटा मोड में, यह पैरामीटर रूपांतरित ईगेंवल्यूज़ को संदर्भित करता है। (जैसा कि the documentation में बताया गया है।)

+0

ठीक है, लेकिन समस्या यह है कि मैं सबसे छोटे ईजिनवेल्स और उनके संबंधित ईजिनवेक्टर चाहता हूं, सबसे बड़ा नहीं। दस्तावेज़ीकरण बताता है कि यदि छोटे ईगेंवल्यूज़ वांछित हैं, तो शिफ्ट-इनवर्टर मोड का प्रदर्शन प्रदर्शन में सुधार के लिए किया जाना चाहिए, जो कि मैं 'सिग्मा' का उपयोग करके करने की कोशिश कर रहा था, इसका कोई फायदा नहीं हुआ। – Magsol

+3

उपर्युक्त आपको वही देना चाहिए जो आप चाहते हैं। नोट: सिग्मा = 0 के साथ, रूपांतरित eigenvalues ​​w '= 1/(w-sigma) = 1/w हैं। इसलिए, 'जो =' एलएम 'के साथ आपको बड़ी ** w' ** के साथ eigenvalues ​​मिलते हैं, या दूसरे शब्दों में, मूल समस्या के सबसे छोटे eigenvalues। यदि आप शिफ्ट-इनवर्टर मोड का उपयोग करते हैं, तो आपको तदनुसार 'कौन सा पैरामीटर समायोजित करने की आवश्यकता है। –

+2

बस कहना चाहता था कि यह बेहद सहायक था – YXD