sklearn 中的 2D KDE 带宽与 scipy 中的带宽之间的关系

2024-03-04

我正在尝试比较性能sklearn.neighbors.KernelDensity http://scikit-learn.org/stable/modules/generated/sklearn.neighbors.KernelDensity.html versus scipy.stats.gaussian_kde http://docs.scipy.org/doc/scipy/reference/generated/scipy.stats.gaussian_kde.html对于二维数组。

From 本文 http://jakevdp.github.io/blog/2013/12/01/kernel-density-estimation/我发现每个函数对带宽 (bw) 的处理方式不同。这篇文章给出了设置正确 bw 的方法scipy所以它将等同于中使用的sklearn。基本上,它将 bw 除以样本标准差。结果是这样的:

# For sklearn
bw = 0.15

# For scipy
bw = 0.15/x.std(ddof=1)

where x是我用来获取 KDE 的示例数组。这在 1D 中工作得很好,但我不能让它在 2D 中工作。

这是一个MWE我得到的:

import numpy as np
from scipy import stats
from sklearn.neighbors import KernelDensity

# Generate random data.
n = 1000
m1, m2 = np.random.normal(0.2, 0.2, size=n), np.random.normal(0.2, 0.2, size=n)
# Define limits.
xmin, xmax = min(m1), max(m1)
ymin, ymax = min(m2), max(m2)
# Format data.
x, y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([x.ravel(), y.ravel()])
values = np.vstack([m1, m2])

# Define some point to evaluate the KDEs.
x1, y1 = 0.5, 0.5

# -------------------------------------------------------
# Perform a kernel density estimate on the data using scipy.
kernel = stats.gaussian_kde(values, bw_method=0.15/np.asarray(values).std(ddof=1))
# Get KDE value for the point.
iso1 = kernel((x1,y1))
print 'iso1 = ', iso[0]

# -------------------------------------------------------
# Perform a kernel density estimate on the data using sklearn.
kernel_sk = KernelDensity(kernel='gaussian', bandwidth=0.15).fit(zip(*values))
# Get KDE value for the point.
iso2 = kernel_sk.score_samples([[x1, y1]])
print 'iso2 = ', np.exp(iso2[0])

( iso2呈现为指数,因为sklearn返回日志值)

我得到的结果iso1 and iso2是不同的,我不知道如何影响带宽(在任一功能中)以使它们相等(因为它们应该)。


Add

我被建议在sklearn聊天(由 ep)我应该缩放值(x,y)在计算内核之前scipy为了获得可比较的结果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)

即:在获取内核之前我缩放了两个维度scipy同时将获取内核的行保留在sklearn未受影响。

这给出了更好的结果,但获得的内核仍然存在差异:

红点是哪里(x1,y1)代码中的点。可以看出,密度估计的形状仍然存在差异,尽管差异非常小。也许这是可以实现的最好的结果?


几年后,我尝试了这个,并认为我不需要重新缩放数据就可以使用它。不过,带宽值确实需要进行一些缩放:

# For sklearn
bw = 0.15

# For scipy
bw = 0.15/x.std(ddof=1)

两个 KDE 对同一点的评估并不完全相同。例如,这是对(x1, y1) point:

iso1 =  0.00984751705005  # Scipy
iso2 =  0.00989788224787  # Sklearn

但我想已经足够接近了。

这是 2D 情况的 MWE 和输出,据我所知,它们看起来几乎完全相同:

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

# Generate random data.
n = 1000
m1, m2 = np.random.normal(-3., 3., size=n), np.random.normal(-3., 3., size=n)
# Define limits.
xmin, xmax = min(m1), max(m1)
ymin, ymax = min(m2), max(m2)
ext_range = [xmin, xmax, ymin, ymax]
# Format data.
x, y = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
positions = np.vstack([x.ravel(), y.ravel()])
values = np.vstack([m1, m2])

# Define some point to evaluate the KDEs.
x1, y1 = 0.5, 0.5
# Bandwidth value.
bw = 0.15

