2013-06-07 5 views
12

मैं sklearn, पांडा और numpy के साथ बहुआयामी स्केलिंग की कोशिश कर रहा हूँ। उपयोग की जाने वाली डेटा फ़ाइल में 10 संख्यात्मक कॉलम हैं और कोई गुम मूल्य नहीं है। मैं sklearn.manifold के बहुआयामी स्केलिंग के साथ 2 आयामों में यह दस आयामी डेटा लेने के लिए और यह कल्पना करने के लिए इस प्रकार है कोशिश कर रहा हूँ:नकली, पांडो और स्केलेर्न (ValueError) में बहुआयामी स्केलिंग फिटिंग

import numpy as np 
import pandas as pd 
from sklearn import manifold 
from sklearn.metrics import euclidean_distances 

seed = np.random.RandomState(seed=3) 
data = pd.read_csv('data/big-file.csv') 

# start small dont take all the data, 
# its about 200k records 
subset = data[:10000] 
similarities = euclidean_distances(subset) 

mds = manifold.MDS(n_components=2, max_iter=3000, eps=1e-9, 
     random_state=seed, dissimilarity="precomputed", n_jobs=1) 

pos = mds.fit(similarities).embedding_ 

लेकिन मैं यह मान त्रुटि मिलती है:

Traceback (most recent call last): 
    File "demo/mds-demo.py", line 18, in <module> 
    pos = mds.fit(similarities).embedding_ 
    File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 360, in fit 
    self.fit_transform(X, init=init) 
    File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 395, in fit_transform 
eps=self.eps, random_state=self.random_state) 
    File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 242, in smacof 
eps=eps, random_state=random_state) 
    File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 73, in _smacof_single 
raise ValueError("similarities must be symmetric") 
ValueError: similarities must be symmetric 

मैंने सोचा था कि euclidean_distances लौटे एक सममित मैट्रिक्स। मैं गलत क्या कर रहा हूं और मैं इसे कैसे ठीक करूं?

+2

सबसे पहले देखें कि 'np.allclose (समानताएं हैं, similarites.T)' TRUE' है '। जब मैं इसे यादृच्छिक इनपुट के साथ कोशिश करता हूं तो यह काम करता है। क्या आप यादृच्छिक इनपुट के साथ कोशिश कर सकते हैं? –

+0

'scipy.spatial.distance_matrix' का उपयोग करने का प्रयास करें? या यदि आप किसी भी तरह से यूक्लिडियन दूरी का उपयोग कर रहे हैं, तो आप sklearn को विषमता = "euclidean" का उपयोग करके गणना कर सकते हैं। –

+0

मैं एक समान मुद्दे में भाग गया और मुझे 20 ('np.abs (समानताएं - समानताएं)।) ('Np.abs (समानताएं - समानताएं)। सैकड़ों द्वारा सहिष्णुता को गुणा करके sklearn/manifold/mds.py में L71 को पैच करना पड़ा। मेरे लिए <1e-13 की बजाय, इसलिए चेक बहुत कठोर था और यह असफल रहा। – jorgeca

उत्तर

7

मैं एक ही समस्या में भाग गया; यह पता चला कि मेरा डेटा np.float32 की एक सरणी थी और कम फ्लोट परिशुद्धता ने दूरी मैट्रिक्स को असममित होने का कारण बताया। मैंने एमडीएस चलाने से पहले अपने डेटा को np.float64 में परिवर्तित करके समस्या को ठीक किया।

यहाँ एक उदाहरण यादृच्छिक डेटा का उपयोग करता है इस मुद्दे को वर्णन करने के लिए है:

import numpy as np 
from sklearn.manifold import MDS 
from sklearn.metrics import euclidean_distances 
from sklearn.datasets import make_classification 

data, labels = make_classification() 
mds = MDS(n_components=2) 

similarities = euclidean_distances(data.astype(np.float64)) 
print np.abs(similarities - similarities.T).max() 
# Prints 1.7763568394e-15 
mds.fit(data.astype(np.float64)) 
# Succeeds 

similarities = euclidean_distances(data.astype(np.float32)) 
print np.abs(similarities - similarities.T).max() 
# Prints 9.53674e-07 
mds.fit(data.astype(np.float32)) 
# Fails with "ValueError: similarities must be symmetric" 
+0

Thx का उपयोग करके, यह वास्तव में काम करता है। लेकिन फ्लोट 64 में बदलने के बाद, मुझे एक और चेतावनी मिली: /लाइब्रेरी/पायथन/2.7/site-packages/sklearn/manifold/mds.py:396: UserWarnin जी: एमडीएस एपीआई बदल गया है। 'फिट'' अब डेटा से एक असमानता मैट्रिक्स बनाता है। एक कस्टम असमानता मैट्रिक्स का उपयोग करने के लिए, '' असमानता = 'precomputed''' सेट करें। – NullPointer

6

थोड़ी देर पहले एक ही समस्या थी। एक और समाधान, जिसे मैं अधिक कुशल मानता हूं, केवल ऊपरी त्रिभुज मैट्रिक्स के लिए दूरी की गणना करना है, और बाद में निचले हिस्से में कॉपी करना है।

यह scipy के साथ किया जा सकता है:

from scipy.spatial.distance import squareform,pdist                
similarities = squareform(pdist(data,'speuclidean')) 
संबंधित मुद्दे