python-3.x - 为什么KL散度给了nan?是一些数学错误还是我的输入数据不正确?
问题描述
在以下代码中,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)`
解决方案
首先,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
无论如何都不存在。
推荐阅读
- rust - 为什么我的扩展特性没有被 Cursor 识别?
- wordpress - Woocommerce 正常价格未更新
- apache - .htaccess 重写到文件名存在但扩展名省略的 uri
- windows - 如何通过批处理删除文本文件的重复部分?
- ubuntu - 为什么 rsync 与跳转主机和 sshpass 不起作用
- c# - 有什么方法可以使用 EF Core 在多台服务器上更新相同的 [database].[table]?
- regex - 在 Vim 中 submatch 命令是如何工作的?
- reactjs - 无法通过浏览器地址行导航以使用路由反应组件
- puppeteer - 如何使用 puppeteer 选择单选按钮
- c# - 统一的相机旋转轴