파이썬 플롯 정규 분포


116

평균과 분산이 주어지면 정규 분포를 그리는 간단한 함수 호출이 있습니까?

답변:


208
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()

가스 분포, 평균은 0 분산 1


인라인 옵션이 없어서 필요했습니다. %matplotlib inline플롯을 표시하기 위해
hum3

지원 중단 경고를 방지하려면 이제 scipy.stats.norm.pdf(x, mu, sigma)대신 다음을 사용해야 합니다.mlab.normpdf(x, mu, sigma)
Leonardo Gonzalez

또한 : math이미 가져 왔고 numpy사용할 수 있는데 왜 가져 오나요 np.sqrt?
user8408080

1
@ user8408080 : 여기서 성능은 문제가되지 않지만 math, 예를 들어 스칼라에서 작업 할 math.sqrt때보 np.sqrt다 훨씬 더 빠르기 때문에 스칼라 작업 에 사용하는 경향이 있습니다 .
unutbu

Y 축을 0에서 100 사이의 숫자로 변경하려면 어떻게해야합니까?
Hamid

54

나는 한 번의 호출로 모든 것을 수행하는 기능이 있다고 생각하지 않습니다. 그러나에서 가우스 확률 밀도 함수를 찾을 수 있습니다 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()

출처 :


2
당신은 아마 변경해야합니다 norm.pdfnorm(0, 1).pdf. 이를 통해 다른 경우에보다 쉽게 ​​적응할 수 있고 랜덤 변수를 나타내는 객체가 생성된다는 것을 이해할 수 있습니다.
Martin Thoma

10

대신 seaborn을 사용하십시오 .1000 값 중 mean = 5 std = 3 인 seaborn의 distplot을 사용하고 있습니다.

value = np.random.normal(loc=5,scale=3,size=1000)
sns.distplot(value)

정규 분포 곡선을 얻을 수 있습니다.


9

Unutbu 대답이 맞습니다. 그러나 우리의 평균이 0보다 크거나 작을 수 있기 때문에 여전히 이것을 변경하고 싶습니다.

x = np.linspace(-3 * sigma, 3 * sigma, 100)

이에 :

x = np.linspace(-3 * sigma + mean, 3 * sigma + mean, 100)

5

단계별 접근 방식을 선호하는 경우 다음과 같은 솔루션을 고려할 수 있습니다.

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()

1

나는 방금 이것으로 돌아 왔고 MatplotlibDeprecationWarning: scipy.stats.norm.pdf위의 예제를 시도 할 때 matplotlib.mlab이 오류 메시지를 주었으므로 scipy를 설치해야했습니다 . 이제 샘플은 다음과 같습니다.

%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()

1

높이를 설정하는 것이 중요하다고 생각하므로 다음 기능을 만들었습니다.

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평균입니다.

다음은 다른 높이와 편차를 사용한 결과입니다.

여기에 이미지 설명 입력


0

당신은 쉽게 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()
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.