⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 demo1.m

📁 支持向量机工具箱
💻 M
字号:
function demsvm1()% DEMSVM1 - 演示基本的支持向量机分类%  %   DEMSVM1通过使用不同的核函数来演示了支持向量机分类器的一个简单数据集的分类%创建一个简单的数据集X = [2 7; 3 6; 2 2; 8 1; 6 4; 4 8; 9 5; 9 9; 9 4; 6 9; 7 4];Y = [ +1;  +1;  +1;  +1;  +1;  -1;  -1;  -1;  -1;  -1;  -1];%对数据集构图及决策边界的范围x1ran = [0 10];x2ran = [0 10];disp(' ');disp('这个演示说明了使用支持向量机(SVM)进行分类的方法。数据是一组二维数据点,');disp('其值用分类标记+1或-1表示。');disp(' ');disp('数据集由以下的点组成');ind = [1:length(Y)]';                      %设置索引值的范围等于向量Y的长度fprintf('X%2i = (%2i, %2i) 标记 Y%2i = %2i\n', [ind, X, ind, Y]');   %显示每个数据点的值及相对应的分类标记Y的值disp(' ')disp('请按任何键对数据集进行构图');pausef1 = figure;                               %创建用户界面1plotdata(X, Y, x1ran, x2ran);              %对数据点进行构图title('数据类+1(方框)类 -1(叉)');        %用方框和叉标记不同的数据类fprintf('\n');fprintf('数据在图%i中被构图\n', f1);disp('方框代表用Yi=+1标记的点,叉代表用Yi=-1标记的点');disp(' ')disp('现在我们用这组数据来训练一个支持向量机分类器,我们使用最简单的核函数,内积');disp('点为 Xi, Xj (线性核函数: K(Xi,Xj) = Xi''*Xj )。');disp(' ');disp('请按任何键开始训练')pausenet = svm(size(X, 2), 'linear', [], 10);     %调用函数svm创建一个支持向量机分类器      net = svmtrain(net, X, Y);                   %调用函数svmtrain训练支持向量机分类器  f2 = figure;                                 %创建用户界面2plotboundary(net, x1ran, x2ran);             %绘制决策边界 plotdata(X, Y, x1ran, x2ran);                %对数据点进行构图plotsv(net, X, Y);                           %画支持向量title(['SVM(线性核函数):决策边界(黑)支持向量(红)']);fprintf('\n');fprintf('在图%i中显示了决策边界,', f2);disp('用黑色线条表示,以区分数据类+1和-!(这是当前的决');disp('策边界)。红色线条是从决策边界到类+1处的点,蓝色线条是从决策边界到类-1处的');disp('点。');disp(' ');disp('所有用红色标记绘制的样本是支持向量,支持向量是从决策边界到类+1和-1处的样');disp('本,所有的样本并不能被正确的分类。');disp(' ');disp('数据集能用一个线性核函数进行正确地分类,我们可以从每个样本的系数alpha中');disp('看到。这些系数如下:');ind = [1:length(Y)]';fprintf('  样本 %2i: alpha%2i = %5.2f\n', [ind, ind, net.alpha]');fprintf('系数的上限被赋值为C = %5.2f. 没有任何有系数在这个上限,这意味着所有训练\n', net.c(1));disp('的样本能通过支持向量机被正确地分类。');disp(' ');disp('请按任何键继续')pauseX = [X; [4 4]];                                 %在原数据集中添加新的点Y = [Y; -1];                                    %标记为类-1net = svm(size(X, 2), 'linear', [], 10);        %调用SVM分类器  net = svmtrain(net, X, Y);                      %训练SVMf3 = figure;                                    %创建用户图形界面3plotboundary(net, x1ran, x2ran);                plotdata(X, Y, x1ran, x2ran);plotsv(net, X, Y);title(['SVM(线性核函数):决策边界(黑)支持向量(红)']);fprintf('\n');disp('在给出的数据集中增加额外的点X12,用-1标记,不能被线性的分类。SVM通过允许');disp('训练的数据点被非线性分类来处理这种情况。');disp(' ');disp('通过训练被修改的数据集我们可以看到X5, X11和X12不能被正确地分类,在图');fprintf('%i中显示了决策边界。\n', f3);disp('在每个样本中的系数alpha为:');ind = [1:length(Y)]';fprintf('  样本 %2i: alpha%2i = %5.2f\n', [ind, ind, net.alpha]');disp('非线性的数据点的系数在上限C上。');disp(' ')disp('请按任何键继续')pausefprintf('\n');disp('添加新的数据点后导致形成了一个更为复杂的数据集,它不能再被简单的线性核函数');disp('进行分类。我们可以使用功能更强的核函数—径向基核函数(RBF)进行分类。');disp(' ')disp('径向基核函数涉及到一个参数---内核宽度,我们将使用径向基核函数的3种不同的内');disp('核宽度的值训练SVM来显示决策边界。');disp(' ');disp('请按任何键继续')pausenet = svm(size(X, 2), 'rbf', [8], 100);            %径向基核函数,宽度为8net = svmtrain(net, X, Y);f4 = figure;plotboundary(net, x1ran, x2ran);plotdata(X, Y, x1ran, x2ran);plotsv(net, X, Y);title(['SVM 径向基核函数, 宽度为8:决策边界(黑) 支持向量(红)']); fprintf('\n');fprintf('图%i显示了支持向量机的决策边界\n', f4);disp('径向基核函数的内核宽度被赋值为8。');disp(' ')disp('请按任何键继续')pausenet = svm(size(X, 2), 'rbf', [1], 100);             %RBF,宽度为1net = svmtrain(net, X, Y);f5 = figure;plotboundary(net, x1ran, x2ran);plotdata(X, Y, x1ran, x2ran);plotsv(net, X, Y);title(['SVM 径向基核函数, 宽度为1:决策边界(黑) 支持向量(红)']); fprintf('\n');fprintf('图%i显示了支持向量机的决策边界\n', f5);disp('径向基核函数的内核宽度被赋值为1。由于更小的内核宽度允许决策边界更弯曲,决');disp('策边界现在被分散得更宽。');disp(' ')disp('请按任何键继续')pausenet = svm(size(X, 2), 'rbf', [36], 100);            %宽度为36net = svmtrain(net, X, Y);f6 = figure;plotboundary(net, x1ran, x2ran);plotdata(X, Y, x1ran, x2ran);plotsv(net, X, Y);title(['SVM 径向基核函数, 宽度为36:决策边界(黑) 支持向量(红)']); fprintf('\n');fprintf('图%i显示了支持向量机的决策边界,径向基核函数的内核宽度被赋值为36。\n', f6);disp('给出的决策边界和在图');fprintf('%i中显示的相似。\n', f2);fprintf('\n');disp('请按任何键结束演示')pausedelete(f1);delete(f2);delete(f3);delete(f4);delete(f5);delete(f6);function plotdata(X, Y, x1ran, x2ran)% PLOTDATA——对二维数据集构图% hold on;ind = find(Y>0);plot(X(ind,1), X(ind,2), 'ks');                %用黑色方框标记+1数据类ind = find(Y<0);plot(X(ind,1), X(ind,2), 'kx');                %用黑色叉标记-1数据类 text(X(:,1)+.2,X(:,2), int2str([1:length(Y)]'));axis([x1ran x2ran]);axis xy;function plotsv(net, X, Y)% PLOTSV - 画支持向量% hold on;ind = find(Y(net.svind)>0);plot(X(net.svind(ind),1),X(net.svind(ind),2),'rs');        %用红方框标记+1数据类ind = find(Y(net.svind)<0);plot(X(net.svind(ind),1),X(net.svind(ind),2),'rx');        %用红色叉标记-1数据类function [x11, x22, x1x2out] = plotboundary(net, x1ran, x2ran)% PLOTBOUNDARY - 在给定的范围内画支持向量机的决策边界% hold on;nbpoints = 100;x1 = x1ran(1):(x1ran(2)-x1ran(1))/nbpoints:x1ran(2);x2 = x2ran(1):(x2ran(2)-x2ran(1))/nbpoints:x2ran(2);[x11, x22] = meshgrid(x1, x2);[dummy, x1x2out] = svmfwd(net, [x11(:),x22(:)]);x1x2out = reshape(x1x2out, [length(x1) length(x2)]);contour(x11, x22, x1x2out, [-0.99 -0.99], 'b-');          %用蓝色划线标记下边界contour(x11, x22, x1x2out, [0 0], 'k-');                  %黑色划线标记决策边界   contour(x11, x22, x1x2out, [0.99 0.99], 'y-');            %黄色划线标记上边界

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -