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

  [复制链接]
iqiukp 发表于 2020-3-18 23:28:00
本帖最后由 iqiukp 于 2020-3-30 11:57 编辑

2020.3.18 更新  (V1.3)

源代码
rvm-v1.3.zip (1.07 MB, 下载次数: 132)

iqiukp 发表于 2020-3-18 23:50:30
石小超同学 发表于 2020-3-18 12:00
请问楼主是这样改吗?为什么显示有错误?谢谢您

不是。computeKM函数是计算高斯核函数的,你这两个函数完全一样了呀。你要先定义好你的核函数计算函数,然后再组合。我更新了代码,添加了多种和函数的支持,你可以试试。

石小超同学 发表于 2020-3-23 16:26:13
iqiukp 发表于 2020-3-18 23:50
不是。computeKM函数是计算高斯核函数的,你这两个函数完全一样了呀。你要先定义好你的核函数计算函数, ...

哦哦哦对,才看到,太感谢楼主了

18019095291 发表于 2020-3-29 14:51:36
楼主你好 我看了新下载的这个多种核函数版本 作为小白 有两个问题想请教~~
1.如果我想用双曲正切核函数替换高斯核函数 除了把主程序14行的kernel = Kernel('type', 'gauss', 'width', 2);
替换为
kernel = Kernel('type', 'sigm', 'gamma', 0.01, 'offset', 0);之外

rvm.train文件里 28行这里应该怎么改呢
    kernel = Kernel('type', 'gauss', 'width', sqrt(size(x, 2)));
    option = struct('freeBasis', 'off',...
                    'display', 'on');

主要我没太懂sqrt(size(x, 2))放在这里是怎么用的~~

是不是只需要改这两处呢 我刚接触matlab不是很懂

2.如果弄一个混合核函数 比如多项式+双曲正切核函数 应该怎么建立呢?
麻烦楼主了


iqiukp 发表于 2020-3-29 15:25:04
本帖最后由 iqiukp 于 2020-3-29 15:29 编辑
18019095291 发表于 2020-3-29 14:51
楼主你好 我看了新下载的这个多种核函数版本 作为小白 有两个问题想请教~~
1.如果我想用双曲正切核函数替换 ...

你好。

1. 关于更改核函数

更改核函数,只需要在主程序的Kernel对象更改就行了,其他地方不用动。
至于rvm_train函数的那里的28行,即:

  1. % default parameter setting
  2.     kernel = Kernel('type', 'gauss', 'width', sqrt(size(x, 2)));
  3.     option = struct('freeBasis', 'off',...
  4.                     'display', 'on');
复制代码

这是个默认参数,不用管。意思是你如果在主程序那里不输入核函数和设置,就调用这里的默认参数,即使用高斯核函数、不使用偏置项、展示训练结果。
至于 sqrt(size(x, 2)) ,这是一个高斯核宽度的经验选取方法,是输入样本的特征个数的开方。

2. 关于混合核函数

这个接口我还没做,打算下个版本更新的时候加入这个功能。要是想在V1.3版本使用混合核函数,需要同时在rvm_trainrvm_test修改。

比如多项式+双曲正切核函数:

只需把rvm_train函数计算核函数矩阵 (K) 那里改成:
  1. % compute the kernel matrix
  2.    
  3.     % 创建一个多项式核函数对象
  4.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  5.     % 计算多项式核函数矩阵
  6.     K_poly = kernel_poly.getKernelMatrix(x, x);
  7.    
  8.     % 创建一个双曲正切核函数对象
  9.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  10.     % 计算双曲正切核函数矩阵
  11.     K_sigmoid = kernel_sigmoid.getKernelMatrix(x, x);
  12.    
  13.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  14.     K = K_poly+K_sigmoid;
复制代码

