我试图比较二维数组的sklearn.neighbors.KernelDensity与{a2}的性能。在
从this article我看到在每个函数中带宽(bw)是不同的。本文给出了在scipy
中设置正确bw的方法,因此它将与sklearn
中使用的相同。基本上它用样本标准差除以bw。结果是:
# For sklearn
bw = 0.15
# For scipy
bw = 0.15/x.std(ddof=1)
其中x
是我用来获取KDE的示例数组。这在1D中很好用,但在2D中我做不到
以下是我得到的信息:
^{pr2}$(iso2
以指数形式表示,因为sklearn
返回日志值)
我得到的iso1
和iso2
的结果是不同的,我不知道应该如何影响带宽(在任何一个函数中)使它们相等(它们应该是这样)。在
添加
在sklearn
聊天时(由ep)告诉我,在用scipy
计算内核之前,我应该缩放(x,y)
中的值,以便获得与sklearn
相比较的结果。在
我就是这么做的:
# Scale values.
x_val_sca = np.asarray(values[0])/np.asarray(values).std(axis=1)[0]
y_val_sca = np.asarray(values[1])/np.asarray(values).std(axis=1)[1]
values = [x_val_sca, y_val_sca]
kernel = stats.gaussian_kde(values, bw_method=bw_value)
ie:在使用scipy
获取内核之前,我缩放了这两个维度,而保留了sklearn
中获取内核的行。在
这给出了更好的结果,但得到的核仍然存在差异:
其中红点是代码中的(x1,y1)
点。所以可以看出,尽管密度估计值很小,但在形状上仍然存在差异。也许这是能达到的最好的结果?在
几年后,我尝试了这个方法,并认为我可以在不需要重新缩放数据的情况下使用它。但是带宽值确实需要一些缩放:
两个kde对同一点的求值不完全相等。例如,以下是对
^{2}$(x1, y1)
点的评估:但我想已经够近了。在
以下是二维情况下的MWE和输出,据我所见,几乎完全相同:
相关问题 更多 >
编程相关推荐