Scikit-learn: 相关向量机 (RVM)

创建于 2013-01-03  ·  68评论  ·  资料来源: scikit-learn/scikit-learn

RVM 是一种贝叶斯框架,用于获取回归和分类任务的稀疏解。 它使用了与 SVM(支持向量机)形式相同的模型。 它解决了SVM的以下缺点:
-- SVM中基函数的数量随着训练集的大小线性增长
在 RVM 中,我们从 0 基开始,逐步更新(添加/删除)基函数集直到收敛。

-- SVM 预测不是概率性的,而 RVM 是概率性的

-- 在 SVM 中需要估计保证金权衡参数“C”,而在 RVM 中则不然

-- SVM 核应该是正定的。 在 RVM 中,我们可以使用任何内核。

它已经在 dlib http://dlib.net/dlib/svm/rvm_abstract.h.html 中实现,这里还有一个 matlab 实现http://www.vectoranomaly.com/downloads/downloads.htm。 这些代码应作为指南。
我认为将它添加到 scikit-learn 是个好主意。

参考 :
1- Tipping, M. E. and A. C. Faul (2003). Fast marginal likelihood maximisation for sparse Bayesian models. In C. M. Bishop and B. J. Frey (Eds.), Proceedings of the Ninth International Workshop on Artificial Intelligence and Statistics, Key West, FL, Jan 3-6.

2- Tipping, M. E. (2001). Sparse Bayesian learning and the relevance vector machine. Journal of Machine Learning Research 1, 211–244.

New Feature

最有用的评论

@amueller和大家! 我们看到了这个线程并决定实现一个与 sklearn 兼容的 RVM 版本(https://github.com/Mind-the-Pineapple/sklearn-rvm)。 我们所做的很多工作都是基于 JamesRitchie 实现的。 如果有人愿意看一看并且欢迎反馈和贡献(@themrzmaster),那就太好了:)
我们有维护这个 repo 的计划,在 0.2 版本上实现快速版本,希望有一天这个代码可以对 scikit-learn 主存储库有所帮助😊🍍

所有68条评论

我必须再次阅读它,但总的来说,我认为 RVM 是一个很好的补充。
dlib 是 boost 许可的,应该是兼容的。 不过,由于 boost-heavy 编码风格,它可能并不那么容易包装。
问题是否使用 SMO 进行了优化? 如果我们实施 SMO 是否明智?

必须抓住我的主教。

ARD 和 RVM 有什么关系? RVM 只是 ARD 的“基函数”版本吗?

顺便说一句,有人因为Generalized Linear Models不包含任何广义模型而感到困扰吗?

好的,所以我们应该使用sequential sparse learning algorithm Bishop p。 352以下我猜?
了解自己;)

我想知道ARD是否有类似的方法? 这会很酷,因为当前的 ARD 实现速度很慢:-/

不,RVM 的实现绝对不使用 SMO。 我认为 SMO 仅用于 SVM 优化。
是的,我们应该使用参考文献 1 第 7 页中的sequential sparse learning algorithm 。(是在主教第 352 页吗?哪个)。 这个算法已经足够“简单”了,我们可以不用 dlib 来编写它。 我正在考虑用python编写它,然后使用cython进行优化。 在这种情况下,我们可以充分利用 matlab 实现。 你怎么认为?
无论如何,应该可以用C++编写。 但是为此我们需要一个很好的 C++ 线性代数库。 我不确定默认情况下 scikit-learn 是否带有一个。

Bishop 是“机器学习和模式识别”。

该算法可能并不完全正确。 如果你想从这个开始,那肯定是一个更大的项目。 如果您有兴趣并想以任何方式实施它,请继续。

实现它与将其引入 scikit-learn 也有很大不同。 这还涉及编写测试、文档和用户指南 - 以及漂亮的代码。

第一次尝试时,您绝对应该只使用 numpy。 它在内部使用 blas,因此速度非常快。
只有在有大量 python 开销的情况下,使用 Cython 加速才有意义。 如果所有时间都花在 BLAS 调用上,那么使用 Cython 没有多大意义。

