Хорошая работа по поиску дистрибутива виртуальной машины.Это половина битвы.Но если я не ошибаюсь по формуле в scipy.stats.vonmises docs , формула предполагает, что данные центрированы на 0, что может быть не так.Таким образом, мы, вероятно, должны построить наш собственный дистрибутив VM.А для нашего распределения Vm мы будем следить за тем, чтобы он был периодическим в диапазоне 24 часа вместо традиционного диапазона 2pi.Смотрите код и комментарии ниже.Кроме того, я предположил, что ваши данные были временем, когда вы видели какое-то событие, вам нужно перенастроить, если это не так.
from scipy.optimize import curve_fit
import numpy as np
from matplotlib import pyplot as plt
# Define the von mises kernel density estimator
def circular_von_mises_kde(x,mu,sigma):
# Adjust data to take it to range of 2pi
x = [(hr)*2*np.pi/24 for hr in x]
mu*=2*np.pi/24
sigma*=2*np.pi/24
# Compute kappa for vm kde
kappa = 1/sigma**2
return np.exp((kappa)*np.cos((x-mu)))/(2*np.pi*i0(kappa))
# Assuming your data is occurences of some event at the given hour of the day
frequencies= np.zeros((24))
frequencies[data]=1
hr_data = np.linspace(1,24, 24)
fit_params, cov = curve_fit(circular_von_mises_kde, hr_data, data_to_fit, bounds=(0,24))
plt.plot(hr_data, frequencies, 'k.',label='Raw data')
plt.plot(np.linspace(1,25, 1000), circular_von_mises_kde(np.linspace(1,25, 1000), *fit_params), 'r-',label='Von Mises Fit')
plt.legend()
plt.xlabel('Hours (0-24)')
plt.show()
print('The predicted mean is {mu} and the standard deviation is {sigma}'.format( mu=round(fit_params[0],3), sigma=round(fit_params[1], 3)))
Нажмите, чтобы увидеть результат вышеприведенного кода * Как быстрое предостережение, вам, скорее всего, понадобится больший набор данных, чтобы сделать некоторую правильную подгонку и действительно установить тенденцию численности населения.