2010-11-08 10 views
7

के साथ scipy.stats.gaussian_kde का उपयोग करना मैं अक्षांश और देशांतर जानकारी के साथ एकत्रित कुछ अलग डेटा को सुगम बनाने के लिए the scipy.stats.gaussian_kde class का उपयोग करने का प्रयास कर रहा हूं, इसलिए यह अंत में एक समोच्च मानचित्र के समान कुछ दिखाई देता है, जहां उच्च घनत्व चरम और कम घनत्व घाटी हैं।2 आयामी डेटा

मुझे gaussian_kde कक्षा में एक द्वि-आयामी डेटासेट डालने में कठिनाई हो रही है। मैं चारों ओर यह पता लगाने की कि यह कैसे 1 आयामी डेटा के साथ काम करता खेला है, इसलिए मैंने सोचा की तर्ज पर 2 आयामी कुछ होगा:

from scipy import stats 
from numpy import array 
data = array([[1.1, 1.1], 
       [1.2, 1.2], 
       [1.3, 1.3]]) 
kde = stats.gaussian_kde(data) 
kde.evaluate([1,2,3],[1,2,3]) 

जो कह रहा है मैं [1.1, 1.1], [1.2, 1.2], [1.3, 1.3] पर 3 अंक है। और मैं एक्स और वाई अक्ष पर 1 की चौड़ाई का उपयोग करके कर्नेल घनत्व अनुमान 1 से 3 तक उपयोग करना चाहता हूं।

जब gaussian_kde बनाने, यह मेरे इस त्रुटि दे रही रखता है:

raise LinAlgError("singular matrix") 
numpy.linalg.linalg.LinAlgError: singular matrix 

gaussian_kde के स्रोत कोड में देख रहे हैं, मुझे लगता है कि जिस तरह से मैं क्या डाटासेट का मतलब है के बारे में सोच रहा हूँ से कैसे पूरी तरह से अलग है आयाम गणना की जाती है, लेकिन मुझे कोई नमूना कोड नहीं मिला जो दिखाता है कि मॉड्यूल के साथ बहु आयामी डेटा कैसे काम करता है। क्या कोई मुझे बहु-आयामी डेटा के साथ gaussian_kde का उपयोग करने के कुछ नमूना तरीकों से मदद कर सकता है?

+0

इसे डेटा के साथ आज़माएं जो सभी लाइन में नहीं है। मुझे यकीन नहीं है कि क्या इसके लिए असफल होना चाहिए, या यदि यह एक बग है। – endolith

उत्तर

4

मुझे लगता है कि आप इंटरपोलेशन या शायद कर्नेल रिग्रेशन के साथ कर्नेल घनत्व अनुमान को मिश्रित कर रहे हैं। यदि आपके पास अंक का बड़ा नमूना है तो केडीई अंकों के वितरण का अनुमान लगाता है।

मुझे यकीन नहीं है कि आप कौन सा इंटरपोलेशन चाहते हैं, लेकिन या तो scipy.interpolate में splines या rbf अधिक उपयुक्त होगा।

यदि आप एक-आयामी कर्नेल रिग्रेशन चाहते हैं, तो आप कई अलग-अलग कर्नेल के साथ scikits.statsmodels में एक संस्करण पा सकते हैं।

अद्यतन: यहाँ एक उदाहरण है (अगर यह तुम क्या चाहते है)

>>> data = 2 + 2*np.random.randn(2, 100) 
>>> kde = stats.gaussian_kde(data) 
>>> kde.evaluate(np.array([[1,2,3],[1,2,3]])) 
array([ 0.02573917, 0.02470436, 0.03084282]) 

gaussian_kde स्तंभों में पंक्तियों में चर और टिप्पणियों, इसलिए आँकड़े में सामान्य से उन्मुखीकरण उलट है। आपके उदाहरण में, सभी तीन बिंदु एक रेखा पर हैं, इसलिए इसका पूर्ण सहसंबंध है। मुझे लगता है, एकवचन मैट्रिक्स का कारण है।