Cython 和 numpy 都可以。 我不知道主教谈论 RVM。
对于 ARD 和 RVM 的关系。 我对ARD了解不多。 但在参考文献 2 中,作者说 RVM 基于 ARD:“我们将那些与剩余非零权重相关的训练向量称为‘相关性’向量,以尊重自动相关性确定的原则,该原则激发了所提出的方法”第 3 页(213) 第 8 行。
无论如何,ARD 是如何工作的?

ARD 也在 Bishops 的书和用户指南中进行

我意识到参考文献提到:

http://books.nips.cc/papers/files/nips20/NIPS2007_0976.pdf

不是我们使用的实现。 我认为@vmichel实现了
Bishop 方法,而本文的目的是使用类似于
坐标下降法。 这段代码肯定需要一些爱...

谢谢@agramfort ,我想知道这个。 我没有详细说明,但我认为因为论文是唯一的参考...

如果您能在那里添加评论引用主教的章节,我将非常感激,也许说我们应该实施另一篇论文。

(顺便说一句,现在测试套件中最慢的事情是在常见测试中将 ARD 拟合到波士顿数据集上)

谢谢@agramfort ,我想知道这个。 我没有详细说明,但我认为因为论文是唯一的参考...

如果您能在那里添加评论引用主教的章节,我将非常感激,也许说我们应该实施另一篇论文。

见: https :

顺便说一句,任何人都曾因为广义线性部分
模型不包含任何通用模型?

它确实:逻辑回归。

我想知道ARD是否有类似的方法? 那会很酷
当前的 ARD 实施速度很慢:-/

我认为最有前途的ARD快速求解器是实现
策略暴露于:
http://books.nips.cc/papers/files/nips20/NIPS2007_0976.pdf

我提出了一个前一段时间写的代码的要点。

如果有人想在 ARD 上工作,我认为它可能会有用。

https://gist.github.com/4494613

警告:它没有经过太多测试,我不保证正确性,但它
似乎工作。

@amueller
我在http://books.nips.cc/papers/files/nips20/NIPS2007_0976.pdf 中分析了 ARD,我认为 RVM 和 ARD 想要优化相同的目标函数。 不同之处在于用于优化此功能的方法。 在 RVM 中,作者注意到大部分权重将接近于零,他们使用它来推导出“快速”算法。

这听起来很奇怪。 如果目标相同,您应该可以使用相同的方法进行优化,对吗?

是的,你当然应该,但我猜 RVM 的作者使用了不同的优化策略来获得更快和更稀疏的算法。

@yedtoss我很确定还有其他一些区别。 正如我之前所说,这可能是 RVM 在功能空间或内核或其他东西中工作。 否则你可以只替换 ARD 实现吗? 不过,那是回归,您想要分类,对吗?

@agramfort你知道 ARD 和 RVM 的区别吗?

@amueller
最初,RVM 是一种回归技术。 但是作者提出了一种使用它进行分类的方法。 RVM 使用任何类型的内核。
我的意思是 ARD(自动相关性确定新观点的方程 2)和 RVM(稀疏贝叶斯模型的快速边际似然最大化方程 7)的对数似然是相同的。

我想我必须阅读报纸才能知道发生了什么......

对不起,伙计们,我不是一个贝叶斯人……我不太了解
字幕...

RVM 是 Microsoft 的专利

疯狂的。

@larsmans @amueller虽然在美国有 RVM 的专利,但作者在他的网页上推荐了 GPLv2 Matlab 实现,所以我想实现它是可以的...
http://www.miketipping.com/sparsebayes.htm

最好的,
安杰洛斯

@kalxas许可证和专利非常正交,特别是 GPLv2 没有解决软件专利问题。 您对此类实现所拥有的权利是 GPL 授予的权利与专利持有人授予的权利的交集。

也就是说,我同时发现支持向量机是 AT&T 的专利,但该专利显然从未被强制执行。 如果可以证明 RVM 有类似的东西,我可能会改变对它们的看法。

@larsmans我写了一个纯 numpy/python 的 dlib 实现端口(目前非常慢,我会尝试对其进行 cythonize)。 根据标题,dlib 的实现自 2008 年以来一直存在,他们似乎对此很好。 您会考虑改变在 sklearn 中使用 RVM 的想法吗?

让我们听听@GaelVaroquaux 对此的看法。 只要你不能证明它在没有专利许可的情况下被广泛使用,dlib 实现就不会显示任何东西。

