Подходит логнормальная функция для подсчета данных - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть набор данных о размере частиц, которые сгруппированы по размеру и нормализованы по ширине бина. Я хотел бы приспособить функцию логнормального распределения к этим данным, но у меня есть некоторые проблемы. Большая часть программного обеспечения (например, scipy.stats.lognormal.fit) ожидает необработанные данные, и, похоже, нет способа сделать то же самое для уже собранных данных.

enter image description here

Как лучше всего разместить эти данные в логнормальном распределении? Я сделал CSV-файл с доступными данными: https://drive.google.com/file/d/1wxsJuyu7rv0VQBHAYyreZmQqKiIZ7dz5/view?usp=sharing

1 Ответ

0 голосов
/ 23 апреля 2020

Лучший способ найти это - использовать scipy.optimize.curve_fit. Ниже приведен пример кода, использующий данные примера выше:

import matplotlib.pyplot as plt
import pandas as pd
import numpy as np
from scipy.optimize import curve_fit

# Define lognormal PDF as function of x, mu, and sigma
def lognorm_fit(x, mu, sigma):
    y = (1/(sigma*x*np.sqrt(2*np.pi))) * np.exp(-1* ((np.log(x) - mu)**2/(2*sigma**2)))
    return y

# Open data
df = pd.read_csv('./data.csv')

# Read data, using the lower bin limit as x
count = df['count']
x = df['lower_bin_limit']
width = df['upper_bin_limit'] - df['lower_bin_limit']

# Divide by bin width and normalize by total count
y = count/width/(count.sum())
plt.plot(x,y)

# Use curve_fit to find the two parameters in lognom_fit function
# Curve fit returns a tuple of (mu, sigma) and the covariance,
# Which isn't needed.
(mu,sigma), _ = curve_fit(lognorm_fit, xdata=x, ydata=y)
print(mu, sigma)

# Generate lognorm PDF using values of mu, sigma
yy = lognorm_fit(x, mu, sigma)

# Plot Results
plt.plot(x,y)
plt.plot(x, yy)
plt.xscale('log')
plt.show()

enter image description here

...