решение параметров бета-распределения с учетом среднего значения и дисперсии с использованием scipy - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть 'mu' и 'дисперсия', рассчитанные на основе данных, и я пытаюсь найти параметры распределения бета-версий

import sympy as sy
mu = sp.mean(univariate_samples[3])
var = sp.var(univariate_samples[3])
alpha = sy.symbols('alpha')
beta = sy.symbols('beta')
mu = alpha/(alpha+beta)
var = (alpha*beta)/(((alpha+beta)**2)*(alpha+beta+1))
sy.solve([mu*(alpha+beta)-alpha,var*((alpha+beta)**2)*(alpha+beta+1)- 
(alpha*beta)],[alpha,beta],[1, 1])

Я получаю следующую ошибку Ошибка типа: может только объединить список (не "Символ") в список

1 Ответ

0 голосов
/ 06 сентября 2018

Это не то, для чего Sym Py: для символических манипуляций, а не для решения некоторой системы уравнений с параметрами с плавающей точкой, полученными из данных. Вы получаете ошибку, потому что [1, 1] не относится к решению SymPy, для символических решений нет «отправной точки». Но до этого код был глубоко испорчен: дважды присваивались mu и var (второе назначение стирает предыдущее, это Python-назначения, а не уравнения).

Суть в том, что используйте решение от SciPy, когда вам нужно численное решение проблемы.

from scipy import optimize
mu = 0.6
var = 0.2
def f(x, mu, var):
  alpha, beta = x[0], x[1]
  return [alpha/(alpha+beta) - mu, (alpha*beta)/(((alpha+beta)**2)*(alpha+beta+1)) - var]
rv = optimize.root(f, [1, 1], args=(mu, var)).x

который находит решение [0.12, 0.08]


Кстати, ничего из этого не нужно делать для начала: чтобы подогнать распределение под данные, нужно использовать fit методы из scipy.stats, которые учитывают весь набор данных , Поиск параметров формы путем приравнивания среднего значения и дисперсии к среднему значению выборки и дисперсии - плохая идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...