programing

정규 분포 그림을 그리는 방법

magicmemo 2023. 7. 15. 10:00
반응형

정규 분포 그림을 그리는 방법

평균과 분산이 주어지면 정규 분포를 표시하는 단순 함수 호출이 있습니까?

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

gass distro, mean is 0 variance 1

통화 한 번에 다 하는 기능은 없는 것 같습니다.그러나 다음에서 가우스 확률 밀도 함수를 찾을 수 있습니다.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()

출처:

대신 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]

다양한 높이와 편차를 사용한 결과는 다음과 같습니다.

enter image description here

나는 방금 이것으로 돌아왔고 나는 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()

enter image description here

저에게는, 만약 당신이 특정 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

반응형