代码之家  ›  专栏  ›  技术社区  ›  Feng Chen

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

  •  0
  • Feng Chen  · 技术社区  · 7 年前

    我刚开始学蟒蛇。这是一个数据框架:

    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、多项式或sklearn模型,或者其他一些技术。有人能帮我吗?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Mankind_2000    7 年前

    MLE for Multinomial Distribution

    Likelihood function Multinomial

    Pi equals xi/ 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

    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

    推荐文章