# -------------------------------------------------------
# Perform a kernel density estimate on the data using scipy.
# **Bandwidth needs to be scaled to match Sklearn results**
kernel = stats.gaussian_kde(
    values, bw_method=bw/np.asarray(values).std(ddof=1))
# Get KDE value for the point.
iso1 = kernel((x1, y1))
print 'iso1 = ', iso1[0]

# -------------------------------------------------------
# Perform a kernel density estimate on the data using sklearn.
kernel_sk = KernelDensity(kernel='gaussian', bandwidth=bw).fit(zip(*values))
# Get KDE value for the point. Use exponential since sklearn returns the
# log values
iso2 = np.exp(kernel_sk.score_samples([[x1, y1]]))
print 'iso2 = ', iso2[0]


# Plot
fig = plt.figure(figsize=(10, 10))
gs = gridspec.GridSpec(1, 2)

# Scipy
plt.subplot(gs[0])
plt.title("Scipy", x=0.5, y=0.92, fontsize=10)
# Evaluate kernel in grid positions.
k_pos = kernel(positions)
kde = np.reshape(k_pos.T, x.shape)
plt.imshow(np.rot90(kde), cmap=plt.cm.YlOrBr, extent=ext_range)
plt.contour(x, y, kde, 5, colors='k', linewidths=0.6)

# Sklearn
plt.subplot(gs[1])
plt.title("Sklearn", x=0.5, y=0.92, fontsize=10)
# Evaluate kernel in grid positions.
k_pos2 = np.exp(kernel_sk.score_samples(zip(*positions)))
kde2 = np.reshape(k_pos2.T, x.shape)
plt.imshow(np.rot90(kde2), cmap=plt.cm.YlOrBr, extent=ext_range)
plt.contour(x, y, kde2, 5, colors='k', linewidths=0.6)

fig.tight_layout()
plt.savefig('KDEs', dpi=300, bbox_inches='tight')
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sklearn 中的 2D KDE 带宽与 scipy 中的带宽之间的关系 的相关文章

  • 使用 matplotlib 从“列表列表”绘制 3D 曲面

    我已经搜索了一些 虽然我可以找到许多有用的网格网格示例 但没有一个清楚地表明我如何将列表列表中的数据转换为可接受的形式 以适应我所讨论的各种方式 当谈到 numpy matplotlib 以及我所看到的建议的术语和步骤顺序时 我有点迷失 我
  • 如何以“正确”的方式处理带有空字节的 Python unicode 字符串?

    Question PyWin32 似乎很乐意将 null 终止的 unicode 字符串作为返回值 我想以 正确 的方式处理这些字符串 假设我得到一个像这样的字符串 u C Users Guest MyFile asy x00 x00sy
  • 如何检查python xlrd库中的excel文件是否有效

    有什么办法与xlrd库来检查您使用的文件是否是有效的 Excel 文件 我知道还有其他库可以检查文件头 我可以使用文件扩展名检查 但为了多平台性我想知道是否有任何我可以使用的功能xlrd库本身在尝试打开文件时可能会返回类似 false 的内
  • 如何在Python中同时运行两只乌龟?

    我试图让两只乌龟一起移动 而不是一只接着另一只移动 例如 a turtle Turtle b turtle Turtle a forward 100 b forward 100 但这只能让他们一前一后地移动 有没有办法让它们同时移动 有没有
  • Mac OS X 中文件系统的 Unicode 编码在 Python 中不正确?

    在 OS X 和 Python 中处理 Unicode 文件名有点困难 我试图在代码中稍后使用文件名作为正则表达式的输入 但文件名中使用的编码似乎与 sys getfilesystemencoding 告诉我的不同 采取以下代码 usr b
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • 搜索多个字段

    我想我没有正确理解 django haystack 我有一个包含多个字段的数据模型 我希望搜索其中两个字段 class UserProfile models Model user models ForeignKey User unique
  • 如何在 Python 中加密并在 Java 中解密?

    我正在尝试在 Python 程序中加密一些数据并将其保存 然后在 Java 程序中解密该数据 在Python中 我像这样加密它 from Crypto Cipher import AES KEY 1234567890123456789012
  • Keras:如何保存模型或权重?

    如果这个问题看起来很简单 我很抱歉 但是阅读 Keras 保存和恢复帮助页面 https www tensorflow org beta tutorials keras save and restore models https www t
  • 如何使用文本相似性删除 pandas 数据框中相似(不重复)的行?

    我有数千个数据 这些数据可能相似也可能不相似 使用 python 的默认函数 drop duplicates 并没有真正的帮助 因为它们只检测相似的数据 例如 如果我的数据包含类似以下内容怎么办 嗨 早上好 嗨 早上好 Python 不会将
  • Emacs 24.x 上的 IPython 支持

    我对 IPython 与 Emacs 的集成感到困惑 从 Emacs 24 开始 Emacs 附带了自己的python el 该文件是否支持 IPython 还是仅支持 Python 另外 维基百科 http emacswiki org e
  • Tensorflow 与 Keras 的兼容性

    我正在使用 Python 3 6 和 Tensorflow 2 0 并且有一些 Keras 代码 import keras from keras models import Sequential from keras layers impo
  • 如何在 pandas 中使用 read_fwf 跳过空行?

    I use pandas read fwf http pandas pydata org pandas docs stable generated pandas read fwf htmlPython pandas 0 19 2 中的函数读
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 使用“默认”环境变量启动新的子进程

    我正在编写一个构建脚本来解析依赖的共享库 及其共享库等 这些共享库在正常情况下是不存在的PATH环境变量 为了使构建过程正常工作 让编译器找到这些库 PATH已更改为包含这些库的目录 构建过程是这样的 加载器脚本 更改 PATH gt 基于
  • 返回表示每组内最大值的索引的一系列数字位置

    考虑一下这个系列 np random seed 3 1415 s pd Series np random rand 100 pd MultiIndex from product list ABDCE list abcde One Two T
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho

