2014-10-06 9 views
5

बनाते समय त्रुटियों के लिए लेखांकन मेरे पास N का एक सेट है जो 2 डी स्पेस में (x[i], y[i]), i=0..N अंक के रूप में वितरित किया गया है। प्रत्येक बिंदु ने दोनों निर्देशांक (e_x[i], e_y[i], i=0..N) में त्रुटियों को जोड़ा है और इसके साथ वजन भी जोड़ा है (w[i], i=0..N)।हिस्टोग्राम

मैं, इन N अंक की एक 2 डी हिस्टोग्राम उत्पन्न करने के लिए वजन के लिए, लेकिन यह भी त्रुटियां हैं, जिसके कारण होगा प्रत्येक बिंदु होने के लिए न केवल लेखांकन चाहते हैं संभवतः कई डिब्बे के बीच फैल यदि त्रुटि मान बड़े हैं पर्याप्त (त्रुटियों के लिए मानक Gaussian distribution मानते हुए, हालांकि अन्य वितरणों पर विचार किया जा सकता है)।

मुझे लगता है कि numpy.histogram2d में weights पैरामीटर है जिसका ध्यान रखा जाता है। मुद्दा यह होगा कि N प्रत्येक अंक में त्रुटियों के लिए कैसे खाता है।

क्या कोई ऐसा कार्य है जो मुझे ऐसा करने देगा? मैं numpy और scipy में कुछ भी खोल रहा हूं।

+0

इन त्रुटि मान क्या प्रतिनिधित्व करते हैं? क्या प्रमुख अक्षों के साथ ये मानक विचलन हैं? –

+0

@ डेब्रायन ठीक है। – Gabriel

+0

ठीक है, पैरामीटर का सेट एक बहुविकल्पीय जीएमएम का गठन करता है, दिए गए वजन (\ pi_i), नमूनों के रूप में नमूने (\ mu_i) और कॉन्वर्सिस मैट्रिस (\ Sigma_i) [[e_x [i] ** 2,0] [ 0, e_y [i] ** 2]]। आपके द्वारा माने गए मानक सामान्य मामले के विपरीत (जो सभी ई_एक्स और ई_ई 1.0 के बराबर है), आपके पास कॉन्वर्सिस मैट्रिस हैं जहां विकर्ण के पास अलग-अलग मान हो सकते हैं। यह सर्कल के विपरीत, प्रमुख अक्षों के साथ प्रमुख अक्षों के साथ अंडाकारों से मेल खाता है। क्या इससे आपको आगे बढ़ने में मदद मिलती है? –

उत्तर

1

उपयोगकर्ता 1415 9 46 की टिप्पणी पर बिल्डिंग, आप मान सकते हैं कि प्रत्येक बिंदु को [[e_x[i]**2,0][0,e_y[i]**2]] द्वारा दिए गए कॉन्वर्सिस मैट्रिस के साथ दर्शाता है। हालांकि, परिणामी वितरण सामान्य वितरण नहीं है - उदाहरण के बाद, आप देखेंगे कि हिस्टोग्राम गॉसियन जैसा नहीं है, बल्कि इसके बजाय एक समूह है।

वितरण के इस सेट से हिस्टोग्राम बनाने के लिए, एक तरफ मैं देखता हूं कि numpy.random.multivariate_normal का उपयोग करके प्रत्येक बिंदु से यादृच्छिक नमूने उत्पन्न करना है। कुछ कृत्रिम डेटा के साथ नीचे उदाहरण कोड देखें।

import numpy as np 
from mpl_toolkits.mplot3d import Axes3D 
import matplotlib.pyplot as plt 


# This is a function I like to use for plotting histograms 
def plotHistogram3d(hist, xedges, yedges): 
    fig = plt.figure() 
    ax = fig.add_subplot(111, projection='3d') 
    hist = hist.transpose() 
    # Transposing is done so that bar3d x and y match hist shape correctly 
    dx = np.mean(np.diff(xedges)) 
    dy = np.mean(np.diff(yedges)) 

    # Computing the number of elements 
    elements = (len(xedges) - 1) * (len(yedges) - 1) 
    # Generating mesh grids. 
    xpos, ypos = np.meshgrid(xedges[:-1]+dx/2.0, yedges[:-1]+dy/2.0) 

    # Vectorizing matrices 
    xpos = xpos.flatten() 
    ypos = ypos.flatten() 
    zpos = np.zeros(elements) 
    dx = dx * np.ones_like(zpos) * 0.5 # 0.5 factor to give room between bars. 
# Use 1.0 if you want all bars 'glued' to each other 
    dy = dy * np.ones_like(zpos) * 0.5 
    dz = hist.flatten() 

    ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b') 
    ax.set_xlabel('x') 
    ax.set_ylabel('y') 
    ax.set_zlabel('Count') 
    return 

""" 
INPUT DATA 
""" 
#     x y ex ey w 
data = np.array([[1, 2, 1, 1, 1], 
       [3, 0, 1, 1, 2], 
       [0, 1, 2, 1, 5], 
       [7, 7, 1, 3, 1]]) 

""" 
Generate samples 
""" 
# Sample size (100 samples will be generated for each data point) 
SAMPLE_SIZE = 100 
# I want to fill in a table with columns [x, y, w]. Each data point generates SAMPLE_SIZE 
# samples, so we have SAMPLE_SIZE * (number of data points) generated points 
points = np.zeros((SAMPLE_SIZE * data.shape[0], 3)) # Initializing this matrix 

for i, element in enumerate(data): # For each row in the data set 
    meanVector = element[:2] 
    covarianceMatrix = np.diag(element[2:4]**2) # Diagonal matrix with elements equal to error^2 
    # For columns 0 and 1, add generated x and y samples 
    points[SAMPLE_SIZE*i:SAMPLE_SIZE*(i+1), :2] = \ 
     np.random.multivariate_normal(meanVector, covarianceMatrix, SAMPLE_SIZE) 
    # For column 2, simply copy original weight 
    points[SAMPLE_SIZE*i:SAMPLE_SIZE*(i+1), 2] = element[4] # weights 

hist, xedges, yedges = np.histogram2d(points[:, 0], points[:, 1], weights=points[:, 2]) 
plotHistogram3d(hist, xedges, yedges) 
plt.show() 

परिणाम नीचे दर्शाया गया:

enter image description here

+0

गेब्रियल, क्या आप कुछ टिप्पणियां जोड़ सकते हैं जो वर्णन करते हैं कि प्रत्येक पंक्ति आपके उदाहरण में क्या करती है? इसके अलावा, आप 'matplotlib' का कौन सा संस्करण चल रहे हैं? मेरे पास संस्करण 1.3.1 है और आपका उदाहरण चलाने की कोशिश करने से मुझे 'ValueError: अज्ञात प्रक्षेपण' 3 डी 'देता है; यहां दिए गए उदाहरण के बाद यह अजीब है http://stackoverflow.com/q/3810865/1391441 कोई समस्या नहीं है। – Gabriel

+1

मैं आपके जैसा ही संस्करण उपयोग करता हूं, लेकिन जवाब देने से पहले मैंने गलती से एक आयात लाइन हटा दी थी। यह काम करना चाहिए। धन्यवाद –

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