【问题标题】:How to plot a hyper plane in 3D for the SVM results?如何为 SVM 结果绘制 3D 超平面?
【发布时间】:2018-06-18 15:37:07
【问题描述】:

我只是想知道如何绘制 SVM 结果的超平面。

例如,这里我们使用两个特征,我们可以在 2D 中绘制决策边界。但是,如果我们使用 3 个特征,我们如何在 3D 中绘制超平面呢?

load fisheriris;

features = meas(1:100,:);
featureSelcted = features(1:100,1:2); % For example, featureSelcted = features(1:100,1:3) can not be plotted
groundTruthGroup = species(1:100);


svmStruct                               = svmtrain(featureSelcted, groundTruthGroup, ...
    'Kernel_Function', 'rbf', 'boxconstraint', Inf, 'showplot', true, 'Method', 'QP');
svmClassified                           = svmclassify(svmStruct,featureSelcted,'showplot',true);

可以在svm-fit-hyperplane 找到类似的 R 解决方案,但 Matlab 实现会很方便。

【问题讨论】:

    标签: matlab svm


    【解决方案1】:

    这是一个在 MATLAB 中绘制 3D SVM 结果的函数。

    function [] = svm_3d_matlab_vis(svmStruct,Xdata,group)
    sv =  svmStruct.SupportVectors;
    alphaHat = svmStruct.Alpha;
    bias = svmStruct.Bias;
    kfun = svmStruct.KernelFunction;
    kfunargs = svmStruct.KernelFunctionArgs;
    sh = svmStruct.ScaleData.shift; % shift vector
    scalef = svmStruct.ScaleData.scaleFactor; % scale vector
    
    group = group(~any(isnan(Xdata),2));
    Xdata =Xdata(~any(isnan(Xdata),2),:); % remove rows with NaN 
    
    % scale and shift data
    Xdata1 = repmat(scalef,size(Xdata,1),1).*(Xdata+repmat(sh,size(Xdata,1),1));
    k = 50; 
    cubeXMin = min(Xdata1(:,1));
    cubeYMin = min(Xdata1(:,2));
    cubeZMin = min(Xdata1(:,3));
    
    cubeXMax = max(Xdata1(:,1));
    cubeYMax = max(Xdata1(:,2));
    cubeZMax = max(Xdata1(:,3));
    stepx = (cubeXMax-cubeXMin)/(k-1);
    stepy = (cubeYMax-cubeYMin)/(k-1);
    stepz = (cubeZMax-cubeZMin)/(k-1);
    [x, y, z] = meshgrid(cubeXMin:stepx:cubeXMax,cubeYMin:stepy:cubeYMax,cubeZMin:stepz:cubeZMax);
    mm = size(x);
    x = x(:);
    y = y(:);
    z = z(:);
    f = (feval(kfun,sv,[x y z],kfunargs{:})'*alphaHat(:)) + bias;
    t = strcmp(group, group{1});
    
    % unscale and unshift data 
    Xdata1 =(Xdata1./repmat(scalef,size(Xdata,1),1)) - repmat(sh,size(Xdata,1),1);
    x =(x./repmat(scalef(1),size(x,1),1)) - repmat(sh(1),size(x,1),1);
    y =(y./repmat(scalef(2),size(y,1),1)) - repmat(sh(2),size(y,1),1);
    z =(z./repmat(scalef(3),size(z,1),1)) - repmat(sh(3),size(z,1),1);
    figure
    plot3(Xdata1(t, 1), Xdata1(t, 2), Xdata1(t, 3), 'b.');
    hold on
    plot3(Xdata1(~t, 1), Xdata1(~t, 2), Xdata1(~t, 3), 'r.');
    hold on
    % load unscaled support vectors for plotting
    sv = svmStruct.SupportVectorIndices;
    sv = [Xdata1(sv, :)];
    plot3(sv(:, 1), sv(:, 2), sv(:, 3), 'go');
    legend(group{1},group{end},'support vectors')
    
    x0 = reshape(x, mm);
    y0 = reshape(y, mm);
    z0 = reshape(z, mm);
    v0 = reshape(f, mm);
    
    [faces,verts,colors] = isosurface(x0, y0, z0, v0, 0, x0);
    patch('Vertices', verts, 'Faces', faces, 'FaceColor','k','edgecolor', 'none', 'FaceAlpha', 0.5);
    grid on
    box on
    view(3)
    hold off
    end
    

    示例图:

        % load data
         load fisheriris;
    % train svm using three features for two species
        svmStruct = svmtrain(meas(1:100,1:3),species(1:100),'showplot','false','kernel_function','rbf',...
          'boxconstraint',1,'kktviolationlevel',0.05,'tolkkt',5e-3); 
        % run function described above
         svm_3d_matlab_vis(svmStruct,meas(1:100,1:3),species(1:100))
    

    【讨论】:

    • 是否可以根据函数 fitcsvm 更新此答案,因为 svmtrain 已被弃用?
    猜你喜欢
    • 2021-03-09
    • 2016-07-20
    • 2014-07-13
    • 2018-03-12
    • 2020-01-28
    • 2016-06-19
    • 2011-12-22
    • 1970-01-01
    相关资源
    最近更新 更多