如何使用 python 找到已知数据的多项式分布参数?
How to find multinomial distribution parameter for a known data using python?
我刚开始学习Python。这是一个数据框:
a=pd.DataFrame({'A1':[0,1,2,3,2,1,6,0,1,1,7,10]})
现在我认为这个数据服从多项分布。因此,12 个数字表示 12 个类别(类别 0、1、2 ...)的频率。例如类别0的出现次数为0。所以,我希望找到给定这个数据的多项式的所有参数。最后,我们拥有多项式的最佳参数(或者我们可以说每个数字的最佳概率)。例如,
category: 0, 1, 2, 3, 4...
weights: 0.001, 0.1, 0.2, 0.12, 0.2...
所以,我不需要测试数据来预测。这不是分类。作为一个新手,我什至不确定我是否应该使用 scipy.stats.multinomial 或 sklearn 模型,或其他一些技术。那么,任何人都可以给我一些帮助吗?
最大似然估计 (MLE) 是获得参数点估计的最重要的程序之一分布。这就是您需要开始的。
解析解:
多国分布是二项分布的扩展,可以通过分析得到MLE .请参阅此 math stack exchange post (MLE for Multinomial Distribution) 以获得完整的解析解。该过程从定义一个似然函数开始,L(p) 以观测数据 x(i) 为条件,其中 p 和 x 是 k 类/ categories[=71= 的概率和观察到的事件] 和 i= 0,1,...k。它是在给定 参数集 (p) 的情况下观察一组 观察结果 (x) 的可能性的度量:
L(p) 等于:
主要思想是在参数 (p) 范围内最大化似然函数值。给定总观测值 n(即所有类别的总和),点估计值 等于:
a.values/a.values.sum() # point estimates for p = x/n
# array([[0. ], [0.02941176], [0.05882353], [0.08823529],
# [0.05882353], [0.02941176], [0.17647059], [0. ],
# [0.02941176], [0.02941176], [0.20588235], [0.29411765]])
数值解:
以上结果也可以用scipy.optimize.minimize
数值求得。请注意 L(p) 是阶乘项和指数项的乘积。阶乘项是常数,不依赖于参数值 (p),因此不考虑优化。对于指数项,最好进行log变换,简化objective函数; MLE 的常见做法,因为 log 是一个 单调递增 函数。此外,由于 scipy.optimize.minimize
用于 最小化 , 我们将使用对数变换似然函数 的负数。 注意最大化一个函数值等于最小化它的负值。
import pandas as pd
import numpy as np
import scipy.optimize as sciopt
# bounds for parameters to lie between (0,1),
# absolute zero (0) for lower bound avoided as log takes an infinite value
bnds = [(0.001e-12,1) for i in range(12)]
# Initializing parameters value for optimization
init_parameters = np.asarray([0.1 for i in range(12)])
# Negative Log Likelihood Function
neg_log_lik = lambda p: -np.sum([a.values[i]*np.log(p[i]) for i in range(12)])
# Constraint sum(p) = 1
cons = {'type': 'eq', 'fun': lambda p: (sum([p[i] for i in range(12)]) - 1) }
# Minimizing neg_log_lik
results = sciopt.minimize(neg_log_lik, x0 = init_parameters,
method='SLSQP', bounds= bnds, constraints= cons)
results.x # point estimates for p
# array([1.00000000e-15, 2.94179308e-02, 5.88243586e-02, 8.82394605e-02,
# 5.88243586e-02, 2.94059735e-02, 1.76454713e-01, 1.00000000e-15,
# 2.94134577e-02, 2.94135714e-02, 2.05849197e-01, 2.94156978e-01])
参考 scipy.optimize.minimize 有关上述实现的详细信息。
我刚开始学习Python。这是一个数据框:
a=pd.DataFrame({'A1':[0,1,2,3,2,1,6,0,1,1,7,10]})
现在我认为这个数据服从多项分布。因此,12 个数字表示 12 个类别(类别 0、1、2 ...)的频率。例如类别0的出现次数为0。所以,我希望找到给定这个数据的多项式的所有参数。最后,我们拥有多项式的最佳参数(或者我们可以说每个数字的最佳概率)。例如,
category: 0, 1, 2, 3, 4...
weights: 0.001, 0.1, 0.2, 0.12, 0.2...
所以,我不需要测试数据来预测。这不是分类。作为一个新手,我什至不确定我是否应该使用 scipy.stats.multinomial 或 sklearn 模型,或其他一些技术。那么,任何人都可以给我一些帮助吗?
最大似然估计 (MLE) 是获得参数点估计的最重要的程序之一分布。这就是您需要开始的。
解析解:
多国分布是二项分布的扩展,可以通过分析得到MLE .请参阅此 math stack exchange post (MLE for Multinomial Distribution) 以获得完整的解析解。该过程从定义一个似然函数开始,L(p) 以观测数据 x(i) 为条件,其中 p 和 x 是 k 类/ categories[=71= 的概率和观察到的事件] 和 i= 0,1,...k。它是在给定 参数集 (p) 的情况下观察一组 观察结果 (x) 的可能性的度量:
L(p) 等于:
主要思想是在参数 (p) 范围内最大化似然函数值。给定总观测值 n(即所有类别的总和),点估计值 等于:
a.values/a.values.sum() # point estimates for p = x/n
# array([[0. ], [0.02941176], [0.05882353], [0.08823529],
# [0.05882353], [0.02941176], [0.17647059], [0. ],
# [0.02941176], [0.02941176], [0.20588235], [0.29411765]])
数值解:
以上结果也可以用scipy.optimize.minimize
数值求得。请注意 L(p) 是阶乘项和指数项的乘积。阶乘项是常数,不依赖于参数值 (p),因此不考虑优化。对于指数项,最好进行log变换,简化objective函数; MLE 的常见做法,因为 log 是一个 单调递增 函数。此外,由于 scipy.optimize.minimize
用于 最小化 , 我们将使用对数变换似然函数 的负数。 注意最大化一个函数值等于最小化它的负值。
import pandas as pd
import numpy as np
import scipy.optimize as sciopt
# bounds for parameters to lie between (0,1),
# absolute zero (0) for lower bound avoided as log takes an infinite value
bnds = [(0.001e-12,1) for i in range(12)]
# Initializing parameters value for optimization
init_parameters = np.asarray([0.1 for i in range(12)])
# Negative Log Likelihood Function
neg_log_lik = lambda p: -np.sum([a.values[i]*np.log(p[i]) for i in range(12)])
# Constraint sum(p) = 1
cons = {'type': 'eq', 'fun': lambda p: (sum([p[i] for i in range(12)]) - 1) }
# Minimizing neg_log_lik
results = sciopt.minimize(neg_log_lik, x0 = init_parameters,
method='SLSQP', bounds= bnds, constraints= cons)
results.x # point estimates for p
# array([1.00000000e-15, 2.94179308e-02, 5.88243586e-02, 8.82394605e-02,
# 5.88243586e-02, 2.94059735e-02, 1.76454713e-01, 1.00000000e-15,
# 2.94134577e-02, 2.94135714e-02, 2.05849197e-01, 2.94156978e-01])
参考 scipy.optimize.minimize 有关上述实现的详细信息。