सरणी उन्मुखीकरण समायोजन और एक छोटा सा शोर जोड़ने, उदाहरण के काम करता है, लेकिन अभी भी बहुत ध्यान केंद्रित किया लग रहा है, उदाहरण के लिए आप के पास (3,3) किसी भी नमूने बिंदु की जरूरत नहीं है:

>>> data = np.array([[1.1, 1.1], 
       [1.2, 1.2], 
       [1.3, 1.3]]).T 
>>> data = data + 0.01*np.random.randn(2,3) 
>>> kde = stats.gaussian_kde(data) 
>>> kde.evaluate(np.array([[1,2,3],[1,2,3]])) 
array([ 7.70204299e+000, 1.96813149e-044, 1.45796523e-251]) 
+0

मैं एक सांख्यिकीविद् नहीं हूं, लेकिन केडीई और कर्नेल रिग्रेशन और जेट के "समोच्च मानचित्र" के उल्लेख के बारे में मुझे लगता है कि मुझे लगता है कि केडीई क्या है। – endolith

5

This example लगता है आप जो खोज रहे हैं होने के लिए:

import numpy as np 
import scipy.stats as stats 
from matplotlib.pyplot import imshow 

# Create some dummy data 
rvs = np.append(stats.norm.rvs(loc=2,scale=1,size=(2000,1)), 
       stats.norm.rvs(loc=0,scale=3,size=(2000,1)), 
       axis=1) 

kde = stats.kde.gaussian_kde(rvs.T) 

# Regular grid to evaluate kde upon 
x_flat = np.r_[rvs[:,0].min():rvs[:,0].max():128j] 
y_flat = np.r_[rvs[:,1].min():rvs[:,1].max():128j] 
x,y = np.meshgrid(x_flat,y_flat) 
grid_coords = np.append(x.reshape(-1,1),y.reshape(-1,1),axis=1) 

z = kde(grid_coords.T) 
z = z.reshape(128,128) 

imshow(z,aspect=x_flat.ptp()/y_flat.ptp()) 

enter image description here

अक्ष, ठीक करने की आवश्यकता जाहिर है।

तुम भी उदाहरण शीर्ष जवाब मेरे लिए काम नहीं किया में तैनात

scatter(rvs[:,0],rvs[:,1]) 

enter image description here

+0

https://gist.github.com/1035069 और http://flic.kr/p/9V6onm उदाहरण के लिए – endolith

+0

जब आप कहते हैं, धुरी को ठीक करने की आवश्यकता है, तो आपका क्या मतलब है? क्योंकि मैं डेटा के साथ ऐसा ही कर रहा हूं और किसी कारण से यह न्यूनतम और नीचे डेटा के ऊपर और अधिकतम – ThePredator

+0

@ श्रीवात्सन को वापस देता है: मुझे लगता है कि मेरा मतलब है कि इसका एक और वर्ग पहलू अनुपात होना चाहिए – endolith

0

साथ डेटा की एक बिखराव साजिश कर सकते हैं।मुझे इसे थोड़ा सा ट्विक करना पड़ा और यह अब काम करता है:

import numpy as np 
import scipy.stats as stats 
from matplotlib import pyplot as plt 

# Create some dummy data 
rvs = np.append(stats.norm.rvs(loc=2,scale=1,size=(2000,1)), 
       stats.norm.rvs(loc=0,scale=3,size=(2000,1)), 
       axis=1) 

kde = stats.kde.gaussian_kde(rvs.T) 

# Regular grid to evaluate kde upon 
x_flat = np.r_[rvs[:,0].min():rvs[:,0].max():128j] 
y_flat = np.r_[rvs[:,1].min():rvs[:,1].max():128j] 
x,y = np.meshgrid(x_flat,y_flat) 
grid_coords = np.append(x.reshape(-1,1),y.reshape(-1,1),axis=1) 

z = kde(grid_coords.T) 
z = z.reshape(128,128) 

plt.imshow(z,aspect=x_flat.ptp()/y_flat.ptp()) 
plt.show() 
संबंधित मुद्दे