我已经在线查看并且还没有找到答案或方法来计算以下内容
我正在将一些MATLAB代码翻译成Python,在MATLAB中我希望用函数找到内核密度估计:
[p,x] = ksdensity(data)
其中p是分布中x点的概率。
Scipy有一个函数但只返回p。
有没有办法找到x值的概率?
谢谢!
答案 0 :(得分:6)
ksdensity
调用的这种形式会自动生成任意x
。 scipy.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)
答案 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()
这产生的情节如下:
答案 2 :(得分:0)
Matlab 在寻找最佳带宽方面比 KernelDensity 快几个数量级。知道如何使 KernelDenisty 更快吗? – 尤卡 18 年 7 月 16 日,20:58
嗨,尤卡。 matlab使用Scott rule来估计带宽,速度快但需要正态分布的数据。有关详细信息,请参阅此 Post。