[我分享] 相关向量机 (Relevance Vector Machine, RVM)

  [复制链接]
iqiukp 发表于 2019-5-19 14:01:35
qsmmmmmm 发表于 2019-5-19 10:15
您好,我看资料说的实际值与预测值之间的残差服从高斯分布,请问一下这个在程序里面体现了吗?
程序里面有 ...

相关向量机是假设每个输出点服从均值为ymu,方差为yvar的高斯分布,即y~N(ymu, yvar)。

qsmmmmmm 发表于 2019-5-19 14:04:14
iqiukp 发表于 2019-5-19 14:01
相关向量机是假设每个输出点服从均值为ymu,方差为yvar的高斯分布,即y~N(ymu, yvar)。 ...

原来输出的是预测数据的均值与方差?那怎么得到预测的数据值?

iqiukp 发表于 2019-5-19 17:51:04
qsmmmmmm 发表于 2019-5-19 14:04
原来输出的是预测数据的均值与方差?那怎么得到预测的数据值?

一般而言,预测值取的是期望,即均值(ymu)。

方方土oba 发表于 2019-5-22 11:40:57
好东西,应该收藏

Jacksonic 发表于 2019-5-24 01:09:42
请教下楼主有没有较好的优化核宽度的方法,我看SVM有用交叉验证进行确定核宽度,RVM有没有类似的方法?十分感谢!!!

iqiukp 发表于 2019-5-24 13:03:36
本帖最后由 iqiukp 于 2019-5-24 13:06 编辑
Jacksonic 发表于 2019-5-24 01:09
请教下楼主有没有较好的优化核宽度的方法,我看SVM有用交叉验证进行确定核宽度,RVM有没有类似的方法?十分 ...

优化方法都大同小异,有类似于交叉验证这种传统的优化算法,有类似于PSO这种群智能优化算法,但都很难保证找到全局最优。
可以多关注关注近几年的优化算法,比如

布谷鸟搜索算法(2009)
烟花优化算法(2010)
蝙蝠算法(2010)
果蝇优化算法(2012)
灰狼优化算法(2014)
鲸鱼优化算法(2016)
天牛须搜索算法(2017)


等等......

Jacksonic 发表于 2019-5-24 15:50:20
iqiukp 发表于 2019-5-24 13:03
优化方法都大同小异,有类似于交叉验证这种传统的优化算法,有类似于PSO这种群智能优化算法,但都很难保证 ...

非常感谢!!!

龙宝百 发表于 2019-5-31 11:43:03
iqiukp 发表于 2019-5-16 12:11
如果不考虑多个输出之间的相关性,可以用笔者提供的RVM程序单独预测每个输出;如果考虑多个输出之间的相关 ...

您好,谢谢您的解答,但是我仍有疑问,论文里面是单个输入对应多个输出,但是我需要多个输入对应多个输出,这样可行吗

iqiukp 发表于 2019-5-31 12:52:34
龙宝百 发表于 2019-5-31 11:43
您好,谢谢您的解答,但是我仍有疑问,论文里面是单个输入对应多个输出,但是我需要多个输入对应多个输出 ...

可以的。

龙宝百 发表于 2019-5-31 13:10:56

您好,有些打扰您了,抱歉。我看见代码里面是一个x,对应两个变量y,我自己现在做的是关于输入和输出变量分别是5和9的回归预测,我在想怎么做,如果输入不止一个是不是也不能plot出图呢,因为毕竟坐标轴就两个变量

iqiukp 发表于 2019-5-31 13:28:31
本帖最后由 iqiukp 于 2019-5-31 13:30 编辑
龙宝百 发表于 2019-5-31 13:10
您好,有些打扰您了,抱歉。我看见代码里面是一个x,对应两个变量y,我自己现在做的是关于输入和输出变量 ...

plot只是为了方便可视化。MRVM建立的是输入X(N*d1)和输出Y(N*d2)的数学关系,其中d1,d2>=1为变量个数。我没仔细看这篇文献,看了一下作者提供的源代码,
  1. tic
  2. if isFast
  3.     [used, ~, Mu, invSigma, OmegaHat] = fmrvr(Phi,T,maxIts,tolerance);
  4. else
  5.     [used, ~, Mu, invSigma, OmegaHat] = mrvr(Phi,T,maxIts,tolerance);
  6. end
  7. toc
复制代码


