#python #statistics #data-science #sympy
#python #Статистика #наука о данных #sympy
Вопрос:
Я хотел бы вычислить производную по изменению нормального распределения. Все для того, чтобы узнать оценку вариации с использованием метода максимального правдоподобия. Это мой код.
import numpy as np
import sympy as sym
from sympy.solvers import solve
from sympy import Product, Function, oo, IndexedBase, diff, Eq, symbols, Sum, factorial, E, sqrt, pi, exp
x = IndexedBase('x')
i = symbols('i', positive=True)
n = symbols('n', positive=True)
s = symbols('s') # s = standard deviation
m = symbols('m') # m = expected value
def var(): # var = variance (function var() has been created as variance depends on standard deviation)
return s*s
formula = (1/(s*sqrt(2*pi)))*exp((-1/2)*((x[i]-m)**2/(var())))
Формула, которая охватывает функцию массы вероятности для нормального распределения, выглядит
и функция максимального правдоподобия для нормального распределения выглядит
.
Функция, которая вычисляет эту оценку, приведена ниже.
def Maximum_Likelihood(param, pmf): # probability mass function, param - parameter for which I want to get estimator
i = symbols('i', positive=True)
n = symbols('n', positive=True)
Likelihood_function = Product(pmf, (i, 1, n))
deriv = diff(Likelihood_function, param) # the problem is here with .diff()
equation_to_solve = Eq(deriv,0).doit()
return solve(equation_to_solve, param)
И когда я выполняю вышеуказанную функцию для аргументов:
param = var()
pmf = formula
Maximum_Likelihood(param, pmf)
Я получаю:
Ошибка значения: не удается вычислить производную по s ** 2.
Я знаю, что не .diff()
может вычислять производные для несимволов, но я надеюсь, что существует решение этой проблемы.
Спасибо!
Комментарии:
1. Вы могли бы заменить
s
sqrt(v)
, а затем дифференцировать wrtv
.2. Спасибо, Оскар, я создал новый символ
v = symbols('v') # v = variance
, а затем использовал метод .subs() дляpmf = formula.subs(s, sqrt(v))
и получил результат