是否有关于此主题的更新? 我最近一直在研究 RVM,想知道那里是否有任何代码......

我认为没有人尝试过快速实施,我们仍然不确定其法律地位。

@jlopezpena看一看 dlib,代码很清楚,而且只是标题(模板)。 构建一个 C 扩展以供 numpy 使用应该相当容易

大家好,

我最近将 Mike Tipping 的免费提供的 SparseBayes MATLAB 程序从 MATLAB 翻译成 Python,该程序主要实现了 RVM。 可以在这里找到: https : http :

感谢您的贡献,也感谢您检查专利状态。
但是还有另一个问题,那就是这种算法是否广泛有用。

自从我上次阅读 Bishop 的书以来,我就没有看过算法及其使用。
我认为一个有趣的例子是表明它要么提供更好的不确定性,要么校准
支持向量机,或者它更快(校准支持向量机和搜索 C 需要大量的交叉验证)。

@amueller RVM(主要是 revelance 向量回归 (RVR))在神经影像数据分析中非常有用。 许多论文使用这种方法而不是 SVR 进行预测。 如果能把这个方法加入scikit学习工具箱就完美了。

@amueller我实现了 RVM 的慢速版本,它可以使用 EM 或定点算法来拟合模型(主要用于学习/学术目的),我从几个例子中注意到 RVM 和 SVR 之间的主要区别是稀疏性,即“支持的数量” ' 用于预测的向量。 在许多情况下,RVM 产生的结果与 SVR 相当,支持向量的数量只是 SVR 使用的一小部分
这里是一个简单的例子,也在 Tipping 2001 中使用)

@amueller (添加到之前的评论)显然少量的支持向量将意味着非常快的预测。
RVM 的另一个优点是概率处理。 对于测试集中每个数据点的 RVM,您不仅可以找到点估计,还可以找到预测分布

RVR 也提供概率分布吗?

听起来像 RVR 和 RVM 是包含在内的合理候选者。 不过,我不确定最先进的算法。 是http://www.miketipping.com/papers/met-fastsbl.pdf吗? 那看起来很旧。 SparseBayes 编码风格是....有趣,我认为它更适合作为参考而不是作为 sklearn 实现的基础。

是的,RVR 提供概率分布,但是在某些情况下,对于训练集示例域之外的数据点,预测分布的方差可能较小。
据我所知,您提到的论文是 RVM 的最新版本,它也对应于 Tipping 网站上的 Matlab 实现(版本 2)。

我还在 Kevin Murphy 的书中发现了 RVM 和 SVM 速度的有趣比较:
“RVM 的训练速度也是最快的。尽管事实上 RVM 代码是在 Matlab 中,而 SVM 代码是在 C 中”(第 14 章,第 490 页)。 然而,他们似乎只对小数据集进行了比较。

@amueller RVM(主要是 revelance 向量回归(RVR))在
神经影像数据分析。

我不相信(我做神经影像学)。 我没有看到好的
经验比较。

我认为要走的路是将 RVM 放在一个单独的包中,使用
scikit-learn API,并鼓励良好的实证工作来展示他们的
用处。 如果它们有用,请将它们合并到 scikit-learn 中。

一些神经影像学研究使用了相关向量回归 (RVR) 和
RVR 和 SVR 的比较
列举几个:
http://www.sciencedirect.com/science/article/pii/S1053811910000108
http://www.sciencedirect.com/science/article/pii/S1053811910012644
http://www.sciencedirect.com/science/article/pii/S1053811910003459
http://www.nature.com/npp/journal/v39/n3/abs/npp2013251a.html

并且,RVR 是在模式识别工具箱中实现的
神经影像资料:
http://www.mlnl.cs.ucl.ac.uk/pronto/

希望 RVR 可以纳入 scikit-learn。

最好的祝愿

在旭

2015 年 10 月 15 日星期四下午 12:57,Gael Varoquaux通知@ github.com
写道:

@amueller RVM(主要是 revelance 向量回归(RVR))很漂亮
有用的
神经影像数据分析。

我不相信(我做神经影像学)。 我没有看到好的
经验比较。

