Matlab中基于多项式核函数SVM绘制鸢尾花数据集多分类决策边界
问题:Matlab中多分类多项式核SVM的决策边界绘制
我正在Matlab中为鸢尾花(fisheriris)数据集绘制决策边界,以下是我正在编写的代码:
load fisheriris; X = meas(:,1:2); y = species; % PLOT figure; plot(X(strcmp(y,"setosa"),1),X(strcmp(y,"setosa"),2),'.','DisplayName','setosa'); hold on plot(X(strcmp(y,"versicolor"),1),X(strcmp(y,"versicolor"),2),'.','DisplayName','versicolor'); plot(X(strcmp(y,"virginica"),1),X(strcmp(y,"virginica"),2),'.','DisplayName','virginica'); hold off legend("setosa","versicolor","virginica") % SVM t = templateSVM("KernelFunction","polynomial", "BoxConstraint",1,"KernelScale","auto","PolynomialOrder",2,"Standardize",1); SVMModel = fitcecoc(X,y,"Learners", t); % DECISION BOUNDARY %%% Draw decision boundary here
上述代码中,我使用的SVMModel是多分类SVM(包含setosa、versicolor、virginica三类),训练数据采用数据集的前两列特征。我期望能够绘制2到3条曲线,展示SVM模型中各类鸢尾花的决策边界。我查阅了一些相关资料,但均无法解决我的问题,因为这些资料要么针对二分类SVM,要么针对线性SVM,而我使用的是多项式核函数:
- 第一个网站:针对二分类场景,而我是三分类;
- 第二个网站:针对线性SVM,而我使用的是多项式核函数;
- 第三个网站:其ecoc模型具备Beta属性,但我的模型没有该属性。
请问如何在该场景下绘制决策边界?
解决方案
你可以通过生成网格点并预测每个点的类别,再利用contour函数绘制类别间的决策边界。将以下代码替换原代码中%%% Draw decision boundary here的部分:
% 生成覆盖数据范围的网格点 x1_min = min(X(:,1)) - 0.5; x1_max = max(X(:,1)) + 0.5; x2_min = min(X(:,2)) - 0.5; x2_max = max(X(:,2)) + 0.5; [X1, X2] = meshgrid(linspace(x1_min, x1_max, 200), linspace(x2_min, x2_max, 200)); X_grid = [X1(:), X2(:)]; % 预测网格点的类别 y_pred = predict(SVMModel, X_grid); % 将类别转换为数值标签便于绘图 y_num = grp2idx(y_pred); Y_grid = reshape(y_num, size(X1)); % 重新开启绘图保持,叠加边界 hold on % 绘制决策边界:不同类别之间的分界线 contour(X1, X2, Y_grid, [0.5 1.5 2.5], 'LineWidth', 1.5, 'Color', 'k'); hold off % 补充图像标注 xlabel('Sepal Length'); ylabel('Sepal Width'); title('Polynomial Kernel SVM Decision Boundaries (Iris Dataset)');
代码说明
- 网格点生成:用
meshgrid生成覆盖特征数据范围的密集网格点,确保边界绘制完整且平滑; - 类别预测:用训练好的
SVMModel预测每个网格点的类别,通过grp2idx将字符串类别转换为可绘图的数值标签; - 边界绘制:
contour函数通过识别数值标签的分界点(0.5、1.5、2.5),精准绘制出不同类别之间的决策边界,这些边界完全匹配多项式核SVM的分类逻辑。
内容的提问来源于stack exchange,提问作者minh chanh le
相关产品推荐
相关产品推荐

