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

  [复制链接]
iqiukp 发表于 2018-11-12 08:19:42
写在开头:本帖会持续回帖更新,详情请看置顶2楼

相关向量机 (Relevance Vector Machine, RVM) 在回归预测中的应用。

主要功能有:
(1)基于SB2_Release_200工具箱
(2)输出训练数据和测试数据的预测值
(3)输出相关向量的序号和对应的数值
(4)输出预测值的均值和方差(即分布)

核心函数:
(1)rvm_train
  1. function [model]= rvm_train(X,Y)
  2. % DESCRIPTION
  3. % Prediction based on Relevance Vector Machine (RVM)
  4. % Using SB2_Release_200 toolbox
  5. %
  6. % [model]= rvm_train(X,Y)
  7. %
  8. % INPUT
  9. % X Training samples (N*d)
  10. % N: number of samples
  11. % d: number of features
  12. % Y Target samples (N*1)
  13. %
  14. % OUTPUT
  15. % model RVM model
  16. %
  17. %


  18. % kernei width
  19. sigma = 5.5;


  20. L = size(X,1);
  21. %
  22. BASIS = [ones(L,1),computeKM(X,X,sigma)];
  23. %
  24. % SETTINGS = SB2_ParameterSettings('NoiseStd',0.1);
  25. OPTIONS = SB2_UserOptions('diagnosticLevel','medium','monitor',10, ...
  26. 'diagnosticFile', 'logfile.txt');
  27. [PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
  28. SparseBayes('Gaussian', BASIS, Y, OPTIONS);

  29. model.rv_index = PARAMETER.Relevant;
  30. model.rv_mu = PARAMETER.Value;
  31. model.width = sigma;
  32. model.X = X;
  33. model.beta = HYPERPARAMETER.beta;
  34. model.sigma = DIAGNOSTIC.Sigma;

  35. % mean of prediction (training samples)
  36. model.y_mu = BASIS(:,model.rv_index)*model.rv_mu;

  37. % variance of prediction (training samples)
  38. model.y_var = ones(L,1)*model.beta^-1+ ...
  39. diag(BASIS(:,model.rv_index)* ...
  40. model.sigma*BASIS(:,model.rv_index)');

  41. end
复制代码
(2)rvm_test
  1. function [y_mu,y_var] = rvm_test(model,X)
  2. % DESCRIPTION
  3. % Prediction based on Relevance Vector Machine (RVM)
  4. % Using SB2_Release_200 toolbox
  5. %
  6. % [y_mu,y_var] = rvm_test(model,X)
  7. %
  8. % INPUT
  9. % X Test samples (N*d)
  10. % N: number of samples
  11. % d: number of features
  12. % y_mu Mean of prediction
  13. % y_var Variance of prediction
  14. %
  15. % OUTPUT
  16. % model RVM model
  17. %
  18. %

  19. L = size(X,1);
  20. BASIS = [ones(L,1),computeKM(X,model.X,model.width)];

  21. % mean of prediction (test samples)
  22. y_mu = BASIS(:,model.rv_index)*model.rv_mu;

  23. % variance of prediction (test samples)
  24. y_var = ones(L,1)*model.beta^-1+ ...
  25. diag(BASIS(:,model.rv_index)* ...
  26. model.sigma*BASIS(:,model.rv_index)');

  27. end
复制代码
demo: sinc函数
  1. % demo
  2. clc
  3. clear all
  4. close all
  5. addpath(genpath(pwd))

  6. % sinc funciton
  7. fun = @(x) sin(abs(x))/abs(x);
  8. % training samples
  9. x = linspace(-10,10,100);
  10. y = arrayfun(fun,x);
  11. X = x';
  12. Y = y';
  13. % test samples
  14. xtest = linspace(-10,10,20);
  15. ytest = arrayfun(fun,xtest);
  16. Xtest = xtest';
  17. Ytest = ytest';

  18. % train RVM model
  19. [model]= rvm_train(X,Y);

  20. % test RVM model
  21. [y_mu,y_var] = rvm_test(model,Xtest);

  22. %
  23. ypre = y_mu;

  24. %
  25. figure
  26. plot(X,Y,':o','LineWidth',1.5,'MarkerSize',4)
  27. hold on
  28. plot(X,model.y_mu,':o','LineWidth',1.5,'MarkerSize',4)
  29. plot(X(model.rv_index),Y(model.rv_index),'go', ...
  30. 'LineWidth',1.5,'MarkerSize',8)

  31. legend('training samples','prediction','relevance Vectors')

  32. figure
  33. xs = (1:size(Xtest,1))';
  34. % 3σ
  35. f1 = [y_mu(:,1)+2*sqrt(y_var(:,1)); flip(y_mu(:,1)-2*sqrt(y_var(:,1)),1)];
  36. fill([xs; flip(xs,1)], f1, [7 7 7]/8)
  37. hold on
  38. plot(Ytest,'b:o','LineWidth',1.5,'MarkerSize',4)
  39. plot(y_mu,'r:o','LineWidth',1.5,'MarkerSize',4)

  40. xlabel('Samples')
  41. ylabel('Values')
  42. legend('3σ boundary','test samples','prediction')
复制代码
结果分别为:训练数据的预测结果和测试数据的预测结果
1.png 2.png



附件是源代码。

Relevance Vector Machine.zip (157.6 KB, 下载次数: 351)

353 条回复


iqiukp 发表于 2021-10-16 17:07:48
本帖最后由 iqiukp 于 2021-10-16 17:13 编辑


2021.08.31 更新(V2.1)

源代码链接
1.  MathWorks 的 File Exchange
Relevance Vector Machine (RVM) - File Exchange - MATLAB Central (mathworks.com)

2. GitHub
https://github.com/iqiukp/Relevance-Vector-Machine-RVM

主要特点
  • 二分类学习(RVC)和回归学习(RVR)
  • 支持多种核函数 (linear, gaussian, polynomial, sigmoid, laplacian)
  • 支持混合核函数(K = w1×K1+w2×K2+...+wn×Kn)
  • 支持基于贝叶斯超参数优化、遗传算法和粒子群算法的 RVM 参数优化

注意
  • 仅支持 R2016b 以上的 MATLAB
  • 提供了多个示例文件,每个文件的开头都有对应的介绍
  • 此代码仅供参考

使用说明
01. 二分类学习
数据来源:MATLAB 自带的 fisheriris 数据集
  1. clc
  2. clear all
  3. close all
  4. addpath(genpath(pwd))

  5. % use fisheriris dataset
  6. load fisheriris
  7. inds = ~strcmp(species, 'setosa');
  8. data_ = meas(inds, 3:4);
  9. label_ = species(inds);
  10. cvIndices = crossvalind('HoldOut', length(data_), 0.3);
  11. trainData = data_(cvIndices, :);
  12. trainLabel = label_(cvIndices, :);
  13. testData = data_(~cvIndices, :);
  14. testLabel = label_(~cvIndices, :);

  15. % kernel function
  16. kernel = Kernel('type', 'gaussian', 'gamma', 0.2);

  17. % parameter
  18. parameter = struct( 'display', 'on',...
  19.                     'type', 'RVC',...
  20.                     'kernelFunc', kernel);
  21. rvm = BaseRVM(parameter);

  22. % RVM model training, testing, and visualization
  23. rvm.train(trainData, trainLabel);
  24. results = rvm.test(testData, testLabel);
  25. rvm.draw(results)
复制代码
结果
  1. *** RVM model (classification) train finished ***
  2. running time            = 0.1604 seconds
  3. iterations              = 20
  4. number of samples       = 70
  5. number of RVs           = 2
  6. ratio of RVs            = 2.8571%
  7. accuracy                = 94.2857%


  8. *** RVM model (classification) test finished ***
  9. running time            = 0.0197 seconds
  10. number of samples       = 30
  11. accuracy                = 96.6667%
复制代码
以及对应的混淆矩阵图和预测结果图


02. 回归学习(RVR)
数据来源:sinc 曲线数据
  1. clc
  2. clear all
  3. close all
  4. addpath(genpath(pwd))

  5. % sinc funciton
  6. load sinc_data
  7. trainData = x;
  8. trainLabel = y;
  9. testData = xt;
  10. testLabel = yt;

  11. % kernel function
  12. kernel = Kernel('type', 'gaussian', 'gamma', 0.1);

  13. % parameter
  14. parameter = struct( 'display', 'on',...
  15.                     'type', 'RVR',...
  16.                     'kernelFunc', kernel);
  17. rvm = BaseRVM(parameter);

  18. % RVM model training, testing, and visualization
  19. rvm.train(trainData, trainLabel);
  20. results = rvm.test(testData, testLabel);
  21. rvm.draw(results)
复制代码
结果
  1. *** RVM model (regression) train finished ***
  2. running time            = 0.1757 seconds
  3. iterations              = 76
  4. number of samples       = 100
  5. number of RVs           = 6
  6. ratio of RVs            = 6.0000%
  7. RMSE                    = 0.1260
  8. R2                      = 0.8821
  9. MAE                     = 0.0999


  10. *** RVM model (regression) test finished ***
  11. running time            = 0.0026 seconds
  12. number of samples       = 50
  13. RMSE                    = 0.1424
  14. R2                      = 0.8553
  15. MAE                     = 0.1106
复制代码

03. 核函数的设置
利用 Kernel 类来设置不同类型的核函数
  1. %{
  2.         type   -
  3.         
  4.         linear      :  k(x,y) = x'*y
  5.         polynomial  :  k(x,y) = (γ*x'*y+c)^d
  6.         gaussian    :  k(x,y) = exp(-γ*||x-y||^2)
  7.         sigmoid     :  k(x,y) = tanh(γ*x'*y+c)
  8.         laplacian   :  k(x,y) = exp(-γ*||x-y||)
  9.    
  10.    
  11.         degree -  d
  12.         offset -  c
  13.         gamma  -  γ
  14. %}
  15. kernel = Kernel('type', 'gaussian', 'gamma', value);
  16. kernel = Kernel('type', 'polynomial', 'degree', value);
  17. kernel = Kernel('type', 'linear');
  18. kernel = Kernel('type', 'sigmoid', 'gamma', value);
  19. kernel = Kernel('type', 'laplacian', 'gamma', value);
复制代码
例如,计算 X 和 Y 的高斯核函数矩阵:
  1. X = rand(5, 2);
  2. Y = rand(3, 2);
  3. kernel = Kernel('type', 'gaussian', 'gamma', 2);
  4. kernelMatrix = kernel.computeMatrix(X, Y);
  5. >> kernelMatrix

  6. kernelMatrix =

  7.     0.5684    0.5607    0.4007
  8.     0.4651    0.8383    0.5091
  9.     0.8392    0.7116    0.9834
  10.     0.4731    0.8816    0.8052
  11.     0.5034    0.9807    0.7274
复制代码

04. 混合核函数(K = w1×K1+w2×K2+...+wn×Kn)

以高斯核函数与多项式核函数的混合为例。
  1. clc
  2. clear all
  3. close all
  4. addpath(genpath(pwd))

  5. % sinc funciton
  6. load sinc_data
  7. trainData = x;
  8. trainLabel = y;
  9. testData = xt;
  10. testLabel = yt;

  11. % kernel function
  12. kernel_1 = Kernel('type', 'gaussian', 'gamma', 0.3);
  13. kernel_2 = Kernel('type', 'polynomial', 'degree', 2);
  14. kernelWeight = [0.5, 0.5];
  15. % parameter
  16. parameter = struct( 'display', 'on',...
  17.                     'type', 'RVR',...
  18.                     'kernelFunc', [kernel_1, kernel_2],...
  19.                     'kernelWeight', kernelWeight);
  20. rvm = BaseRVM(parameter);

  21. % RVM model training, testing, and visualization
  22. rvm.train(trainData, trainLabel);
  23. results = rvm.test(testData, testLabel);
  24. rvm.draw(results)
复制代码

05. 单核RVM的参数优化

以贝叶斯超参优化为例,优化高斯核函数的参数。
  1. clc
  2. clear all
  3. close all
  4. addpath(genpath(pwd))

  5. % use fisheriris dataset
  6. load fisheriris
  7. inds = ~strcmp(species, 'setosa');
  8. data_ = meas(inds, 3:4);
  9. label_ = species(inds);
  10. cvIndices = crossvalind('HoldOut', length(data_), 0.3);
  11. trainData = data_(cvIndices, :);
  12. trainLabel = label_(cvIndices, :);
  13. testData = data_(~cvIndices, :);
  14. testLabel = label_(~cvIndices, :);

  15. % kernel function
  16. kernel = Kernel('type', 'gaussian', 'gamma', 5);

  17. % parameter optimization
  18. opt.method = 'bayes'; % bayes, ga, pso
  19. opt.display = 'on';
  20. opt.iteration = 20;

  21. % parameter
  22. parameter = struct( 'display', 'on',...
  23.                     'type', 'RVC',...
  24.                     'kernelFunc', kernel,...
  25.                     'optimization', opt);
  26. rvm = BaseRVM(parameter);

  27. % RVM model training, testing, and visualization
  28. rvm.train(trainData, trainLabel);
  29. results = rvm.test(trainData, trainLabel);
  30. rvm.draw(results)
复制代码
优化结果
  1. *** RVM model (classification) train finished ***
  2. running time            = 13.3356 seconds
  3. iterations              = 88
  4. number of samples       = 70
  5. number of RVs           = 4
  6. ratio of RVs            = 5.7143%
  7. accuracy                = 97.1429%
  8. Optimized parameter  table

  9.     gaussian_gamma
  10.     ______________

  11.         7.8261   

  12. *** RVM model (classification) test finished ***
  13. running time            = 0.0195 seconds
  14. number of samples       = 70
  15. accuracy                = 97.1429%
复制代码


06. 混合核 RVM的参数优化
优化对象为:多个核函数自身的参数,以及对应的权重,数据来源于某 UCI 数据集。
  1. clc
  2. clear all
  3. close all
  4. addpath(genpath(pwd))

  5. % data
  6. load UCI_data
  7. trainData = x;
  8. trainLabel = y;
  9. testData = xt;
  10. testLabel = yt;

  11. % kernel function
  12. kernel_1 = Kernel('type', 'gaussian', 'gamma', 0.5);
  13. kernel_2 = Kernel('type', 'polynomial', 'degree', 2);

  14. % parameter optimization
  15. opt.method = 'bayes'; % bayes, ga, pso
  16. opt.display = 'on';
  17. opt.iteration = 30;

  18. % parameter
  19. parameter = struct( 'display', 'on',...
  20.                     'type', 'RVR',...
  21.                     'kernelFunc', [kernel_1, kernel_2],...
  22.                     'optimization', opt);
  23. rvm = BaseRVM(parameter);

  24. % RVM model training, testing, and visualization
  25. rvm.train(trainData, trainLabel);
  26. results = rvm.test(testData, testLabel);
  27. rvm.draw(results)
复制代码
结果
  1. *** RVM model (regression) train finished ***
  2. running time            = 24.4042 seconds
  3. iterations              = 377
  4. number of samples       = 264
  5. number of RVs           = 22
  6. ratio of RVs            = 8.3333%
  7. RMSE                    = 0.4864
  8. R2                      = 0.7719
  9. MAE                     = 0.3736
  10. Optimized parameter  1×6 table

  11.     gaussian_gamma    polynomial_gamma    polynomial_offset    polynomial_degree    gaussian_weight    polynomial_weight
  12.     ______________    ________________    _________________    _________________    _______________    _________________

  13.         22.315             13.595               44.83                  6               0.042058             0.95794     




  14. *** RVM model (regression) test finished ***
  15. running time            = 0.0008 seconds
  16. number of samples       = 112
  17. RMSE                    = 0.7400
  18. R2                      = 0.6668
  19. MAE                     = 0.4867
复制代码


07. 交叉验证
支持 K 折交叉验证和留出法交叉验证。
比如,5 折交叉验证:
  1. parameter = struct( 'display', 'on',...
  2.                             'type', 'RVC',...
  3.                             'kernelFunc', kernel,...
  4.                             'KFold', 5);
复制代码
比如,验证集比例为0.3的留出法交叉验证:
  1. parameter = struct( 'display', 'on',...
  2.                             'type', 'RVC',...
  3.                            'kernelFunc', kernel,...
  4.                            'HoldOut', 0.3);
复制代码

08. 其它设置

  1. %% custom optimization option
  2. %{      
  3.     opt.method = 'bayes'; % bayes, ga, pso
  4.     opt.display = 'on';
  5.     opt.iteration = 20;
  6.     opt.point = 10;

  7.     % gaussian kernel function
  8.     opt.gaussian.parameterName = {'gamma'};
  9.     opt.gaussian.parameterType = {'real'};
  10.     opt.gaussian.lowerBound = 2^-6;
  11.     opt.gaussian.upperBound = 2^6;

  12.     % laplacian kernel function
  13.     opt.laplacian.parameterName = {'gamma'};
  14.     opt.laplacian.parameterType = {'real'};
  15.     opt.laplacian.lowerBound = 2^-6;
  16.     opt.laplacian.upperBound = 2^6;

  17.     % polynomial kernel function
  18.     opt.polynomial.parameterName = {'gamma'; 'offset'; 'degree'};
  19.     opt.polynomial.parameterType = {'real'; 'real'; 'integer'};
  20.     opt.polynomial.lowerBound = [2^-6; 2^-6; 1];
  21.     opt.polynomial.upperBound = [2^6; 2^6; 7];

  22.     % sigmoid kernel function
  23.     opt.sigmoid.parameterName = {'gamma'; 'offset'};
  24.     opt.sigmoid.parameterType = {'real'; 'real'};
  25.     opt.sigmoid.lowerBound = [2^-6; 2^-6];
  26.     opt.sigmoid.upperBound = [2^6; 2^6];
  27. %}

  28. %% RVM model parameter
  29. %{
  30.     'display'    :   'on', 'off'
  31.     'type'       :   'RVR', 'RVC'
  32.     'kernelFunc' :   kernel function
  33.     'KFolds'     :   cross validation, for example, 5
  34.     'HoldOut'    :   cross validation, for example, 0.3
  35.     'freeBasis'  :   'on', 'off'
  36.     'maxIter'    :   max iteration, for example, 1000
  37. %}
复制代码






luoxiao5566 发表于 2019-1-16 18:35:44
楼主,为什么我用你的程序可以拟合数据,但是不能预测?

xiaodong2019 发表于 2019-2-28 16:42:08
非常感谢博主的分享,但是有个疑问麻烦帮忙解答:
我把sinc函数改为sin函数后,发现无法实现非线性拟合,拟合曲线偏差严重,另外相关向量曲线报错,这是什么原因?
希望能加博主的微信,可以发到我邮箱281188347@qq.com,谢谢!

sin(x)函数无法拟合

sin(x)函数无法拟合

iqiukp 发表于 2019-2-28 17:57:22
本帖最后由 iqiukp 于 2019-2-28 18:00 编辑
xiaodong2019 发表于 2019-2-28 16:42
非常感谢博主的分享,但是有个疑问麻烦帮忙解答:
我把sinc函数改为sin函数后,发现无法实现非线性拟合,拟 ...

报错的原因:
1. 训练集中的相关向量数据点标记范围超过了样本个数,导致第一幅图的第三条曲线报错(即相关向量数据点),这个问题笔者以后再修复。
2. 可以直接绕过figure1,直接看figure2的拟合效果(测试集)

拟合性能差的原因:相关向量机的重要参数为核宽度,即rvm_train.m中的sigma:
  1. % kernei width
  2. sigma = 5.5;  
复制代码

提高拟合性能需要调整该参数,笔者试了试,在sigma等于3以下的时候,训练集和测试集的拟合效果为:
1.jpg 2.jpg


可以看出几乎完全重合了。





xiaodong2019 发表于 2019-2-28 23:30:23
iqiukp 发表于 2019-2-28 17:57
报错的原因:
1. 训练集中的相关向量数据点标记范围超过了样本个数,导致第一幅图的第三条曲线报错(即相 ...

非常感谢博主的解答,修改核宽度后,sin(x)拟合曲线确实与函数曲线一致。
    但是本人将训练函数替换为具体x,y数据后(如图1),在给定令一组x’数据后利用训练模型预测y'时得到的拟合曲线与训练曲线差别较大(如图2),且改变核宽度仍无效果,请问问题出在哪里?进一步,如果我的训练输入数据不止x一组,但只有一个y输出,请问如何开展训练和预测?
    如何可以的话,希望能加上博主的扣扣或微信,本人扣扣(281188347),谢谢!


12.JPG
11.JPG

iqiukp 发表于 2019-3-4 20:29:51
xiaodong2019 发表于 2019-2-28 23:30
非常感谢博主的解答,修改核宽度后,sin(x)拟合曲线确实与函数曲线一致。
    但是本人将训练函数替换为 ...

1. 你把新的训练数据通过代码的方式贴上来,我这边试试。

2. 你的意思是多个自变量,一个因变量?这种情况的处理方法也是一样的,只要保证数据的行方向是样本,列方向是特征(属性)就行。部分情况可能还得先预处理数据。

xiaodong2019 发表于 2019-3-5 10:21:02
iqiukp 发表于 2019-3-4 20:29
1. 你把新的训练数据通过代码的方式贴上来,我这边试试。

2. 你的意思是多个自变量,一个因变量?这种情 ...

多谢博主解答,该问题原因已经找到,是输入数据未归一化,而且核宽度仍然需要小于3以下。现在存在两个 疑惑:
一是整个训练模型是不是只有核宽度一个参数需要适时调整大小,还有没有其他需要参数,如何影响拟合结果;二是该语句(plot(X(model.rv_index),Y(model.rv_index),'go',  'LineWidth',1.5,'MarkerSize',8))除了博主给出的sinc函数外一直报错(“索引超出矩阵维度”),例如换成sin函数,该语句是用来画出相关性好的训练数据的曲线么?为什么只有几个点?能否帮忙给出解决方案,谢谢!

iqiukp 发表于 2019-3-5 11:33:49
本帖最后由 iqiukp 于 2019-3-5 11:35 编辑
xiaodong2019 发表于 2019-3-5 10:21
多谢博主解答,该问题原因已经找到,是输入数据未归一化,而且核宽度仍然需要小于3以下。现在存在两个 疑 ...

1. 在SB2_Release_200工具箱里面还有一个(迭代次数)可以设置。
rvm_train.m文件里面可以看到有个UserOptions, 工具箱默认是10000次(可以看工具箱的SB2_UserOptions.m文件)
  1. % SETTINGS = SB2_ParameterSettings('NoiseStd',0.1);
  2. OPTIONS = SB2_UserOptions('diagnosticLevel','medium','monitor',10, ...
  3.     'diagnosticFile', 'logfile.txt');
  4. [PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
  5.     SparseBayes('Gaussian', BASIS, Y, OPTIONS);
复制代码
可以尝试把上面的OPTIONS 改为:
  1. OPTIONS = SB2_UserOptions('Iterations',10000, 'diagnosticLevel','medium', 'monitor',10, ...
  2.     'diagnosticFile', 'logfile.txt');
复制代码
10000是迭代次数,可以根据你的需求改成其他数字,不过RVM的默认精度已经够高了,再修改这个参数意义不是很大,重点还是核宽度那个参数。

除此之外,最基本的RVM算法应该就没有可调的参数了。你可以关注一下近年来针对RVM原理层面的改进算法,或许有可以参考的地方。

2. 你可以先看看 ‘model’ 这个变量的意思。
  1. % SETTINGS = SB2_ParameterSettings('NoiseStd',0.1);
  2. OPTIONS = SB2_UserOptions('diagnosticLevel','medium','monitor',10, ...
  3.     'diagnosticFile', 'logfile.txt');
  4. [PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
  5.     SparseBayes('Gaussian', BASIS, Y, OPTIONS);

  6. % Locate = find(PARAMETER.Relevant == L+1);
  7. % PARAMETER.Relevant(Locate)=[];
  8. % PARAMETER.Value(Locate)=[];

  9. model.rv_index = PARAMETER.Relevant;
  10. model.rv_mu = PARAMETER.Value;
  11. model.width = sigma;
  12. model.X = X;
  13. model.beta = HYPERPARAMETER.beta;
  14. model.sigma = DIAGNOSTIC.Sigma;
复制代码
可以看到,model是一个结构体,整合了RVM模型的一些参数。其中 model.rv_index 是训练集里面相关向量的下标(实际上也是训练集里面的样本)。
  1. plot(X(model.rv_index),Y(model.rv_index),'go','LineWidth',1.5,'MarkerSize',8)
复制代码
实际上该语句的功能就是想把训练集中那些属于“相关向量”的样本给标记出来,因此只有少数几个点,稀疏性好。另外,报错的那个原因已经找到,但目前暂时没有找到解决的方法。

hayixiao 发表于 2019-3-8 14:43:12
请教楼主:
如果用DE来优化楼主的RVM算法,只能优化核参数sigma吗?一般的论文文献中优化的是至少两个参数:α、σ。如果要优化楼主的算法,适应度函数如何构造?

iqiukp 发表于 2019-5-11 15:32:42
本帖最后由 iqiukp 于 2019-5-11 22:31 编辑

2019.5.11 更新

Relevance Vector Machine (RVM).zip (1.24 MB, 下载次数: 173)

iqiukp 发表于 2019-5-12 17:26:27
hayixiao 发表于 2019-3-8 14:43
请教楼主:
如果用DE来优化楼主的RVM算法,只能优化核参数sigma吗?一般的论文文献中优化的是至少两个参数 ...

不好意思,现在才回复你的问题。
RVM的回归是把权重W的估计转化为α、σ超参数的估计,一般论文里面用的是第二类最大似然估计方法来估计超参数的最优值。程序里面的sigma调整严格来说不算参数优化范畴,只是修改了基函数矩阵的数值。

1. 要是优化核参数sigma的话,适应度函数的输入是sigma,输出是一般是反映预测精度的指标,如RMSE和R2这些,这个是通用的,无论你用哪种优化算法。

2. 要是从RVM自身的超参数优化出发的话,这方面的文献不多,顶多是优化了超参数估计的迭代过程,笔者的研究领域没怎么涉及到这方面的内容,你可以多查阅相关的文献。

鱼鱼_jFfBF 发表于 2019-5-15 16:26:49

楼主,我做的是多输入单输出的相关向量机预测模型,可以加QQ请教程序该怎么改吗,幺幺幺肆零叁柒幺肆贰,谢谢~

iqiukp 发表于 2019-5-15 16:43:28
鱼鱼_jFfBF 发表于 2019-5-15 16:26
楼主,我做的是多输入单输出的相关向量机预测模型,可以加QQ请教程序该怎么改吗,幺幺幺肆零叁柒幺肆贰, ...

把训练数据X(M*N),Y(M*1)设定为:
1. M为样本个数,N为变量个数(即输入个数)。
2. 根据你的数据类型,可能需要归一化处理(mapminamx)或者标准化处理(zscore)。


qsmmmmmm 发表于 2019-5-16 11:05:02
楼主我想请教一下,关于实际值 ytest 和预测值 y_mu 之间的残差有没有定量描述的指标?也就是评价预测精度的指标?万分感谢

龙宝百 发表于 2019-5-16 11:06:06
如果做多输入多输出,是个否可以呢,请教

qsmmmmmm 发表于 2019-5-16 11:46:50
iqiukp 发表于 2019-5-15 16:43
把训练数据X(M*N),Y(M*1)设定为:
1. M为样本个数,N为变量个数(即输入个数)。
2. 根据你的数据类型, ...

我按照这个,训练时输入X(44,4),Y(44,1),并归一化,得到model,
在预测时输入Xtest(44,1),Ytest(44,1)
运行时报错:

错误使用  *
用于矩阵乘法的维度不正确。请检查并确保第一个矩阵中的列数与第二个矩阵中的行数匹配。要执行按元素相乘,请使用 '.*'。
出错 computeKM (line 13)
K = exp((bsxfun(@minus,bsxfun(@minus,2*x*y',sx),sy'))/sigma^2);
出错 rvm_test (line 24)
BASIS = computeKM(X,model.X,model.width);
出错 prediction (line 24)
[y_mu,y_var] = rvm_test(model,Xtest);%得到预测值y_mu

qsmmmmmm 发表于 2019-5-16 11:59:07
qsmmmmmm 发表于 2019-5-16 11:46
我按照这个,训练时输入X(44,4),Y(44,1),并归一化,得到model,
在预测时输入Xtest(44,1),Yt ...

初步判断是model参数里面的model.X是用来训练的X,应该是预测时和训练时用的是同一个核函数,造成前后输入维度不同。。

iqiukp 发表于 2019-5-16 12:11:18
本帖最后由 iqiukp 于 2019-5-16 12:30 编辑
龙宝百 发表于 2019-5-16 11:06
如果做多输入多输出,是个否可以呢,请教

如果不考虑多个输出之间的相关性,可以用笔者提供的RVM程序单独预测每个输出;如果考虑多个输出之间的相关性,可以参考这篇多输入多输出的文章:

Ha Y, Zhang H. Fast multi-output relevance vector regression[J]. Economic Modelling, 2019.

Ha_Zhang_2019_Fast multi-output relevance vector regression.pdf (1.35 MB, 下载次数: 124)

iqiukp 发表于 2019-5-16 12:13:10
qsmmmmmm 发表于 2019-5-16 11:46
我按照这个,训练时输入X(44,4),Y(44,1),并归一化,得到model,
在预测时输入Xtest(44,1),Yt ...

Xtest的维度错误。测试样本的个数没有限制,但是特征维度要和Xtrain一致。

iqiukp 发表于 2019-5-16 12:14:17
本帖最后由 iqiukp 于 2019-5-16 16:43 编辑
qsmmmmmm 发表于 2019-5-16 11:59
初步判断是model参数里面的model.X是用来训练的X,应该是预测时和训练时用的是同一个核函数,造成前后输 ...

嗯嗯,是这个问题。

iqiukp 发表于 2019-5-16 12:19:00
qsmmmmmm 发表于 2019-5-16 11:05
楼主我想请教一下,关于实际值 ytest 和预测值 y_mu 之间的残差有没有定量描述的指标?也就是评价预测精度 ...

定量描述的指标目前常用的有3个:

1. RMSE:  均方根误差,其值越小越好。
2.  CD:    决定系数 coefficient of determination (即相关系数的平方),其值越大越好。
3.  MAE:   平均绝对误差 mean absolute error,其值越小越好。

关于这几个指标的计算公式和使用区别网上相关资料很多,这里就不赘述了。

qsmmmmmm 发表于 2019-5-16 14:03:47
iqiukp 发表于 2019-5-16 12:19
定量描述的指标目前常用的有3个:

1. RMSE:  均方根误差,其值越小越好。

我在一篇文章里看到用贝叶斯因子来衡量, 1.png 代表训练过后对残差进行的变换(高斯变换),其中用到了残差的均值与标准差,
2.png 代表用模型预测时对残差的高斯变换,
最后再做如下计算, 3.png ,B的大小来衡量ytest偏离ytrain的程度,进而识别数据与训练时用的基准数据的偏差,在您看来这种方法有没有指导意义?

iqiukp 发表于 2019-5-16 16:37:42
qsmmmmmm 发表于 2019-5-16 14:03
我在一篇文章里看到用贝叶斯因子来衡量,代表训练过后对残差进行的变换(高斯变换),其中用到了残差的均 ...

如果你的研究重点不是这个评价方法,完全可以使用别人提出的新评价方法,通过结合多个评价指标,包括传统的指标,如RMSE这些,以及类似贝叶斯因子这种比较新颖的评价指标,都是从侧面验证你的实验结果好坏。

如果你的研究重点是回归预测的评价,既然这个贝叶斯因子方法是已经公开发表的,肯定有指导意义,因为RVM本身的模型输出就是均值和方差。进而再思考一下,这个贝叶斯因子提出的依据和原因是啥?为什么B的偏差就能衡量预测效果?以及这个贝叶斯因子的应用对象是不是也有一定的数据要求?

qsmmmmmm 发表于 2019-5-17 10:07:53
iqiukp 发表于 2019-5-16 16:37
如果你的研究重点不是这个评价方法,完全可以使用别人提出的新评价方法,通过结合多个评价指标,包括传统 ...

好的,感谢!

qsmmmmmm 发表于 2019-5-19 10:15:35
您好,我看资料说的实际值与预测值之间的残差服从高斯分布,请问一下这个在程序里面体现了吗?
程序里面有没有算出残差呢?还是需要自己用ytest-y_mu得到残差?
您需要登录后才可以回帖 登录 | 注册

本版积分规则

相关帖子
相关文章
热门教程
站长推荐
快速回复 返回顶部 返回列表