c++ - 如何从核密度估计中获得函数?
问题描述
我尝试过实现 KDE,但我对数学有点卡住了。
我将对我当前执行 KDE 的方式进行一些伪解码,以便更好地向您展示我的问题。
(我复制了维基百科的例子:https ://en.wikipedia.org/wiki/Kernel_density_estimation )
定义 KDE 的间隔以及使用了多少点([-6, 11],我在 -6.0 和 11.0 之间使用了 1000 个“点”])
遍历所有点,并通过添加来自给定数据点的内核来给每个点一个概率。现在 -6 到 11 之间的每个点都有被选中的概率。
确保所有点的概率加起来为 100%,并根据点的概率抽取样本。
这很有效,如果我绘制它会给出正确的结果,但我不禁觉得这是一种非常倒退的做事方式。
不必计算区间中每个点的概率,而只需从 KDE 中获取一个公式,我给出随机数并根据概率获取样本,这将是一件好事。有谁知道这是怎么做到的吗?
顺便说一句,我使用 c++ 并希望继续这样做。
解决方案
如果您知道您的样本遵循某种分布并且您知道参数和 PDF 方程,那么您可以借助方程绘制它们,但如果没有给出分布,您将无法创建公式,或者至少应该避免. 示例:如果给定样本遵循高斯分布,则可以找到均值和方差并将它们代入高斯方程,然后绘制 PDF。
KDE 用于查找有限数据样本的概率密度函数 (PDF) ,您无法获得可直接用于绘制 PDF 的样本的公式/方程。KDE 背后的整个想法是为 PDF(平滑曲线)而不是方程提供通用估计器。
您在上面提到了 KDE 的工作原理,并在 wiki 中给出了示例:- 1. 计算每个点的概率(频率)。2. 为每个点绘制高斯核,以相同的点作为均值和一些带宽(参数)。3. 对所有这些内核求和以获得最终结果。
你不能有方程的主要原因是因为未知参数 - KDE 中的带宽。当您改变带宽时,曲线将随着样本的变化而不断变化,并且方程不能以某些多项式方程形式编写。
推荐阅读
- nginx - 上传超过一定大小的文件时出错:“从上游读取响应标头时“空间不足”
- java - 当 Web 应用程序关闭时,Jena 离开 mem.FourTupleMap 和 mem.FourTupleMap.ThreeTupleMap
- android - 使用 NDK 的 clang 在 Mac 上为 Android 交叉编译 C++ 程序失败
- fabric8 - 获取 CertificateRequest 时无法反序列化类型的值
- excel - 如何使用 Excel 根据颜色计算叶子?
- angular - ng update 命令在一台机器上抛出 404,而在另一台机器上进行角度升级
- python - 自动保存在 VS 代码中的 Python 中的注释和函数头之间添加两个空行
- javascript - 为什么我在使用 Bash 脚本导出变量后得到“未定义”
- oracle - 函数的返回值选择什么类型
- python-3.x - 如何在 NLTK 上使用“意见词典”?