Python中的MATLAB ksdensity等价物

时间:2015-02-17 22:53:39

标签: python matlab numpy scipy

我已经在线查看并且还没有找到答案或方法来计算以下内容

我正在将一些MATLAB代码翻译成Python,在MATLAB中我希望用函数找到内核密度估计:

[p,x] = ksdensity(data)

其中p是分布中x点的概率。

Scipy有一个函数但只返回p。

有没有办法找到x值的概率?

谢谢!

3 个答案:

答案 0 :(得分:6)

ksdensity调用的这种形式会自动生成任意xscipy.stats.gaussian_kde()返回一个可调用的函数,可以使用您选择的任何x进行评估。等效xnp.linspace(data.min(), data.max(), 100)

import numpy as np
from scipy import stats

data = ...
kde = stats.gaussian_kde(data)
x = np.linspace(data.min(), data.max(), 100)
p = kde(x)

答案 1 :(得分:4)

另一个选项是Scikit-Learn Python包中的内核密度估算器,sklearn.neighbors.KernelDensity

这是一个类似于高斯分布的ksdensity的Matlab文档的小例子:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import KernelDensity

np.random.seed(12345)
# similar to MATLAB ksdensity example x = [randn(30,1); 5+randn(30,1)];
Vecvalues=np.concatenate((np.random.normal(0,1,30), np.random.normal(5,1,30)))[:,None]
Vecpoints=np.linspace(-8,12,100)[:,None]
kde = KernelDensity(kernel='gaussian', bandwidth=0.5).fit(Vecvalues)
logkde = kde.score_samples(Vecpoints)
plt.plot(Vecpoints,np.exp(logkde))
plt.show()

这产生的情节如下:

enter image description here

答案 2 :(得分:0)

<块引用>

Matlab 在寻找最佳带宽方面比 KernelDensity 快几个数量级。知道如何使 KernelDenisty 更快吗? – 尤卡 18 年 7 月 16 日,20:58

嗨,尤卡。 matlab使用Scott rule来估计带宽,速度快但需要正态分布的数据。有关详细信息,请参阅此 Post