我认为要走的路是将 RVM 放在一个单独的包中,使用
scikit-learn API,并鼓励良好的实证工作来展示他们的
用处。 如果它们有用,请将它们合并到 scikit-learn 中。


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/1513#issuecomment -148281784
.

我认为要走的路是将 RVM 放在一个单独的包中,使用 scikit-learn API,并鼓励良好的实证工作来展示它们的用处。 如果它们有用,请将它们合并到 scikit-learn 中。

+1

我的意思是https://github.com/AmazaspShumik/Bayesian-Regression-Methods/blob/master/Relevance%20Vector%20Machine%20%26%20ARD/rvm.py看起来相对兼容。 需要set_paramsget_params或从BaseEstimator继承。

还有可以包装的https://github.com/jhallock7/SparseBayes-Python

@ZaixuCui 既然有现成的实现,为什么要在 scikit-learn 中使用它?

我倾向于同意@GaelVaroquaux@mblondel 。 如果近十年没有人发表关于算法的文章,人们似乎不会很感兴趣。 [哦,标准算法甚至是从 2003 年开始的。 但话说回来,libsvm 是 2005 年]

因为我用scikit学做SVR,elastic-net。
所以,如果有 RVR 实现,当我不需要使用 matlab 时
做机器学习分析。

非常感谢。
祝你一切顺利

在旭

2015 年 10 月 15 日星期四上午 11:13,Andreas Mueller通知@github.com
写道:

我的意思是有
https://github.com/AmazaspShumik/Bayesian-Regression-Methods/blob/master/Relevance%20Vector%20Machine%20%26%20ARD/rvm.py
看起来比较兼容。 需要 set_params 和 get_params 或
继承自 BaseEstimator。

还有https://github.com/jhallock7/SparseBayes-Python可以
被包裹。

@ZaixuCui https://github.com/ZaixuCui你为什么想让它在
scikit-learn 什么时候有现成的实现?

我倾向于同意@GaelVaroquaux https://github.com/GaelVaroquaux
@mblondel https://github.com/mblondel 。 如果没有人发表在
近十年的算法,人们似乎不太感兴趣。


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/1513#issuecomment -148440665
.

因为我用scikit学做SVR,elastic-net。
所以,如果有 RVR 实现,当我不需要使用 matlab 时
做机器学习分析。

您可以使用我们在
讨论。

好,谢谢

2015 年 10 月 19 日星期一上午 8:29,Gael Varoquaux通知@ github.com
写道:

因为我用scikit学做SVR,elastic-net。
所以,如果有 RVR 实现,我就不需要使用 matlab
什么时候
做机器学习分析。

您可以使用我们在
讨论。


直接回复此邮件或在 GitHub 上查看
https://github.com/scikit-learn/scikit-learn/issues/1513#issuecomment -149213151
.

我们不能基于我们新的高斯过程实现将它实现为非常轻量级的类吗? 据我了解,RVR 只是具有特殊内核的 GP 的名称。

虽然这只需要很少的努力,但将 RVR 的实施基于 GP 可能不是最合适的做法? 抄送: @jmetzen

@amueller @GaelVaroquaux @ZaixuCui @yedtoss @jlopezpena

嗨,我用 scikit-learn API 实现了相关向量机的快速版本,
所以如果有人打算使用它,请随意使用。

代码: https :

示例: https :

代码中有四个实现的类:
-回归ARD
-分类ARD
-RVC
-RVR

所以 RegressionARD 和 ClassificationARD 也可能有用

@AmazaspShumik 非常感谢您的实施。 伟大的工作:+1:

@AmazaspShumik

非常感谢您的努力。
我一定会尝试这个包。

祝你一切顺利。

在旭

有没有人在实施@AmazaspShumik predict_proba 方法时遇到问题?

这里有人在 php 上有 RVM 库吗? 我不明白 RVm 可以为我解释吗?

有人有 PHP 的库 RVM 吗?

RVM 是 Microsoft 的专利

专利即将到期

2019-09-04
预计到期

一些指向@AmazaspShumik实现的讨论链接已损坏,只需将它们放在这里供对(和其他一些实现)感兴趣的人使用:

https://github.com/AmazaspShumik/sklearn_bayes - RVM + 其他一些算法实现
https://github.com/JamesRitchie/scikit-rvm - 使用 scipy 的简单实现
https://github.com/siavashserver/neonrvm - 带有 Python 绑定的 C 实现