随机推荐

  • 用户窗体工具箱附加控件对话窗口未显示

    在使用 MS Excel 显然还有 Outlook Word 或 Power Point 时 我创建了一个用户表单 工具箱显示控件选项卡和代表各种控件的 16 个图标 当我右键单击工具箱控制区域中的某个空白区域时 会出现一个菜单 其中在顶部
  • 如何存储然后检索父子依赖性数据(Maya MEL/Python 脚本)

    我有一个需要的层次结构 分开 做一点事 按照以前的方式将其重新组装起来 我确实知道如何打破事物 并且对当层次结构扁平时我需要做什么有计划 问题是我如何养育他们 Details 这与我之前的问题有关 冻结带有动画子对象的父对象的缩放变换 MA
  • 在 Android 帐户管理器中存储其他数据

    我想使用安卓AccountManager但是 要同步我的网络服务和应用程序 联系人和日历的标准同步 AccountManager似乎只存储用户名和密码 我的 Web 服务需要三个凭据 用户名 密码和帐户 存储第三条信息的最佳实践是什么 正如
  • JPA - 事务未提交

    我正在开发一个项目 在该项目中我第一次使用 JPA Hibernate 和所有这些东西 但我遇到了事务未提交的问题 我使用类 User 如下所示 package org tomasherman JBTBackup Resource Enti
  • 通过正则表达式限制文本中的行数

    在任何编程语言中 我都知道如何有效地限制给定文件或字符串中的行数 这不是这里的问题 然而在这种情况下 我希望通过正则表达式来做到这一点 在这个模式中我只使用 n 换行符 我不需要其他人 例如 r 回车 n n 0 3 上面的正则表达式解释如
  • 通过 ByteBuffer 和 CQL 3 将 Java 对象序列化到 Cassandra 1.2

    我拼凑了下面的代码 它没有做任何复杂的事情 只是创建一个 byte 变量 将其写入 Cassandra 中的 blob 字段 v1 2 通过新的 Datastax CQL 库 然后将其读回又出来了 当我把它放进去时 它是 3 个元素长 当我
  • @AspectJ 类级别注释建议,以注释作为方法参数

    如何获取注释作为定义的建议的参数传递 类级注释 是否可以 来自帖子here https stackoverflow com questions 2011089 aspectj pointcut for all methods of a cl
  • 如何将 COM 对象包装在本机 .NET 类中?

    我在 NET C 中使用广泛的现有 COM API 可能是 Outlook 但事实并非如此 我通过在 Visual Studio 中添加 COM 引用 来完成此操作 因此所有 魔法 都是在幕后完成的 即 我不必手动运行tlbimp 虽然现在
  • 是否可以在不重新加载页面的情况下检查用户是否在 php 中启用了 cookie?

    例如 即使实际设置了 cookie 下面的代码似乎也不起作用 直到我刷新页面 setcookie cookies 1 time 86400 if isset COOKIE cookies cookies foobar 我试图在我的网站上编写
  • 用户关闭应用程序后,如何恢复上次查看的活动?

    用户关闭应用程序后 我如何恢复上次查看的活动 就像 如果用户打开应用程序 第一个活动将出现 当用户单击按钮时 它将继续到下一个活动 如果他关闭应用程序并再次打开 它仍然会显示上次查看的活动 我该怎么做 请帮我 谢谢你 我认为你应该使用共享首
  • 在 iOS 上使用 PhoneGap/Cordova 和外部 URL

    我希望我的phonegap cordova 应用程序加载外部页面 而不加载任何本地页面 现在我这样做了 但是我的插件 javascript 不起作用 因为它们是从本地index html调用的 在这种情况下我该怎么办 我应该将插件放在外部
  • JPA EntityManager:merge() 正在尝试在数据库中创建新行 - 为什么?

    我通过 Play Framework 使用 JPA 我正在检查 User 对象是否被缓存 如果是 我检索它并 merge 它 以便我可以更新字段并稍后保存更改 user User Cache get user auth sessionAut
  • Intellisense 无法识别 python 3 的类型提示

    我想使用 Visual Studio 并使用类型提示 例如在函数参数列表中 查看智能感知 以确定变量的类型 这可以通过以下方式实现isinstance param type 声明 但我想知道我们是否可以在没有这些附加声明的情况下让它工作 注
  • 阻止 Ninject 自动绑定 Func

    我有一个优先级队列 它采用函数作为构造函数参数 public PriorityQueue ISomeOtherInjectedThing other Func
  • Camel是否为每条路线创建一个线程

    最近我开始使用camel 我发现它有可能满足我的许多集成层需求 我创建了一个 java 客户端应用程序 不在任何容器中运行 其中定义了两条路由 路线 1 将文件从传入文件夹 1 移动到文件夹 2 路线2 将文件内容从folderx移动到mq
  • 如何使用多项 Logit 模型的标准误差获得平均边际效应 (AME)?

    我想要获得具有标准误差的多项 Logit 模型的平均边际效应 AME 为此我尝试了不同的方法 但到目前为止还没有达到目标 最好的尝试 我最好的尝试是使用手动获取 AMEmlogit我在下面展示了这一点 library mlogit ml d
  • 如何在swift 4中的webview中显示大量数据

    在我的一个应用程序中 我必须在 Web 视图中显示来自 Web 服务响应的 html 内容 如果html数据较小 那么它将显示在webview中 但是 当 html 内容非常重时 在 Web 视图应用程序中显示的时间就会很长 我做了一件事只
  • 将 Decodable 与继承一起使用会引发异常

    我正在使用 Rest API 服务 其中响应分为基本响应 所有其他响应都继承自它 我正在尝试使用解码器接口为我的响应模型类构建相同的结构 但是我在继承类的解码方面遇到问题 我试图关注这个问题 在 Swift 4 中使用 Decodable
  • 通过 Android API 配置 Exchange 电子邮件帐户

    我想编写一个应用程序 给定用户名和密码 它将 除其他外 在设备上配置交换电子邮件电子邮件帐户 可以通过Android API 来实现吗 如果是这样 通过什么班级 在 3 0 之前的版本中 有一种通过额外传递用户名和密码来配置交换电子邮件的方
  • sklearn 中的 2D KDE 带宽与 scipy 中的带宽之间的关系

    我正在尝试比较性能sklearn neighbors KernelDensity http scikit learn org stable modules generated sklearn neighbors KernelDensity