एक माध्य और एक विचरण को देखते हुए एक साधारण फ़ंक्शन कॉल है जो एक सामान्य वितरण की साजिश करेगा?
एक माध्य और एक विचरण को देखते हुए एक साधारण फ़ंक्शन कॉल है जो एक सामान्य वितरण की साजिश करेगा?
जवाबों:
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats as stats
import math
mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, stats.norm.pdf(x, mu, sigma))
plt.show()
scipy.stats.norm.pdf(x, mu, sigma)
बजायmlab.normpdf(x, mu, sigma)
math
जब आप पहले से आयात करते हैं numpy
और उपयोग कर सकते हैं तो आप आयात क्यों करते हैं np.sqrt
?
math
स्केलर ऑपरेशन के लिए उपयोग करना चाहता हूं , उदाहरण के लिए, स्केलर पर काम करते समय की math.sqrt
तुलना में तेजी से अधिक np.sqrt
होता है।
मुझे नहीं लगता कि कोई ऐसा कार्य है जो एक कॉल में होता है। हालाँकि आप गॉसियन प्रायिकता घनत्व फ़ंक्शन को देख सकते हैं scipy.stats
।
तो सबसे आसान तरीका है जो मैं आ सकता हूं:
import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import norm
# Plot between -10 and 10 with .001 steps.
x_axis = np.arange(-10, 10, 0.001)
# Mean = 0, SD = 2.
plt.plot(x_axis, norm.pdf(x_axis,0,2))
plt.show()
सूत्रों का कहना है:
norm.pdf
करने के लिए norm(0, 1).pdf
। इससे अन्य मामलों को समायोजित करने में आसानी होती है / यह समझने के लिए कि यह एक यादृच्छिक चर का प्रतिनिधित्व करने वाली वस्तु उत्पन्न करता है।
सीबॉर्न का उपयोग करें इसके बजाय मैं 1000 मूल्यों के माध्य = 5 एसटीडी = 3 के साथ सीबॉर्न के डिस्टलॉट का उपयोग कर रहा हूं
value = np.random.normal(loc=5,scale=3,size=1000)
sns.distplot(value)
आपको एक सामान्य वितरण वक्र मिलेगा
यदि आप एक कदम से कदम दृष्टिकोण का उपयोग करना पसंद करते हैं तो आप इस तरह के समाधान पर विचार कर सकते हैं
import numpy as np
import matplotlib.pyplot as plt
mean = 0; std = 1; variance = np.square(std)
x = np.arange(-5,5,.01)
f = np.exp(-np.square(x-mean)/2*variance)/(np.sqrt(2*np.pi*variance))
plt.plot(x,f)
plt.ylabel('gaussian distribution')
plt.show()
मैं अभी इस पर वापस आया हूं और मुझे scipy को स्थापित करना था क्योंकि matplotlib.mlab ने मुझे MatplotlibDeprecationWarning: scipy.stats.norm.pdf
ऊपर दिए गए प्रयास करते समय त्रुटि संदेश दिया था । तो नमूना अब है:
%matplotlib inline
import math
import matplotlib.pyplot as plt
import numpy as np
import scipy.stats
mu = 0
variance = 1
sigma = math.sqrt(variance)
x = np.linspace(mu - 3*sigma, mu + 3*sigma, 100)
plt.plot(x, scipy.stats.norm.pdf(x, mu, sigma))
plt.show()
मेरा मानना है कि ऊंचाई तय करना महत्वपूर्ण है, इसलिए इस समारोह को बनाया:
def my_gauss(x, sigma=1, h=1, mid=0):
from math import exp, pow
variance = pow(sdev, 2)
return h * exp(-pow(x-mid, 2)/(2*variance))
sigma
मानक विचलन कहाँ है, h
ऊँचाई है और mid
माध्य है।
यहाँ विभिन्न ऊंचाइयों और विचलन का उपयोग करने का परिणाम है:
आप आसानी से cdf प्राप्त कर सकते हैं। इसलिए पीडीएफ पीडीएफ के माध्यम से
import numpy as np
import matplotlib.pyplot as plt
import scipy.interpolate
import scipy.stats
def setGridLine(ax):
#http://jonathansoma.com/lede/data-studio/matplotlib/adding-grid-lines-to-a-matplotlib-chart/
ax.set_axisbelow(True)
ax.minorticks_on()
ax.grid(which='major', linestyle='-', linewidth=0.5, color='grey')
ax.grid(which='minor', linestyle=':', linewidth=0.5, color='#a6a6a6')
ax.tick_params(which='both', # Options for both major and minor ticks
top=False, # turn off top ticks
left=False, # turn off left ticks
right=False, # turn off right ticks
bottom=False) # turn off bottom ticks
data1 = np.random.normal(0,1,1000000)
x=np.sort(data1)
y=np.arange(x.shape[0])/(x.shape[0]+1)
f2 = scipy.interpolate.interp1d(x, y,kind='linear')
x2 = np.linspace(x[0],x[-1],1001)
y2 = f2(x2)
y2b = np.diff(y2)/np.diff(x2)
x2b=(x2[1:]+x2[:-1])/2.
f3 = scipy.interpolate.interp1d(x, y,kind='cubic')
x3 = np.linspace(x[0],x[-1],1001)
y3 = f3(x3)
y3b = np.diff(y3)/np.diff(x3)
x3b=(x3[1:]+x3[:-1])/2.
bins=np.arange(-4,4,0.1)
bins_centers=0.5*(bins[1:]+bins[:-1])
cdf = scipy.stats.norm.cdf(bins_centers)
pdf = scipy.stats.norm.pdf(bins_centers)
plt.rcParams["font.size"] = 18
fig, ax = plt.subplots(3,1,figsize=(10,16))
ax[0].set_title("cdf")
ax[0].plot(x,y,label="data")
ax[0].plot(x2,y2,label="linear")
ax[0].plot(x3,y3,label="cubic")
ax[0].plot(bins_centers,cdf,label="ans")
ax[1].set_title("pdf:linear")
ax[1].plot(x2b,y2b,label="linear")
ax[1].plot(bins_centers,pdf,label="ans")
ax[2].set_title("pdf:cubic")
ax[2].plot(x3b,y3b,label="cubic")
ax[2].plot(bins_centers,pdf,label="ans")
for idx in range(3):
ax[idx].legend()
setGridLine(ax[idx])
plt.show()
plt.clf()
plt.close()
%matplotlib inline
दिखाने के लिए प्लॉट प्राप्त करने के लिए