Python 多元正态分布概率密度函数的三维绘制

Python 多元正态分布概率密度函数的三维绘制,python,numpy,matplotlib,scipy,Python,Numpy,Matplotlib,Scipy,我从这里改编了这段代码: 使用我的数据 我的数据 hour Cost 20 58.00 20 336.00 20 34.50 20 106.50 20 118.00 ... 11 198.36 11 276.00 11 40.00 11 308.00 11 140.00 11 72.00 11 116.50 11 290.00 11 266.00 11 66.00 11 100.00 11 79.00 11 106.00 11 160.00 我的代码

我从这里改编了这段代码: 使用我的数据

我的数据

hour    Cost
20  58.00
20  336.00
20  34.50
20  106.50
20  118.00
...
11  198.36
11  276.00
11  40.00
11  308.00
11  140.00
11  72.00
11  116.50
11  290.00
11  266.00
11  66.00
11  100.00
11  79.00
11  106.00
11  160.00
我的代码:

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm
from mpl_toolkits.mplot3d import Axes3D

from scipy.stats import multivariate_normal


dataset=df[['hour','Cost']]

X = dataset.hour.values
Y = dataset.Cost.values

X, Y = np.meshgrid(X, Y)
N = len(X)

def estimateGaussian(dataset):
    mu = np.mean(dataset, axis=0)
    sigma = np.cov(dataset.T)
    return mu, sigma


mu, Sigma = estimateGaussian(dataset)

pos = np.empty(X.shape + (2,))
pos[:, :, 0] = X
pos[:, :, 1] = Y

F = multivariate_normal(pos, mu, Sigma)
Z = F.pdf(pos)

fig = plt.figure(figsize=(20,10))
ax = fig.gca(projection='3d')
ax.plot_surface(X, Y, Z, rstride=3, cstride=3, linewidth=1, antialiased=True,
                cmap=cm.viridis)

cset = ax.contourf(X, Y, Z, zdir='z', offset=-0.15, cmap=cm.viridis)

# Adjust the limits, ticks and view angle
ax.set_zlim(-0.15,0.2)
ax.set_zticks(np.linspace(0,0.2,5))
ax.view_init(27, 90)

plt.show()

假设时间和成本为任意随机向量

  • 如何修复此错误
  • 我如何知道数据中任何一对(小时、成本)的概率并将其可视化
对不起,我不是以英语为母语的人

因此,我的问题停留了一段时间没有得到回答,我采纳了@ImportanceOfBeingErnest建议来简化示例并使其可验证示例:

time=[1,2,3,4,5,6]
cost=[4,5,3,4,8,9]
var_matrix=np.array([time,cost]).T
mean = np.mean(var_matrix,axis=0)
sigma = np.cov(var_matrix.T)
y = multivariate_normal.pdf(var_matrix, mean=mean, cov=sigma,allow_singular=True)
这是一个简单的例子:

time=[1,2,3,4,5,6]
cost=[4,5,3,4,8,9]
var_matrix=np.array([time,cost]).T
mean = np.mean(var_matrix,axis=0)
sigma = np.cov(var_matrix.T)
y = multivariate_normal.pdf(var_matrix, mean=mean, cov=sigma,allow_singular=True)
  • 如何绘制3d图形显示(成本、时间)和成对的概率密度值

提前感谢。

您可以直接应用中给出的示例


请在您的问题中显示一个,即一个可运行的代码。查看您的数据,这里使用
np.meshgrid
是不合理的。错误本身来自于对
多元_normal
的错误输入,有关如何使用它,请参阅。@ImportanceOfBeingErnest感谢您的回复,我编辑了我的问题,并添加了不带np.meshgrid函数的简单示例来讨论它。
import matplotlib.pyplot as plt
import numpy as np
from scipy.stats import multivariate_normal

time=[1,2,3,4,5,6]
cost=[4,5,3,4,8,9]

var_matrix=np.array([time,cost]).T
mean = np.mean(var_matrix,axis=0)
sigma = np.cov(var_matrix.T)
dist = multivariate_normal(mean, cov=sigma)

x, y = np.mgrid[1:6.02:.05, 3:9.02:.05]
pos = np.empty(x.shape + (2,))
pos[:, :, 0] = x; pos[:, :, 1] = y

z = dist.pdf(pos)

plt.contourf(x,y,z)
plt.show()