이미 binned 된 데이터에 로그 정규 분포를 만들고 싶습니다. 막대 플롯은 다음과 같습니다. 이미 binned 데이터 파이썬에 로그 정규 분포를 맞 춥니 다
불행하게도 표준 lognorm.pdf()
을 사용하려고하면 적합 분포의 모양이 매우 다릅니다. 내 데이터가 이미 binned되어 있기 때문이죠. 여기 코드는 다음과 같습니다
times, data, bin_points = ReadHistogramFile(filename)
xmin = 200
xmax = 800
x = np.linspace(xmin, xmax, 1000)
shape, loc, scale = stats.lognorm.fit(data, floc=0)
pdf = stats.lognorm.pdf(x, shape, loc=loc, scale=scale)
area=data.sum()
plt.bar(bars, data, width=10, color='b')
plt.plot(x*area, pdf, 'k')
여기에 장착 분포가 어떻게 생겼는지입니다 : 분명히 스케일링으로도 뭔가 문제가있다. 나는 그것에 대해 덜 염려한다. 내 주요 문제는 배포판의 모양입니다. 이 중복 될 수 있습니다 : this question하지만 올바른 솔루션을 찾을 수 없습니다. 나는 그것을 시험해 보았고 위의 과정을 할 때와 매우 비슷한 모양을 얻는다. 어떤 도움을 주셔서 감사합니다!
업데이트 : 을 사용하면 curve_fit()
을 사용하여 어느 정도 적응할 수있었습니다. 그러나 나는 아직 만족하지 못했다. 원래 통 (bin)을 갖고 싶습니다. 단결 통 (unit bins)이 아닙니다. 또한 나는 정확히 무엇이 일어나고 있는지, 그리고 더 나은 적합성이 없는지 잘 모르겠습니다. 여기 코드는 : 당신이 언급으로
def normalize_integral(data, bin_size):
normalized_data = np.zeros(size(data))
print bin_size
sum = data.sum()
integral = bin_size*sum
for i in range(0, size(data)-1):
normalized_data[i] = data[i]/integral
print 'integral:', normalized_data.sum()*bin_size
return normalized_data
def pdf(x, mu, sigma):
"""pdf of lognormal distribution"""
return (np.exp(-(np.log(x) - mu)**2/(2 * sigma**2))/(x * sigma * np.sqrt(2 * np.pi)))
bin_points=np.linspace(280.5, 1099.55994, len(bin_points))
data=[9.78200000e+03 1.15120000e+04 1.18000000e+04 1.79620000e+04 2.76980000e+04 2.78260000e+04 3.35460000e+04 3.24260000e+04 3.16500000e+04 3.30820000e+04 4.84560000e+04 5.86500000e+04 6.34220000e+04 5.11880000e+04 5.13180000e+04 4.74320000e+04 4.35420000e+04 4.13400000e+04 3.60880000e+04 2.96900000e+04 2.66640000e+04 2.58720000e+04 2.57560000e+04 2.20960000e+04 1.46880000e+04 9.97200000e+03 5.74200000e+03 3.52000000e+03 2.74600000e+03 2.61800000e+03 1.50000000e+03 7.96000000e+02 5.40000000e+02 2.98000000e+02 2.90000000e+02 2.22000000e+02 2.26000000e+02 1.88000000e+02 1.20000000e+02 5.00000000e+01 5.40000000e+01 5.80000000e+01 5.20000000e+01 2.00000000e+01 2.80000000e+01 6.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00 0.00000000e+00]
normalized_data_unitybins = normalize_integral(data,1)
plt.figure(figsize=(9,4))
ax1=plt.subplot(121)
ax2=plt.subplot(122)
ax2.bar(unity_bins, normalized_data_unitybins, width=1, color='b')
fitParams, fitCov = curve_fit(pdf, unity_bins, normalized_data_unitybins, p0=[1,1],maxfev = 1000000)
fitData=pdf(unity_bins, *fitParams)
ax2.plot(unity_bins, fitData,'g-')
ax1.bar(bin_points, normalized_data_unitybins, width=10, color='b')
fitParams, fitCov = curve_fit(pdf, bin_points, normalized_data_unitybins, p0=[1,1],maxfev = 1000000)
fitData=pdf(bin_points, *fitParams)
ax1.plot(bin_points, fitData,'g-')
이것은'pdf'의 꼬리처럼 보인다. x 축에서 축소 시도 –
범위 [0,1000]에 대해서도 동일하게 보입니다. – aces
'shape','loc' 및'scale'의 값은 무엇입니까? –