此外,这里是相关论文集:
http://www.miketipping.com/sparsebayes.htm

微软专利已过期。 我们可以将它添加到 sklearn 吗?

它很容易清除标准要求,所以我不明白为什么不。也许有一些好的/令人信服的例子可能会很有趣。 scikit-rvmsklearn_bayes似乎没有维护,但可能仍然有用。
现在可能最需要一个真正想要投入工作的冠军。

在墨菲的书中,他声称 RVM 的性能与 SVM 非常相似,但具有作为真正概率方法的优势,因此它给出了校准概率作为答案。 这里https://github.com/probml/pmtk3/blob/master/docs/tutorial/html/tutKernelClassif.html他用一个小数据集比较了这些方法

你能提供一个渲染版本的链接吗?
此外,考虑到它可能存在可扩展性问题,它位于一个小数据集上也就不足为奇了。

@amueller http://htmlpreview.github.io/?https : //github.com/probml/pmtk3/blob/master/docs/tutorial/html/tutKernelClassif.html

我将努力实施。 任何帮助将不胜感激。

IIRC 是 RVM 相对于 SVM 的优势之一,是您无需进行优化传递即可找到最佳 C 参数。
我想知道原作者是否愿意贡献他的参考实现。
好吧,它在 Matlab 中,而 Mike Tipping 甚至不在 github 上......

@amueller和大家! 我们看到了这个线程并决定实现一个与 sklearn 兼容的 RVM 版本(https://github.com/Mind-the-Pineapple/sklearn-rvm)。 我们所做的很多工作都是基于 JamesRitchie 实现的。 如果有人愿意看一看并且欢迎反馈和贡献(@themrzmaster),那就太好了:)
我们有维护这个 repo 的计划,在 0.2 版本上实现快速版本,希望有一天这个代码可以对 scikit-learn 主存储库有所帮助😊🍍

@amueller和大家! 我们看到了这个线程并决定实现一个与 sklearn 兼容的 RVM 版本(https://github.com/Mind-the-Pineapple/sklearn-rvm)。 我们所做的很多工作都是基于 JamesRitchie 实现的。 如果有人愿意看一看并且欢迎反馈和贡献(@themrzmaster),那就太好了:)
我们有维护这个 repo 的计划,在 0.2 版本上实现快速版本,希望有一天这个代码可以对 scikit-learn 主存储库有所帮助😊🍍

嗨@PedroFerreiradaCosta
我已经测试了这个 scikit-learn api,它似乎仍然很慢(似乎还没有响应)。 您认为原因可能是它是在 Windows 上实现的吗? 以下是我使用的:
EMRVC(kernel='rbf', gamma='scale', n_iter_posterior=10, max_iter=500, compute_score=True , verbose=True ) 感谢您的回答@themrzmaster @PedroFerreiradaCosta

@mustuner ! 感谢您试用我们的 API!
RVM 确实具有比 SVM (O(M^3)) 更高的计算复杂度,这可能会使其在具有大量基函数的情况下更慢。 无论哪种方式,您都可以采取多种措施来加快该过程。 您可以预先计算内核矩阵并将其提供给我们的算法而不是 X,(设置 kernel='precomputed'),或者您也可以减小 alpha_threshold 的比例(默认设置为 1e5)。 请记住,第二个选项可能会导致模型精度降低。
希望这可以帮助! 并随时打开一个问题让我们进一步帮助。

最好的,
佩德罗

@mustuner ! 感谢您试用我们的 API!
RVM 确实具有比 SVM (O(M^3)) 更高的计算复杂度,这可能会使其在具有大量基函数的情况下更慢。 无论哪种方式,您都可以采取多种措施来加快该过程。 您可以预先计算内核矩阵并将其提供给我们的算法而不是 X,(设置 kernel='precomputed'),或者您也可以减小 alpha_threshold 的比例(默认设置为 1e5)。 请记住,第二个选项可能会导致模型精度降低。
希望这可以帮助! 并随时打开一个问题让我们进一步帮助。

最好的,
佩德罗

谢谢@PedroFerreiradaCosta让我试试

此页面是否有帮助?
0 / 5 - 0 等级