Как найти периодический интервал и периодическое среднее по распределению фонезов? - PullRequest
0 голосов
/ 05 июня 2018

У меня есть некоторые данные времени (часы дня).Я хотел бы приспособить распределение фонезов к этим данным и найти периодическое среднее.Как мне сделать это, используя scipy в python?

, например:

from scipy.stats import vonmises
data = [1, 2, 22, 23]
A = vonmises.fit(data)

Я не уверен, как я могу получить распределение (интервал, вероятно) и периодическое среднее этих данных с использованием подгонкиили среднее или интервальное методы.

1 Ответ

0 голосов
/ 01 марта 2019

Хорошая работа по поиску дистрибутива виртуальной машины.Это половина битвы.Но если я не ошибаюсь по формуле в 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)))

Нажмите, чтобы увидеть результат вышеприведенного кода * Как быстрое предостережение, вам, скорее всего, понадобится больший набор данных, чтобы сделать некоторую правильную подгонку и действительно установить тенденцию численности населения.

...