Python 实现对数似然比对比曲线及其代码问题分析
主要解决问题:
画出空间统计一个圆柱扫描内部期望为10个病例,全局总数分别为 50、200 和 2000 时,窗口内实际发生例数从 1 到 30 变化时相应的对数似然比曲线。
预期结果:
(1)公式分析:
下面公式为为对数广义似然比(LGLR):
其中,
C
C
是全部空间时间上的病例总数
,
CA C A 是圆柱区内空间时间上的病例总数 CA=∑z,d∈ACzd) C A = ∑ z , d ∈ A C z d ) ,




(2) 针对问题代码实现:
import numpy as np
import matplotlib.pyplot as plt
import math
mu_A = 10 #窗口内期望病例数
C_sum = [50,200,2000] #全局总数
#C_sum = 200 #全局总数
print(C_sum[2])
C_A_sum = np.arange(1,31,1) #窗口内实际发生病例从 1 到 30 变化
C_A_sumArr = [] #定义横坐标变量数组
LGLR_AArr = [] #定义纵坐标变量数组1,c=50
LGLR_AArr1 = [] #定义纵坐标变量数组2,c=200
LGLR_AArr2 = [] #定义纵坐标变量数组3,c=2000
for x in C_A_sum:
C_A_sumArr.append(x)
LGLR_AArr.append(x * math.log(x/mu_A)+(C_sum[0]-x) * math.log((C_sum[0]-x)/(C_sum[0]-mu_A)))
for x in C_A_sum:
C_A_sumArr.append(x)
LGLR_AArr1.append(x * math.log(x/mu_A)+(C_sum[1]-x) * math.log((C_sum[1]-x)/(C_sum[1]-mu_A)))
for x in C_A_sum:
C_A_sumArr.append(x)
LGLR_AArr2.append(x * math.log(x/mu_A)+(C_sum[2]-x) * math.log((C_sum[2]-x)/(C_sum[2]-mu_A)))
#print(LGLR_AArr)
# 输出
plt.plot(C_A_sum, LGLR_AArr, color='green', label='c=50')
plt.plot(C_A_sum, LGLR_AArr1, color='red', label='c=200')
plt.plot(C_A_sum, LGLR_AArr2, color='skyblue', label='c=2000')
plt.xlim([0, 30]) #横轴
plt.ylim([0, 20]) #纵轴
#标题
plt.title('likelihood value')
plt.xlabel('C_A')
plt.ylabel('LGLR')
plt.legend(loc='best')
plt.show() #显示图
则可得到预期效果。
(3)调试过程问题:
1、当用到math.log()函数值,总是出现如下错误:
原因:math.log()不能对矩阵进行直接操作。
TypeError: only length-1 arrays can be converted to Python scalars 分析
2、当用到math包时,有如下错误提醒:
ValueError: math domain error
原因:某些操作不符合数学定义,如对负数取对数,对负数开平方。
分析