Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 等高线图二元对数正态密度函数_Python_Matplotlib - Fatal编程技术网

Python 等高线图二元对数正态密度函数

Python 等高线图二元对数正态密度函数,python,matplotlib,Python,Matplotlib,我想用Pyton代码绘制随机变量R~LN(7,0.5)和S~LN(1,0.5)的双变量对数正态PDF等高线图: import numpy as np import matplotlib.pyplot as plt from scipy.stats import lognorm r= np.linspace(1, 10, 500) s= np.linspace(1, 10, 500) R, S = np.meshgrid(r, s) sigma_R = 0.5 mu_R = 7 sigma_

我想用Pyton代码绘制随机变量R~LN(7,0.5)和S~LN(1,0.5)的双变量对数正态PDF等高线图:

import numpy as np
import matplotlib.pyplot as plt
from scipy.stats import lognorm

r= np.linspace(1, 10, 500)
s= np.linspace(1, 10, 500)
R, S = np.meshgrid(r, s)

sigma_R = 0.5
mu_R = 7

sigma_S = 0.5
mu_S = 1

#lognormal PDF
pdf_R = lognorm.pdf(R.flatten(), 1, mu_R, sigma_R)
pdf_S = lognorm.pdf(S.flatten(), 1, mu_S, sigma_S)
JointPDF = pdf_R*pdf_S

fig, ax = plt.subplots()
CS2 = ax.contour(R, S, JointPDF.reshape(500,500), 30, cmap="RdBu_r")
结果是:

Q1:这个图正确吗?我不确定,因为等高线图不应该从1和7开始,这与RVs的平均值相关

问题2:有人知道在R和S相关的情况下该怎么做吗


谢谢

让我们从第一季度开始。不,绘图可能不是您想要的,主要是因为scipy中lognorm的界面有些混乱, 你的符号LN(7,0.5)不清楚。因此,如果你能澄清这一点,这将是有益的。但是为了进步,我假设你想要对数正态分布的均值和σ,比如维基百科的参数mu,σ是mu_R=log(7)和σR=0.5(否则数字的比例就没有意义了)

因此,如果mu,sigma是中定义的两个参数,那么您需要调用
lognorm
,如下所示

pdf_R = lognorm.pdf(R.flatten(), sigma_R, 0, mu_R)
(pdf格式与之类似)

您还需要对您的域小心一点。分布将以(7,1)为中心,在(0,inf)x(0,inf)上定义,宽度为sigma的几倍。如果你想让它对称,我会让域[0,10]x[0,10]:

r= np.linspace(0, 10, 500)
s= np.linspace(0, 10, 500)
Q2是一个完全不同的问题,所以我就不谈了


作为对我问题第2个问题的回答,我发现以下表达式

这是一个二元lognoraml PDF的显式公式。这是一个初学者代码,但它可能会有所帮助

import numpy as np
import matplotlib.pyplot as plt

""" lognormal parameters """
def mu_z(mu, sigma):
    mu_Z = np.log(mu/(np.sqrt(1+(sigma/mu)**2)))
    return mu_Z
def sigma_z(mu, sigma):
    sigma_Z = np.sqrt(np.log(1+(sigma/mu)**2))
    return sigma_Z

r= np.linspace(1, 10, 500)
s= np.linspace(1, 10, 500)
R, S = np.meshgrid(r, s)

sigma_R = 0.5
mu_R = 7
Z_R = np.log(R)
sigma_ZR = sigma_z(mu_R, sigma_R)
mu_ZR = mu_z(mu_R, sigma_R)

sigma_S = 0.5
mu_S = 1
Z_S = np.log(S)
sigma_ZS = sigma_z(mu_S, sigma_S)
mu_ZS = mu_z(mu_S, sigma_S)

rho = 0.5
A = 1/(2 * R.flatten()* S.flatten()*np.pi*np.sqrt(sigma_ZR**2*sigma_ZS**2-rho**2*sigma_ZR**2*sigma_ZS**2))
C = (np.log(R.flatten())-mu_ZR)*(-((rho*(np.log(S.flatten())-mu_ZS)*sigma_ZR*sigma_ZS)/
    (sigma_ZR**2*sigma_ZS**2-rho**2*sigma_ZR**2*sigma_ZS**2))+
    (((np.log(R.flatten())-mu_ZR)*sigma_ZS**2)/
    (sigma_ZR**2*sigma_ZS**2-rho**2*sigma_ZR**2*sigma_ZS**2)))
B = (np.log(S.flatten())-mu_ZS)*((((np.log(S.flatten())-mu_ZS)*sigma_ZR**2)/
    (sigma_ZR**2*sigma_ZS**2-rho**2*sigma_ZR**2*sigma_ZS**2))-
    ((rho*(np.log(R.flatten())-mu_ZR)*sigma_ZS*sigma_ZR)/
    (sigma_ZR**2*sigma_ZS**2-rho**2*sigma_ZR**2*sigma_ZS**2)))
    
pdflnmv = A*np.exp(-(C+B)/2)
fig, ax = plt.subplots()
CS4 = ax.contour(R, S, pdflnmv.reshape(500,500))
当rho=0.5(rho为相关系数)时,结果为

当rho=0.0(不相关RVs)时,我们得到了我的Q1的答案


谢谢你的回答。R是一个参数为mu_R=7和sigma_R=0.5的对数正态RV,所以我应该这样使用scipy:pdf_R=lognorm.pdf(R.flatte(),sigma_R,0,exp(mu_R)),这对我来说似乎是LN(7,0.5)的一种可能解释,唯一的犹豫是exp(7)是一个相当大的数字——比exp(mu)exp(1)大一点(大约大x400)所以你的等高线图看起来真的很奇怪另一种可能的解释是LN变量的期望值是7,标准偏差是0.5(方差是0.5^2=0.25),这将转化为另一组μ,σ(使用维基百科文章我链接的公式)。第二种解释更可能。使用wikipedia的mu和sigma公式和scipy的对数正态分布给出了期望的结果,请注意:pdf_R=lognormal.pdf(R.flatte(),sigma,0,exp(mu))