动手实践参数估计

参数估计

参数估计(parameter estimation),统计推断的一种。根据从总体中抽取的随机样书.来估计总体分布中未知参数的过程。参数估计是贝叶斯决策中极为重要的一环。

题目

算法说明

  • 使用语言:python

  • 使用库:numpy、math、matplotlib

  • 算法思想:

    • 第一小问:采用极大似然法估计参数$\theta和\sigma$,可以得出结果为
      $$
      \theta=\frac {\sum_{i=1}^{n}ln(x_i)}{n}\
      \sigma = \sqrt{\frac{\sum_{i=1}^{n}(ln(x_i)-\theta)^2}{n}}
      $$
  • 第二小问:和第一小问相同,只是数据分布变成正态分布,同样使用极大似然法求得两个参数,得到:

$$
\theta=\frac {\sum_{i=1}^{n}x_i}{n}\
\sigma = \sqrt{\frac{\sum_{i=1}^{n}(x_i-\theta)^2}{n}}
$$

  • 编程实现:
    • 使用numpy函数库完成数据的输入和格式转换
    • 使用math函数库完成数值计算
    • 使用matplotlib函数库画出相应的概率密度分布曲线

代码

第一小问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import math
import numpy as np
import matplotlib.pyplot as plt

path = './参数估计数据.txt'
# 读入文件,并变成一个列表
def readFile(path):
dataFile = open(path,mode='r')
data = dataFile.readlines()
resData = []
for item in data:
resData.append(float(item))
return resData

# 计算theta值
def calTheta(data):
sum = 0
for num in data:
sum += math.log(num,math.e)
return sum/(len(data))

# 计算sigma值
def calSigma(data,theta):
sum = 0
for num in data:
mid = math.log(num,math.e) - theta
mid *= mid
sum += mid
return math.sqrt(sum/(len(data)))

# 画出图像
def drawP1(sigma,theta):
x = np.linspace(1,500000,50000)
y = np.array([1/(sigma*i*math.sqrt(2*math.pi))*math.exp(-math.pow(math.log(i,math.e)-theta,2)/(2*sigma*sigma)) for i in x])
maxNum = y.max()*1.2
minNum = 0
plt.plot(x,y)
plt.ylim(minNum,maxNum)
plt.show()

# 主函数
if __name__ == '__main__':
data = readFile(path)
npdata = np.array(data)
theta = calTheta(data)
sigma = calSigma(data,theta)
drawP1(sigma,theta)

第二小问

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
import math
import numpy as np
import matplotlib.pyplot as plt

path = './参数估计数据.txt'
# 读入文件,并变成一个列表
def readFile(path):
dataFile = open(path,mode='r')
data = dataFile.readlines()
resData = []
for item in data:
resData.append(float(item))
return resData

# 计算theta值
def calTheta(data):
sum = 0
for num in data:
sum += num
return sum/(len(data))

# 计算sigma值
def calSigma(data,theta):
sum = 0
for num in data:
mid = num - theta
mid *= mid
sum += mid
return math.sqrt(sum/(len(data)))

# 画出图像
def drawP1(sigma,theta):
x = np.linspace(-200000,500000,50000)
y = np.array([1/(sigma*math.sqrt(2*math.pi))*math.exp(-math.pow(i-theta,2)/(2*sigma*sigma)) for i in x])
maxNum = y.max()*1.2
minNum = 0
plt.plot(x,y)
plt.ylim(minNum,maxNum)
plt.show()

# 主函数
if __name__ == '__main__':
data = readFile(path)
npdata = np.array(data)
theta = calTheta(data)
sigma = calSigma(data,theta)
drawP1(sigma,theta)

实验结果

第一小问

$$
\theta = 9.920762057900303 \
\sigma = 0.9941203508359152
$$

1538478282750

第二小问

$$
\theta = 34150.66659000001\
\sigma = 47345.57408229407
$$

1538478381751

实验结果分析

可以看出,由于最开始假设的概率密度函数的不同,即使使用同一份数据训练,也会得到完全不同的结果,也就是说,该实验结果可以表明,参数估计的方法的结果准确性极大地依赖于假设的概率密度分布是否正确


本文结束啦感谢您的阅读
生活不易,求打赏
0%