极大似然法python例子

已知一组数符合二项式分布,其中为9,请采用最大似然估计方法估计该分布的另一个参数 。

  • 最大似然估计方法的思路是:
    1. 要估计 p p p,我们可以先写出在所有样本已知条件下的似然函数, P ( x 1 , x 2 , ⋯   , x m ∣ p ) = ∏ i = 1 m P ( x i ∣ p ) P(x_1,x_2,\cdots,x_m|p) = \prod_{i=1}^m P(x_i|p) P(x1,x2,,xmp)=i=1mP(xip)
    2. 然后最大化似然函数,也就是对 p p p求导,让导数等于0。可以得到 p = X n m p = \frac{X}{nm} p=nmX, 其中: X = ∑ i = 1 m x i X = \sum_{i=1}^m x_i X=i=1mxi
# 这个函数是用来算 概率里面组合C,例如 func_C(5,3) = 10 
def func_C(m,n):
    a=b=result=1
    if m<n:
        print("n不能小于m 且均为整数")
    elif ((type(m)!=int)or(type(n)!=int)):
        print("n不能小于m 且均为整数")
    else:
        minNI=min(n,m-n)#使运算最简便
        for j in range(0,minNI):
        #使用变量a,b 让所用的分母相乘后除以所有的分子
            a=a*(m-j)
            b=b*(minNI-j)
            result=a//b #在此使用“/”和“//”均可,因为a除以b为整数
        return result
# 该函数是用来计算二项式分布的概率的
def func_P(x,p):
    return func_C(9,x)*pow(p,x)*pow(1-p,9-x)
import numpy as np
import sympy

# 极大似然估计原理见  https://www.bilibili.com/video/BV1pp4y1y7oz?from=search&seid=16645904141198351600

# 极大似然估计目的:已知数据,已知分布,求该分布中的参数,题目中是二项式分布
# 假设题目中做了10次实验,即m=10, 做这10次实验中,会产生10次实验结果,即10个大P的值,把这10个大P的值连乘起来,得到的函数似然函数,
# 对这个似然函数求导即可得到p值

# n= 9是实验次数
# 小p = 0.5 假设是硬币正面朝上概率
# output 每次试验发生正面朝上的硬币个数
# 表示投9个硬币,每个硬币正面朝上概率0.5, size=10表示做了10次实验,那么output就是每次实验发生后正面朝上硬币的个数
# 结果示例:[5 6 6 4 5 2 3 4 4 7]
output = np.random.binomial(9, 0.5, size =10)
print(output)

# 假设硬币正面朝上次数x
# 现在求似然函数为大P,前面小p是硬币正面朝上的概率

p = sympy.symbols("p")   # 这里是把p当作一个未知参数,网上搜一下python求导  https://blog.csdn.net/sudakuang/article/details/80593145


P_list = []   # 设置一个空列表

# 做了10次实验,每次实验x是硬币正面朝上的次数,这样就把每次实验的概率放到一个列表里面
for x in output:
    P = func_P(int(x), p)
    P_list.append(P)
    
# 把10次实验的概率相乘,可以得到最终的似然函数
P_siran = 1
for y in P_list:
    P_siran = P_siran * y

# 这时,P_siran是一个p的函数,对这个函数求导数
daoshu = diff(P_siran, p)
print(daoshu)
# 得到的导数例子:-142302450636607242240*p**35*(1 - p)**34 + 142302450636607242240*p**34*(1 - p)**35

# 把导数= 0,求此时的p值,那么此时的概率是极大似然概率
a = sympy.solve([daoshu-0],[p])
print(a)

# [(0,), (1/2,), (1,)]    多次计算会发现 a值趋近0.5

你可能感兴趣的:(机器学习,算法,机器学习)