其中 fmrvr的函数输入为Phi (添加了常数bias的基函数矩阵(N*(N+1)),T(添加了噪声的多变量输出数据),maxIts(最大的迭代次数)以及tolerance(迭代精度)。其中与输入数据相关的是参数是Phi,由于Phi的矩阵维度大小与输入变量的个数无关,只和输入样本的个数有关。只要获取了[used, ~, Mu, invSigma, OmegaHat]这几个参数的结果,就可以同时预测多变量数据了。
你可以尝试把数据替换为你的多输入多输出数据,把源码中相应的地方改过来,然后要是报错了就根据提示去排除错误吧。原理上应该没问题的。

龙宝百 发表于 2019-5-31 13:35:02
iqiukp 发表于 2019-5-31 13:28
plot只是为了方便可视化。MRVM建立的是输入X(N*d1)和输出Y(N*d2)的数学关系,其中d1,d2>=1为变量个数。我 ...

好的,我尽量试试,谢谢。

Hamlet'ssmile 发表于 2019-6-5 11:24:23
楼主你好,修改后的代码不支持多维输入怎么破?

iqiukp 发表于 2019-6-5 15:11:35
Hamlet'ssmile 发表于 2019-6-5 11:24
楼主你好,修改后的代码不支持多维输入怎么破?

你好。更新后的代码已经测试过多输入变量情况下的预测问题。你把报错代码贴上来看看,注意输入数据的格式,行方向是样本个数,列方向是特征维度。

Hamlet'ssmile 发表于 2019-6-5 16:40:39
iqiukp 发表于 2019-6-5 15:11
你好。更新后的代码已经测试过多输入变量情况下的预测问题。你把报错代码贴上来看看,注意输入数据的格式 ...

1.png

训练输入为18*3,输出为18*1,均未归一化。在rvm_train.m中 ,在[PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
    SparseBayes('Gaussian', BASIS, Y,OPTIONS);后,PARAMTER中的矩阵是空的,所以后面会报错。请问这是什么原因啊?

iqiukp 发表于 2019-6-5 17:42:19
Hamlet'ssmile 发表于 2019-6-5 16:40
训练输入为18*3,输出为18*1,均未归一化。在rvm_train.m中 ,在 = ...
    SparseBayes('Gaussian', B ...


出现该问题的原因是sigma的取值问题。因为sigma的取值越大,相关向量的个数越少,当SparseBayes.m在迭代结束后仍然没有找到满足条件的相关向量,会导致返回结果都是空集合。
目前你可以尝试将sigma的取值减小。

这个问题会在后面的版本中给出解决方案。

Jacksonic 发表于 2019-6-10 21:09:46
请问下楼主,根据RVM的预测结果可以计算预测集的协方差矩阵吗?

iqiukp 发表于 2019-6-12 14:15:36
Jacksonic 发表于 2019-6-10 21:09
请问下楼主,根据RVM的预测结果可以计算预测集的协方差矩阵吗?

你好。预测集实际上是一个单维度的向量,而协方差矩阵计算的是样本数据不同维度(特征、属性等等)之间的协方差,所以RVM的预测结果应该没法计算协方差矩阵,因为其预测值只有一个维度。

920071025 发表于 2019-6-12 20:39:54
感谢博主分享
小白请教一下 这个怎么用多项式核 来训练和预测数据
比如一组数据 800*15的数据 用前400训练 后400预测分类

iqiukp 发表于 2019-6-12 21:15:26
920071025 发表于 2019-6-12 20:39
感谢博主分享
小白请教一下 这个怎么用多项式核 来训练和预测数据
比如一组数据 800*15的数据 用前400训练  ...

1. 多项式核。只需更改computeKM.m函数:
  1. function [K] = computeKM(x,y,c,d)
  2. K = (x*y'+c).^d;
复制代码
同时在demo.m和rvm_train.m对应的地方修改过来就行。

2. 训练和预测。

修改demo.m中的
  1. % Train RVM model
  2. model = rvm_train(Xtrain,Ytrain,'sigma',5.5,'bias',1);

  3. % Test RVM model
  4. [y_mu,y_var] = rvm_test(model,Xtest);
复制代码
Xtrain改为你的训练数据(前400个,400*15),Ytrain为对应的输出(400*1);Xtest为你的测试数据(后400个,400*15)。

多变量数据(包括训练数据和测试数据)应该要做预处理,可以用自带的zscore函数或者mapminmax函数,这两个函数的用法网上资料很多,这里就不赘述了。




920071025 发表于 2019-6-12 21:56:59
iqiukp 发表于 2019-6-12 21:15
1. 多项式核。只需更改computeKM.m函数:同时在demo.m和rvm_train.m对应的地方修改过来就行。

2. 训练和 ...

非常感谢老师,请问老师有没有qq或者什么,我想加您,还有问题请教,万分感谢

wx_azhfe1jq 发表于 2019-6-13 15:54:59
您好,我确定Xtrain的维度是N×M Ytrain的维度是N×1 在训练的时候还是报了维度的错误。这个该如何解决,感谢。
QQ图片20190613165420.png

iqiukp 发表于 2019-6-13 16:07:39
wx_azhfe1jq 发表于 2019-6-13 15:54
您好,我确定Xtrain的维度是N×M Ytrain的维度是N×1 在训练的时候还是报了维度的错误。这个该如何解决,感 ...

出现该问题的原因在41楼的回帖中说明了。暂时的解决方法可以把sigma的取值变小一点。

wx_azhfe1jq 发表于 2019-6-13 16:26:13
iqiukp 发表于 2019-6-13 16:07
出现该问题的原因在41楼的回帖中说明了。暂时的解决方法可以把sigma的取值变小一点。 ...

好的,的确如此。谢谢

iqiukp 发表于 2019-7-5 22:04:51
本帖最后由 iqiukp 于 2019-7-5 22:08 编辑

2019.7.5 更新 (V1.2)

RVM_V1.2.zip (1.25 MB, 下载次数: 147)
您需要登录后才可以回帖 登录 | 注册

本版积分规则

热门教程
站长推荐
快速回复 返回顶部 返回列表