2015-02-17 294 views
5

我看了网上和还没有找到答案或方法,以图下MATLAB ksdensity相当于在Python

我翻译一些MATLAB代码到Python其中MATLAB即时通讯寻求找到核密度估计具有以下功能:

[p,x] = ksdensity(data) 

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

scipy有一个函数,但只返回p。

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

谢谢!

回答

4

的的那个形式电话自动生成任意xscipy.stats.gaussian_kde()返回可调用的函数,可以用您选择的任何x进行评估。相当于x将是np.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) 
+0

只是一个快速参考,我都尝试'scipy.stats.gaussian_kde()'和'sklearn.neighbors.KernelDensity',第一我'内核dead',第二个作品。 – cqcn1991 2015-09-06 08:31:30

4

另一种选择是在Scikit-学习Python包的内核密度估计,sklearn.neighbors.KernelDensity

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

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