在以下代码中 s 返回 nan。由于 Q<1 中的每个值,因此当我取其对数时,它会返回负值。这是否意味着我无法使用 P 和 Q 的这些值计算 KL 散度,或者我可以修复它吗?
`P= np.array([1.125,3.314,2.7414])
Q=np.array([0.42369288, 0.89152044, 0.60905852])
for i in range(len(P)):
if P[i] != 0 and Q[i]!=0:
s= P[i] *np.log(P[i]/Q[i])
print("s: ",s)`
Run Code Online (Sandbox Code Playgroud)
首先,P和Q应该描述概率质量函数,这意味着每个元素都应该在区间内[0,1],并且它们的总和应该为1,但您的示例并非如此。
第二个np.log是错误的。你把它放在那里有什么原因或者是拼写错误吗?它应该是P[i]*np.log(P[i]/Q[i])。您还想对 的所有这些项求和i。
最后还有一个技术问题:如果发生了该怎么办P[i] = 0。在那种情况下np.log(0)就会产生问题。该术语的实际贡献应该是0在这种情况下(因为lim_{x->0} x*log(x) = 0)。您可以保证这一点,例如通过使用条款专门处理这种情况if。
的情况Q[i] = 0会导致类似的问题,但是 KL 散度不存在,如果Q[i] = 0,但P[i] = 0无论如何都不存在。
| 归档时间: |
|
| 查看次数: |
4303 次 |
| 最近记录: |