2012-11-20 10 views
7

फिट करने के लिए मेरे पास फिटिंग और यादृच्छिक संख्याएं प्राप्त करने के बारे में कोई प्रश्न है।पाइथन में हिस्टोग्राम से संभाव्यता घनत्व फ़ंक्शन एक और हिस्ट्रोग्राम

सबसे पहले मैं डेटा बिंदुओं से एक हिस्टोग्राम है:

स्थिति जैसे है। मैं इस हिस्टोग्राम को संभाव्यता घनत्व फ़ंक्शन (उदाहरण के लिए 2 मुक्त पैरामीटर) के रूप में व्याख्या करना चाहता हूं ताकि मैं इसे यादृच्छिक संख्याओं का उत्पादन करने के लिए उपयोग कर सकूं और मैं उस फ़ंक्शन का उपयोग किसी अन्य हिस्टोग्राम में फिट करने के लिए करना चाहूंगा।

+7

शायद यह questoin को फिर से खोलना चाहिए और –

+2

में सुधार किया जाना चाहिए यदि आप सवाल नहीं समझते हैं, तो यह सुनिश्चित नहीं है कि यह कोई प्रश्न नहीं है, सिर्फ इसलिए कि आपने नहीं किया था। पहले समझने की कोशिश करो। मैं सौलो में शामिल हो गया। – Geeocode

उत्तर

4

आप described here के रूप में मनमाने ढंग से वितरण से यादृच्छिक संख्या उत्पन्न करने के लिए संचयी घनत्व फ़ंक्शन का उपयोग कर सकते हैं।

एक चिकनी संचयी घनत्व समारोह का उत्पादन करने के लिए एक हिस्टोग्राम का उपयोग पूरी तरह से तुच्छ नहीं है; आप अपने डिब्बे के केंद्रों के बीच मूल्यों के लिए scipy.interpolate.interp1d() उदाहरण के लिए इंटरपोलेशन का उपयोग कर सकते हैं और यह हिस्टोग्राम के लिए उचित रूप से बड़ी संख्या में डिब्बे और वस्तुओं के साथ ठीक काम करेगा। हालांकि आपको संभाव्यता समारोह की पूंछ के रूप में निर्णय लेना है, यानि सबसे छोटे बिन से कम मूल्यों या सबसे बड़े बिन से अधिक मूल्यों के लिए। आप उदाहरण के आधार पर अपने वितरण गाऊशियन पूंछ दे सकते हैं उदाहरण के लिए अपने हिस्टोग्राम के लिए एक गाऊशियन फिट करना), या आपकी समस्या के लिए उचित पूंछ का कोई अन्य रूप, या बस वितरण को छोटा कर सकते हैं।

उदाहरण:

import numpy 
import scipy.interpolate 
import random 
import matplotlib.pyplot as pyplot 

# create some normally distributed values and make a histogram 
a = numpy.random.normal(size=10000) 
counts, bins = numpy.histogram(a, bins=100, density=True) 
cum_counts = numpy.cumsum(counts) 
bin_widths = (bins[1:] - bins[:-1]) 

# generate more values with same distribution 
x = cum_counts*bin_widths 
y = bins[1:] 
inverse_density_function = scipy.interpolate.interp1d(x, y) 
b = numpy.zeros(10000) 
for i in range(len(b)): 
    u = random.uniform(x[0], x[-1]) 
    b[i] = inverse_density_function(u) 

# plot both   
pyplot.hist(a, 100) 
pyplot.hist(b, 100) 
pyplot.show() 

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

पीएस आप कुछ मूल्यों द्वारा वर्णित एक विशिष्ट ज्ञात वितरण को फिट करने का भी प्रयास कर सकते हैं (जो मुझे लगता है कि आपने प्रश्न में जो बताया है) लेकिन उपर्युक्त गैर-पैरामीट्रिक दृष्टिकोण अधिक सामान्य उद्देश्य है।

+0

, त्वरित उत्तर के लिए धन्यवाद, इंटरपोलेशन भी मेरे दिमाग में था, लेकिन जैसा कि आपने पहले कहा था कि यह आउटलेटर्स का ख्याल नहीं रख सकता है और यह वास्तव में एक घनत्व कार्य नहीं है बल्कि प्रारंभिक हिस्टोग्राम की एक प्रति है। – madzone

+2

यह मेरा अंतिम संस्करण है, यह आसानी से काम करता है, धन्यवाद। 'bins = np.linspace (0, .5, num = 800) counts18, bins = np.histogram (Z_DATA [InData18], डिब्बे = डिब्बे) x = np.cumsum (counts18) * 1./np। योग (counts18) * 1। वाई = डिब्बे [रेंज (लेन (एक्स) +1)] वाई = वाई [1:] फिट = scipy.interpolate.interp1d (x, y) plt.hist (फिट (np.random.uniform (x [0], एक्स [-1], लेन (डेटा))), डिब्बे = वाई) plt.hist (डेटा, अल्फा = 0.3, डिब्बे = वाई) plt.show() ' – madzone