programing

밀도도를 만드는 방법

newstyles 2023. 7. 18. 21:35

밀도도를 만드는 방법

RI에서는 다음을 수행하여 원하는 출력을 생성할 수 있습니다.

data = c(rep(1.5, 7), rep(2.5, 2), rep(3.5, 8),
         rep(4.5, 3), rep(5.5, 1), rep(6.5, 8))
plot(density(data, bw=0.5))

Density plot in R

파이썬(matplotlib 포함)에서 가장 가까운 것은 간단한 히스토그램입니다.

import matplotlib.pyplot as plt
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
plt.hist(data, bins=6)
plt.show()

Histogram in matplotlib

저도 노름 =을 시도해 보았습니다. 매개 변수이지만 가우스를 히스토그램에 맞추려고 시도하는 것 이외에는 가져올 수 없습니다.

제가 최근에 시도한 것은scipy.stats그리고.gaussian_kde웹의 예를 따르지만, 저는 지금까지 성공하지 못했습니다.

5년 후 구글에서 "파이썬을 사용하여 커널 밀도 플롯을 만드는 방법"을 검색해도 이 스레드는 여전히 맨 위에 표시됩니다!

오늘날, 이것을 하는 훨씬 더 쉬운 방법은 많은 편리한 그리기 기능과 좋은 스타일 관리를 제공하는 패키지인 Seaborn을 사용하는 것입니다.

import numpy as np
import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.set_style('whitegrid')
sns.kdeplot(np.array(data), bw=0.5)

enter image description here

Sven은 클래스 사용 방법을 보여주었습니다.gaussian_kdeScipy에서 가져온 것이지만 R로 생성한 것과는 전혀 닮지 않았습니다.그 이유는gaussian_kde대역폭을 자동으로 추론하려고 합니다.기능을 변경하여 대역폭을 사용할 수 있습니다.covariance_factorgaussian_kde클래스. 첫째, 기능을 변경하지 않고 얻을 수 있는 것은 다음과 같습니다.

alt text

그러나 다음 코드를 사용하는 경우:

import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import gaussian_kde
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = gaussian_kde(data)
xs = np.linspace(0,8,200)
density.covariance_factor = lambda : .25
density._compute_covariance()
plt.plot(xs,density(xs))
plt.show()

알겠습니다

alt text

그것은 당신이 R로부터 얻고 있는 것에 꽤 가깝습니다.내가 어쨌길래요? gaussian_kde변경 가능한 기능을 사용합니다.covariance_factor대역폭을 계산합니다.함수를 변경하기 전에 이 데이터에 대해 covalance_factor가 반환한 값은 약 .5였습니다.이 값을 낮추면 대역폭이 줄어듭니다.전화를 해야만 했습니다._compute_covariance모든 요인이 정확하게 계산되도록 함수를 변경한 후.이것은 R의 bw 파라미터와 정확하게 일치하지 않지만, 당신이 올바른 방향으로 가는 데 도움이 되기를 바랍니다.

옵션 1:

사용하다pandas데이터 프레임 그림(위에 빌드됨)matplotlib):

import pandas as pd
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
pd.DataFrame(data).plot(kind='density') # or pd.Series()

enter image description here

옵션 2:

사용하다distplotseaborn:

import seaborn as sns
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
sns.distplot(data, hist=False)

enter image description here

다음과 같은 방법을 시도해 보십시오.

import matplotlib.pyplot as plt
import numpy
from scipy import stats
data = [1.5]*7 + [2.5]*2 + [3.5]*8 + [4.5]*3 + [5.5]*1 + [6.5]*8
density = stats.kde.gaussian_kde(data)
x = numpy.arange(0., 8, .1)
plt.plot(x, density(x))
plt.show()

쉽게 교체할 수 있습니다.gaussian_kde()다른 커널 밀도 추정치에 의해.

밀도 그림은 matplotlib을 사용하여 만들 수도 있습니다.plt.hist(data) 함수는 밀도도에 필요한 y 및 x 값을 반환합니다(문서 https://matplotlib.org/3.1.1/api/_as_gen/matplotlib.pyplot.hist.html) 참조).따라서 다음 코드는 matplotlib 라이브러리를 사용하여 밀도도를 만듭니다.

import matplotlib.pyplot as plt
dat=[-1,2,1,4,-5,3,6,1,2,1,2,5,6,5,6,2,2,2]
a=plt.hist(dat,density=True)
plt.close()
plt.figure()
plt.plot(a[1][1:],a[0])      

이 코드는 다음 밀도 그림을 반환합니다.

enter image description here

다음과 같은 작업을 수행할 수 있습니다.

s = np.random.normal(2, 3, 1000)
import matplotlib.pyplot as plt
count, bins, ignored = plt.hist(s, 30, density=True)
plt.plot(bins, 1/(3 * np.sqrt(2 * np.pi)) * np.exp( - (bins - 2)**2 / (2 * 3**2) ), 
linewidth=2, color='r')
plt.show()

언급URL : https://stackoverflow.com/questions/4150171/how-to-create-a-density-plot