同样地,在rvm_test函数把计算核函数改为:
  1. % compute the kernel matrix
  2.    
  3.     % 创建一个多项式核函数对象
  4.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  5.     % 计算多项式核函数矩阵
  6.     K_poly = kernel_poly.getKernelMatrix(xt, model.rv);
  7.    
  8.     % 创建一个双曲正切核函数对象
  9.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  10.     % 计算双曲正切核函数矩阵
  11.     K_sigmoid = kernel_sigmoid.getKernelMatrix(xt, model.rv);
  12.    
  13.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  14.     K = K_poly+K_sigmoid;
复制代码


注意
1.  由于没做混合核函数的接口,改动核函数参数的时候要保证rvm_train和rvm_test函数中核函数的参数一致。
2.  不同核函数矩阵的值域不一致,要想获取较好的预测结果,可能需要对不同核函数矩阵进行预处理。
3. 上述代码只是一个示范,笔者并没运行代码,具体结果以实际运行结果为准。如报错请贴上报错信息。




18019095291 发表于 2020-3-29 15:50:00
iqiukp 发表于 2020-3-29 15:25
你好。

1. 关于更改核函数

哇楼主竟然这么快就回复我了 好感动~~
话说第一个问题弄明白了呢 非常感谢~~
第二个我试了下有报错

错误: 文件:rvm_train.m 行:56 列:3
运算符的使用无效。

出错 demo_RVM (line 21)
model = rvm_train(x, y, 'kernel', kernel, 'option', option);

运算符的问题 一直提示我把括号里的那几个逗号改成分号,我改完之后依然报错~~
顺便期待一下 下一个有混合核函数的版本~~

iqiukp 发表于 2020-3-29 16:00:10
本帖最后由 iqiukp 于 2020-3-29 16:02 编辑
18019095291 发表于 2020-3-29 15:50
哇楼主竟然这么快就回复我了 好感动~~
话说第一个问题弄明白了呢 非常感谢~~
第二个我试了下有报错

把rvm_train的中第28行:
  1. K = kernel.getKernelMatrix(x, x);
复制代码


替换为:
  1.     % 创建一个多项式核函数对象
  2.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  3.     % 计算多项式核函数矩阵
  4.     K_poly = kernel_poly.getKernelMatrix(x, x);
  5.    
  6.     % 创建一个双曲正切核函数对象
  7.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  8.     % 计算双曲正切核函数矩阵
  9.     K_sigmoid = kernel_sigmoid.getKernelMatrix(x, x);
  10.    
  11.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  12.     K = K_poly+K_sigmoid;
复制代码


把rvm_test的中第31行:
  1.     K = model.kernel.getKernelMatrix(xt, model.rv);
复制代码


替换为:

  1.     % 创建一个多项式核函数对象
  2.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  3.     % 计算多项式核函数矩阵
  4.     K_poly = kernel_poly.getKernelMatrix(xt, model.rv);
  5.    
  6.     % 创建一个双曲正切核函数对象
  7.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  8.     % 计算双曲正切核函数矩阵
  9.     K_sigmoid = kernel_sigmoid.getKernelMatrix(xt, model.rv);
  10.    
  11.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  12.     K = K_poly+K_sigmoid;
复制代码


如果还是报错
1. 请把报错的那行代码以及报错的信息贴上来,比如
错误:文件:rvm_train.m 行:56 列:3
运算符的使用无效。
那就把rvm.train函数的第56行代码贴上来。

2. 请以“添加代码文字”的形式把你修改后的rvm_train和rvm_test代码贴一下。




18019095291 发表于 2020-3-29 16:21:37
本帖最后由 18019095291 于 2020-3-29 16:26 编辑

按照楼主这个代码替换之后rvm.test又提示字符数无效,但是rvm.train的没这个问题(哭哭,他俩难道不是一样的嘛)
我就把复制到rvm.train的那些代码复制到了rvm.test,依然报错
出错 rvm_test (line 36)
    K_poly = kernel_poly.getKernelMatrix(x, x);

