首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何使用python找到已知数据的多项式分布参数?

如何使用python找到已知数据的多项式分布参数?
EN

Stack Overflow用户
提问于 2018-07-10 11:19:23
回答 1查看 1.5K关注 0票数 1

我刚开始学习Python。这是一个数据框:

代码语言:javascript
复制
a=pd.DataFrame({'A1':[0,1,2,3,2,1,6,0,1,1,7,10]})

现在我认为这个数据服从多项分布。因此,12个数字表示12个类别(类别0、1、2...)的出现频率。例如,类别0的出现次数为0。因此,我希望在给定这些数据的情况下找到多项式的所有参数。最后,我们得到了多项式的最佳参数(或者我们可以说每个数字的最佳概率)。例如,

代码语言:javascript
复制
category:    0,      1,     2,     3,      4...
weights:    0.001,  0.1,   0.2,   0.12,   0.2...

因此,我不需要测试数据来预测。这不是一个分类。作为一个新手,我甚至不确定我是否应该使用scipy.stats.multinomial或sklearn模型,或者其他一些技术。所以,有人能帮我一下吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-10 15:47:04

最大似然估计(-MLE-)是获得分布参数点估计的重要步骤之一。这就是你需要开始做的。

分析解决方案:

跨国分布是二项分布的扩展,其最大似然估计可以解析地获得。有关完整的分析解决方案,请参阅此数学堆栈交换帖子(MLE for Multinomial Distribution)。该过程从定义以观测数据x(i)为条件的似然函数L(p)开始,其中p和x是k个类别/类别和i= 0,1,...k的概率和观测到的出现次数。它是在给定参数集(P)的情况下观察一组观察值(x)的可能性的度量:

L(p)等于:

其主要思想是在参数(p)的范围内最大化似然函数值。给定总观测值n(即所有类别的出现次数之和),点估计等于:

代码语言:javascript
复制
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),因此不考虑优化。对于指数项,最好执行对数变换来简化目标函数;对于MLE,通常的做法是对数是单调递增函数。此外,由于scipy.optimize.minimize用于最小化,因此我们将使用对数变换似然函数的负值。注意,最大化一个函数值等于最小化它的负值。

代码语言:javascript
复制
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文档。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51256769

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档