Python绘制概率分布的百分比轮廓线
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python绘制概率分布的百分比轮廓线,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1442字,纯文字阅读大概需要3分钟。
内容图文
![Python绘制概率分布的百分比轮廓线](/upload/InfoBanner/zyjiaocheng/683/0b7e95f0b26c42628c14c7a313761b59.jpg)
给定具有未知函数形式的概率分布(下面的示例),我喜欢绘制“基于百分位数”的轮廓线,即那些对应于积分为10%,20%,…,90%等的区域的轮廓线.
## example of an "arbitrary" probability distribution ##
from matplotlib.mlab import bivariate_normal
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.mgrid[-3:3:100j, -3:3:100j]
z1 = bivariate_normal(X, Y, .5, .5, 0., 0.)
z2 = bivariate_normal(X, Y, .4, .4, .5, .5)
z3 = bivariate_normal(X, Y, .6, .2, -1.5, 0.)
z = z1+z2+z3
plt.imshow(np.reshape(z.T, (100,-1)), origin='lower', extent=[-3,3,-3,3])
plt.show()
我研究了多种方法,包括在matplotlib中使用默认轮廓函数,在scipy中涉及stats.gaussian_kde的方法,甚至可能从分布中生成随机点样本并随后估计内核.他们似乎都没有提供解决方案.
解决方法:
看轮廓p(x)≥t内的p(x)的积分,求出t的期望值:
import matplotlib
from matplotlib.mlab import bivariate_normal
import matplotlib.pyplot as plt
import numpy as np
X, Y = np.mgrid[-3:3:100j, -3:3:100j]
z1 = bivariate_normal(X, Y, .5, .5, 0., 0.)
z2 = bivariate_normal(X, Y, .4, .4, .5, .5)
z3 = bivariate_normal(X, Y, .6, .2, -1.5, 0.)
z = z1 + z2 + z3
z = z / z.sum()
n = 1000
t = np.linspace(0, z.max(), n)
integral = ((z >= t[:, None, None]) * z).sum(axis=(1,2))
from scipy import interpolate
f = interpolate.interp1d(integral, t)
t_contours = f(np.array([0.9, 0.8, 0.7, 0.6, 0.5, 0.4, 0.3, 0.2, 0.1]))
plt.imshow(z.T, origin='lower', extent=[-3,3,-3,3], cmap="gray")
plt.contour(z.T, t_contours, extent=[-3,3,-3,3])
plt.show()
内容总结
以上是互联网集市为您收集整理的Python绘制概率分布的百分比轮廓线全部内容,希望文章能够帮你解决Python绘制概率分布的百分比轮廓线所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。