出错 demo_RVM (line 24)
result = rvm_test(model,xt, yt);
  1. function model = rvm_train(x, y, varargin)
  2.     %{

  3.         DESCRIPTION

  4.         Prediction based on Relevance Vector Machine (RVM)
  5.         Using SB2_Release_200 toolbox
  6.         -------------------------------------------------------------

  7.               model = rvm_train(X,Y,varargin)

  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.         OUTPUT
  14.           model        RVM model

  15.         Created on 18th March 2020, by Kepeng Qiu.
  16.         -------------------------------------------------------------%

  17.     %}
  18. % compute the kernel matrix
  19.     tic
  20.     % default parameter setting
  21.     kernel = Kernel('type', 'gauss', 'width', sqrt(size(x, 2)));
  22.     option = struct('freeBasis', 'off',...
  23.                     'display', 'on');
  24.     %
  25.     if rem(nargin, 2)
  26.         error('Parameters of rvm_train should be pairs')
  27.     end
  28.     numParameters = nargin/2-1;

  29.     for n =1:numParameters
  30.         parameters = varargin{(n-1)*2+1};
  31.         value        = varargin{(n-1)*2+2};
  32.         switch parameters
  33.                 %
  34.             case 'kernel'
  35.                 kernel = value;
  36.                 %
  37.             case 'option'
  38.                 option = value;
  39.         end
  40.     end

  41.     %
  42.     numSamples = size(x, 1);

  43.     % compute the kernel matrix
  44. %     K = kernel.getKernelMatrix(x, x);
  45.     % 创建一个多项式核函数对象
  46.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  47.     % 计算多项式核函数矩阵
  48.     K_poly = kernel_poly.getKernelMatrix(x, x);
  49.    
  50.     % 创建一个双曲正切核函数对象
  51.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  52.     % 计算双曲正切核函数矩阵
  53.     K_sigmoid = kernel_sigmoid.getKernelMatrix(x, x);
  54.    
  55.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  56.     K = K_poly+K_sigmoid;

  57.     % construct the basis vectors
  58.     if ~strcmp(option.freeBasis, 'on')
  59.         % no bias
  60.         BASIS = K;
  61.         [PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
  62.         SparseBayes('Gaussian', BASIS, y);
  63.     else
  64.         % add bias
  65.         indexBias = numSamples+1;  % index of bias
  66.         BASIS = [K, ones(numSamples, 1)];
  67.         [PARAMETER, HYPERPARAMETER, DIAGNOSTIC] = ...
  68.         SparseBayes('Gaussian', BASIS, y, SB2_UserOptions('freeBasis', indexBias));
  69.     end
  70.     timeCost = toc;
  71.    
  72.     % RVM model
  73.     model = struct();
  74.     model.index = PARAMETER.Relevant;  % index of BASIS
  75.     model.relevant = model.index; % index of relevance vectors
  76.     if strcmp(option.freeBasis, 'on')
  77.         model.bias = PARAMETER.Value(end); % value of bias
  78.         model.relevant(model.relevant == numSamples+1) = [];
  79.         if isempty(model.relevant)
  80.             warning('No relevant vetors were found! Please change the values of kernel parameters.')
  81.         end
  82.     else
  83.         model.bias = 0; % value of bias
  84.     end

  85.     model.mu = PARAMETER.Value;          % vector of weight values
  86.     model.beta = HYPERPARAMETER.beta;    % noise precision
  87.     model.alpha = HYPERPARAMETER.Alpha;  % vector of weight precision values
  88.     model.kernel = kernel; % kernel function
  89.     model.PHI = BASIS(:, PARAMETER.Relevant); % Used BASIS
  90.     model.iter = DIAGNOSTIC.iterations; % iteration
  91.     model.nRVs = size(model.relevant, 1);  % number of relevance vectors
  92.     model.option = option; % RVM model option
  93.     model.sigma = inv(diag(HYPERPARAMETER.Alpha)+...
  94.         HYPERPARAMETER.beta*(model.PHI'*model.PHI));% posterior covariance
  95.     model.rv = x(model.relevant, :); % relevance vectors
  96.    
  97.     % model evaluation
  98.     ypre = model.PHI*model.mu;
  99.     [model.RMSE, model.CD, model.MAE] = computePretIndex(y, ypre);

  100.     % display
  101.     if strcmp(model.option.display, 'on')
  102.         fprintf('\n')
  103.         fprintf('*** RVM model training finished ***\n')
  104.         fprintf('iter           =  %d \n', model.iter);
  105.         fprintf('nRVs           =  %d \n', model.nRVs)
  106.         fprintf('radio of nRVs  =  %.2f%% \n', 100*model.nRVs/numSamples)
  107.         fprintf('time cost      =  %.4f s\n', timeCost)
  108.         fprintf('training RMSE  =  %.4f\n', model.RMSE)
  109.         fprintf('training CD    =  %.4f\n', model.CD)
  110.         fprintf('training MAE   =  %.4f\n', model.MAE)
  111.         fprintf('\n')
  112.     end
  113. end
复制代码

是这样操作嘛~~
  1. function result = rvm_test(model, xt, yt)
  2.     %{

  3.         DESCRIPTION

  4.               result = rvm_test(model, xt, yt)

  5.         INPUT
  6.           model        RVM model
  7.           xt           testing samples (n*d)
  8.                        n: number of samples
  9.                        d: number of features
  10.           yt           target samples (n*1)


  11.         OUTPUT
  12.           result       predicted results

  13.         Created on 18th March 2020, by Kepeng Qiu.
  14.         -------------------------------------------------------------

  15.     %}
  16. % compute the kernel matrix

  17.     if nargin < 3
  18.         warning('Please input the real value of the test data')
  19.     end
  20.    
  21.    
  22.     tic
  23.     nt = size(xt, 1);
  24.     % Compute the kernel matrix
  25. %     K = model.kernel.getKernelMatrix(xt, model.rv);
  26.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  27.     % 计算多项式核函数矩阵
  28.     K_poly = kernel_poly.getKernelMatrix(x, x);
  29.    
  30.     % 创建一个双曲正切核函数对象
  31.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  32.     % 计算双曲正切核函数矩阵
  33.     K_sigmoid = kernel_sigmoid.getKernelMatrix(x, x);
  34.    
  35.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  36.     K = K_poly+K_sigmoid;


  37.     % Construct the basis vectors
  38.     if ~strcmp(model.option.freeBasis, 'on')
  39.         % No bias
  40.         BASIS = K;
  41.     else
  42.         % Add bias
  43.         BASIS = [K, ones(nt, 1)];
  44.     end
  45.    
  46.     result = struct();
  47.     % prediction
  48.     result.ypre = BASIS*model.mu;

  49.     % variance of prediction
  50.     result.yvar = model.beta^-1+diag(BASIS*model.sigma*BASIS');
  51.     timeCost = toc;
  52.    
  53.     % model evaluation
  54.     [result.RMSE, result.CD, result.MAE] = computePretIndex(yt, result.ypre);
  55.    
  56.     if strcmp(model.option.display, 'on')
  57.         fprintf('\n')
  58.         fprintf('*** RVM model test finished ***\n')
  59.         fprintf('time cost      =  %.4f s\n', timeCost)
  60.         fprintf('predicted RMSE =  %.4f\n', result.RMSE)
  61.         fprintf('predicted CD   =  %.4f\n', result.CD)
  62.         fprintf('predicted MAE  =  %.4f\n', result.MAE)
  63.         fprintf('\n')
  64.     end
  65. end
复制代码



iqiukp 发表于 2020-3-29 16:31:58
18019095291 发表于 2020-3-29 16:21
按照楼主这个代码替换之后rvm.test又提示字符数无效,但是rvm.train的没这个问题(哭哭,他俩难道不是一样 ...

既然rvm_train没报错了,那就没问题了。
另外,你直接把rvm_train替换的那部分粘贴到rvm_test肯定会报错呀。就比如
出错 rvm_test (line 36)
    K_poly = kernel_poly.getKernelMatrix(x, x);


你看看核函数那里的x 在哪? rvm_test函数的输入是xt, yt以及训练好的RVM模型。


你把rvm_test代码贴一下(按照我回复的那段,不要直接把rvm_train那段粘贴到rvm_test),然后再把报错的那行贴一下。



18019095291 发表于 2020-3-29 16:39:48
我刚看到了model.rv那里 确实是这样不该一样的。。。
  1. function result = rvm_test(model, xt, yt)
  2.     %{

  3.         DESCRIPTION

  4.               result = rvm_test(model, xt, yt)

  5.         INPUT
  6.           model        RVM model
  7.           xt           testing samples (n*d)
  8.                        n: number of samples
  9.                        d: number of features
  10.           yt           target samples (n*1)


  11.         OUTPUT
  12.           result       predicted results

  13.         Created on 18th March 2020, by Kepeng Qiu.
  14.         -------------------------------------------------------------

  15.     %}
  16. % compute the kernel matrix

  17.     if nargin < 3
  18.         warning('Please input the real value of the test data')
  19.     end
  20.    
  21.    
  22.     tic
  23.     nt = size(xt, 1);
  24.     % Compute the kernel matrix
  25. %     K = model.kernel.getKernelMatrix(xt, model.rv);
  26.     % 创建一个多项式核函数对象
  27.     kernel_poly = Kernel('type', 'poly', 'degree', 2, 'offset', 0);
  28.     % 计算多项式核函数矩阵
  29.     K_poly = kernel_poly.getKernelMatrix(xt, model.rv);
  30.    
  31.     % 创建一个双曲正切核函数对象
  32.     kernel_sigmoid = Kernel('type', 'sigm', 'gamma', 0.1, 'offset', 0);
  33.     % 计算双曲正切核函数矩阵
  34.     K_sigmoid = kernel_sigmoid.getKernelMatrix(xt, model.rv);
  35.    
  36.     % 混合的核函数矩阵(也可以单独设置每个核函数的权重)
  37.     K = K_poly+K_sigmoid;


  38.     % Construct the basis vectors
  39.     if ~strcmp(model.option.freeBasis, 'on')
  40.         % No bias
  41.         BASIS = K;
  42.     else
  43.         % Add bias
  44.         BASIS = [K, ones(nt, 1)];
  45.     end
  46.    
  47.     result = struct();
  48.     % prediction
  49.     result.ypre = BASIS*model.mu;

  50.     % variance of prediction
  51.     result.yvar = model.beta^-1+diag(BASIS*model.sigma*BASIS');
  52.     timeCost = toc;
  53.    
  54.     % model evaluation
  55.     [result.RMSE, result.CD, result.MAE] = computePretIndex(yt, result.ypre);
  56.    
  57.     if strcmp(model.option.display, 'on')
  58.         fprintf('\n')
  59.         fprintf('*** RVM model test finished ***\n')
  60.         fprintf('time cost      =  %.4f s\n', timeCost)
  61.         fprintf('predicted RMSE =  %.4f\n', result.RMSE)
  62.         fprintf('predicted CD   =  %.4f\n', result.CD)
  63.         fprintf('predicted MAE  =  %.4f\n', result.MAE)
  64.         fprintf('\n')
  65.     end
  66. end
复制代码


不懂为啥按照楼主那样替换就出现这个毛病 和第一次改代码一样
错误: 文件:rvm_test.m 行:34 列:3
运算符的使用无效。

出错 demo_RVM (line 24)
result = rvm_test(model,xt, yt);

18019095291 发表于 2020-3-29 16:45:06
把rvm.train的那部分复制过去 改了xt, model.rv
的位置 这回没有报错 不过还是没懂为什么上面那个就会报错运算符的事情呢~

iqiukp 发表于 2020-3-29 16:48:45
18019095291 发表于 2020-3-29 16:39
我刚看到了model.rv那里 确实是这样不该一样的。。。

我复制了一下你的代码,找到问题了:代码的缩进出问题了。

你先把每行代码前面的空白处删掉,然后再ctrl+A全选代码,然后再ctrl+I自动对齐代码。再试试。

18019095291 发表于 2020-3-29 16:51:09
iqiukp 发表于 2020-3-29 16:48
我复制了一下你的代码,找到问题了:代码的缩进出问题了。

你先把每行代码前面的空白处删掉,然后再ctrl ...

太感谢楼主了5555
完美的解决了我的问题 期待楼主有更多的进展~~
祝楼主天天开心

王镇_zVnvQ 发表于 2020-4-3 15:27:26
石小超同学 发表于 2020-3-18 12:00
请问楼主是这样改吗?为什么显示有错误?谢谢您

你好,我的QQ1578584623,方便加个好友一起研究多核相关向量机吗

王镇_zVnvQ 发表于 2020-4-3 15:43:16
iqiukp 发表于 2020-3-29 16:31
既然rvm_train没报错了,那就没问题了。
另外,你直接把rvm_train替换的那部分粘贴到rvm_test肯定会报错 ...

建模之前是否需要对数据进行标准化处理?

iqiukp 发表于 2020-4-3 22:15:54
王镇_zVnvQ 发表于 2020-4-3 15:43
建模之前是否需要对数据进行标准化处理?

一般来说是需要预处理的

王镇_zVnvQ 发表于 2020-4-10 18:23:59
iqiukp 发表于 2020-3-29 16:31
既然rvm_train没报错了,那就没问题了。
另外,你直接把rvm_train替换的那部分粘贴到rvm_test肯定会报错 ...

楼主你好,关于混合核函数有几个问题请教。(1)rvm_train和rvm_test核函数修改完成之后,主函数demo_RVM对应的函数(kernel = Kernel('type', 'gauss', 'width', 2);
option = struct('freeBasis', 'on',...
                'display', 'on');      
% train RVM model
model = rvm_train(x, y, 'K', K, 'option', option);)如何修改
(2)利用优化算法优化核参数时除了核宽之外,关于RVM的超参数a,b等是否也需要优化,如果需要改如何处理?

iqiukp 发表于 2020-4-10 18:47:09
本帖最后由 iqiukp 于 2020-4-10 22:09 编辑
王镇_zVnvQ 发表于 2020-4-10 18:23
楼主你好,关于混合核函数有几个问题请教。(1)rvm_train和rvm_test核函数修改完成之后,主函数demo_RVM ...

你好。

Q1:  混合核函数中关于主函数的修改

在当前版本代码中使用混合核函数,直接在rvm_train 和 rvm_test 修改即可,主函数的核函数设置那里不用管了,相当于子函数内部指定核函数类型了。


Q2:  超参数的优化

RVM的超参数在SB2_Release_200 工具箱是通过Fast marginal likelihood maximisation优化的,

对应的参考文献为:
Tipping M E, Faul A C. Fast marginal likelihood maximisation for sparse Bayesian models[C]//AISTATS. 2003.

而核参数属于RVM模型的外部参数,这个可以通过交叉验证、网格搜索、智能优化算法来寻找合适的值。所以在该代码中,不需要再额外考虑超参数的优化。

王镇_zVnvQ 发表于 2020-4-11 17:08:05
iqiukp 发表于 2020-4-10 18:47
你好。

Q1:  混合核函数中关于主函数的修改

谢谢楼主的解答,很有收获

王镇_zVnvQ 发表于 2020-4-11 17:15:16
iqiukp 发表于 2020-4-10 18:47
你好。

Q1:  混合核函数中关于主函数的修改

之前记得好像有人用EM算法进行参数的迭代求解,这个做法和Fast marginal likelihood maximisation得出的结果,效果哪个好呢?

iqiukp 发表于 2020-4-11 20:09:04
王镇_zVnvQ 发表于 2020-4-11 17:15
之前记得好像有人用EM算法进行参数的迭代求解,这个做法和Fast marginal likelihood maximisation得出的 ...


Snipaste_2020-04-11_19-59-11.png

Bishop C M. Pattern recognition and machine learning[M]. springer, 2006.



在《Pattern Recognition and Machine Learning》这本书的第7章 "Sparse Kernel Machines" 有两种方法的对比说明,具体可以参阅这本书。


王镇_zVnvQ 发表于 2020-4-13 11:30:21
iqiukp 发表于 2020-4-11 20:09
在《Pattern Recognition and Machine Learning》这本书的第7章 "Sparse Kernel Machines" 有两种 ...

好的好的

涉远飞高 发表于 2020-4-18 17:30:55
本帖最后由 涉远飞高 于 2020-4-18 17:37 编辑

楼主好,感谢楼主提供的RVM代码,的确给RVM新人提供了很大的帮助。
在学习了您的代码及网络上相关文献后,有这么一个疑惑:

[1]范强飞,廖爱华,丁亚琦.基于WOA-RVM的滚动轴承退化趋势预测[J].组合机床与自动化加工技术,2019(11):58-61+66.
在上面这篇文献中,有这么一段话:针对上述问题,本文提出一种基于WOA 优化
RVM 的预测方法,该方法运用WOA 对RVM 的超参数α 和核宽度β 寻优。为验证提出方法的有效性,对
实测的全寿命滚动轴承的退化趋势进行仿真预测,结果表明建立的基于WOA-RVM 的滚动轴承性能退化趋势预测模型,鲁棒性更强,预测精度更高。

但我目前只能从代码中找到核宽度,也就是代码“kernel = Kernel('type', 'gauss', 'width', 1);”中的width,请问所谓的超参数α指的是什么?能够在哪里找到呢?
此外,我也看到了您对其他人的回复,“RVM的超参数在SB2_Release_200 工具箱是通过Fast marginal likelihood maximisation优化的”,请问是不是以前的工具箱是不是就可以对这个超参数使用优化算法等方法进行调整?如果实在想对超参数进行优化的话,是否有相关途径呢?

望解惑,谢谢!

基于WOA_RVM的滚动轴承退化趋势预测_范强飞.pdf

849.95 KB, 下载次数: 17

问题中所提及文献


iqiukp 发表于 2020-4-18 19:27:09
本帖最后由 iqiukp 于 2020-4-18 19:31 编辑
涉远飞高 发表于 2020-4-18 17:30
楼主好,感谢楼主提供的RVM代码,的确给RVM新人提供了很大的帮助。
在学习了您的代码及网络上相关文献后, ...

你好。

1.  在RVM中,对于每个训练样本,都有一个对应的权重w,而这个权重w是假设服从0均值,α ^-1的高斯分布。因此对于一个有n个样本的训练集,其超参数是一个1*n的一维向量。关于超参数的优化,可以参考#93和#96的回帖。

2.  MATLAB语言,除了SB2_Release_200,我暂时没用过其他的工具箱,可能有其他的优化方法吧。我也去看过Python语言的RVM代码,较为经典的是基于scikit-learn库的scikit-rvm,超参数α的优化部分源码如下:

Snipaste_2020-04-18_19-01-24.png
可以看到,也是用极大似然法来优化的。

3. 如果考虑用群智能优化算法来优化超参数,以WOA为例,优化变量个数为n,定义每个变量的上边界(ub)和下边界(lb),然后再编写一个目标函数的脚本文件 rmse = f(超参数),最后就是设定WOA算法本身的参数了。这方面的文献我没怎么关注,不过,这样做如何保证超参数的稀疏性?


qqaaq134679 发表于 2020-4-19 13:06:49
您好楼主,我是在做一个评价系统,数据是这个[80 100 80 80 80 60 100 80 60 100],想让这十项分数通过rvm得出一个综合的分数,请问x和y的代码应该如何修改,此前从未接触过算法相关,所以不太会操作。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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