मैं साइपी की स्पैस रैखिक बीजगणित लाइब्रेरी का उपयोग करके, बड़े (लेकिन अभी भी ट्रैक्टेबल) सिस्टम के लिए न्यूप्पी/साइपीपी का उपयोग करके स्पेक्ट्रल क्लस्टरिंग एल्गोरिदम लिखने की कोशिश कर रहा हूं। दुर्भाग्यवश, मैं 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 स्पैस पुस्तकालय का उपयोग करने के लिए कोई सुझाव?
ठीक है, लेकिन समस्या यह है कि मैं सबसे छोटे ईजिनवेल्स और उनके संबंधित ईजिनवेक्टर चाहता हूं, सबसे बड़ा नहीं। दस्तावेज़ीकरण बताता है कि यदि छोटे ईगेंवल्यूज़ वांछित हैं, तो शिफ्ट-इनवर्टर मोड का प्रदर्शन प्रदर्शन में सुधार के लिए किया जाना चाहिए, जो कि मैं 'सिग्मा' का उपयोग करके करने की कोशिश कर रहा था, इसका कोई फायदा नहीं हुआ। – Magsol
उपर्युक्त आपको वही देना चाहिए जो आप चाहते हैं। नोट: सिग्मा = 0 के साथ, रूपांतरित eigenvalues w '= 1/(w-sigma) = 1/w हैं। इसलिए, 'जो =' एलएम 'के साथ आपको बड़ी ** w' ** के साथ eigenvalues मिलते हैं, या दूसरे शब्दों में, मूल समस्या के सबसे छोटे eigenvalues। यदि आप शिफ्ट-इनवर्टर मोड का उपयोग करते हैं, तो आपको तदनुसार 'कौन सा पैरामीटर समायोजित करने की आवश्यकता है। –
बस कहना चाहता था कि यह बेहद सहायक था – YXD