2015-02-17 104 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