반응형
정규 분포 그림을 그리는 방법
평균과 분산이 주어지면 정규 분포를 표시하는 단순 함수 호출이 있습니까?
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
.
그래서 제가 생각해낼 수 있는 가장 간단한 방법은:
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()
출처:
- http://www.johndcook.com/distributions_scipy.html
- http://docs.scipy.org/doc/scipy/reference/stats.html
- http://telliott99.blogspot.com/2010/02/plotting-normal-distribution-with.html
대신 sea born 사용 평균=5 std=3/1000 값을 갖는 sea born의 분포도를 사용합니다.
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()
unutbu 정답입니다.그러나 우리의 평균은 0보다 크거나 작을 수 있기 때문에 저는 여전히 이것을 바꾸고 싶습니다.
x = np.linspace(-3 * sigma, 3 * sigma, 100)
여기까지:
x = np.linspace(-3 * sigma + mean, 3 * sigma + mean, 100)
높이를 설정하는 것이 중요하다고 생각하여 이 기능을 만들었습니다.
def my_gauss(x, sigma=1, h=1, mid=0):
from math import exp, pow
variance = pow(sigma, 2)
return h * exp(-pow(x-mid, 2)/(2*variance))
어디에sigma
표준 편차입니다.h
높이와mid
평균입니다.
받는 사람:
plt.close("all")
x = np.linspace(-20, 20, 101)
yg = [my_gauss(xi) for xi in x]
다양한 높이와 편차를 사용한 결과는 다음과 같습니다.
나는 방금 이것으로 돌아왔고 나는 scipy를 설치해야 했습니다 matplotlib.mlab이 위의 예를 시도할 때 나에게 오류 메시지를 주었습니다.이제 샘플은 다음과 같습니다.
%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()
당신은 쉽게 cdf를 얻을 수 있습니다. 그래서 cdf를 통해 pdf.
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()
import math
import matplotlib.pyplot as plt
import numpy
import pandas as pd
def normal_pdf(x, mu=0, sigma=1):
sqrt_two_pi = math.sqrt(math.pi * 2)
return math.exp(-(x - mu) ** 2 / 2 / sigma ** 2) / (sqrt_two_pi * sigma)
df = pd.DataFrame({'x1': numpy.arange(-10, 10, 0.1), 'y1': map(normal_pdf, numpy.arange(-10, 10, 0.1))})
plt.plot('x1', 'y1', data=df, marker='o', markerfacecolor='blue', markersize=5, color='skyblue', linewidth=1)
plt.show()
저에게는, 만약 당신이 특정 pdf를 플롯하려고 한다면, 이것은 꽤 잘 작동했습니다.
theta1 = {
"a": 0.5,
"cov" : 1,
"mean" : 0
}
x = np.linspace(start = 0, stop = 1000, num = 1000)
pdf = stats.norm.pdf(x, theta1['mean'], theta1['cov']) + theta2['a']
sns.lineplot(x,pdf)
언급URL : https://stackoverflow.com/questions/10138085/how-to-plot-normal-distribution
반응형
'programing' 카테고리의 다른 글
'구독' 속성이 'void' 유형에 없습니다.Angular 2 asp.net 코어 (0) | 2023.07.15 |
---|---|
엔디언은 바이트의 비트 순서를 나타낼 수 있습니까? (0) | 2023.07.15 |
도커 구성 작업이지만 비주얼 스튜디오 코드 개발 컨테이너를 사용하면 작업이 수행되지 않습니다. (0) | 2023.07.15 |
테이블의 int 열을 고유한 증분 값으로 업데이트 (0) | 2023.07.10 |
화력 기지 내 자유 계획의 제한 (0) | 2023.07.10 |