Matlab SVM线性二进制分类失败

时间:2016-04-18 11:33:21

标签: matlab svm

我正在尝试在Matlab中实现一个简单的SVM线性二进制分类,但我得到了奇怪的结果 我有两个类g={-1;1}由两个预测变量varXvarY定义。实际上,varY足以将数据集分为两个不同的类(约varY=0.38),但我会将varX保留为随机变量,因为我需要将其用于其他工作。

使用下面的代码(改编自MAtlab示例)我得到了一个错误的分类器。线性分类器应该更接近varY=0.38左右的水平线,我们可以通过绘制2D点来感知 它不会显示应该分隔两个类的行 我做错了什么?

g(1:14,1)=1;
g(15:26,1)=-1;
m3(:,1)=rand(26,1); %varX
m3(:,2)=[0.4008; 0.3984; 0.4054; 0.4048; 0.4052; 0.4071; 0.4088; 0.4113; 0.4189;
    0.4220; 0.4265; 0.4353; 0.4361; 0.4288; 0.3458; 0.3415; 0.3528; 
    0.3481; 0.3564; 0.3374; 0.3610; 0.3241; 0.3593; 0.3434; 0.3361; 0.3201]; %varY

SVMmodel_testm =  fitcsvm(m3,g,'KernelFunction','Linear');

d = 0.005; % Step size of the grid
[x1Grid,x2Grid] = meshgrid(min(m3(:,1)):d:max(m3(:,1)),...
    min(m3(:,2)):d:max(m3(:,2)));
xGrid = [x1Grid(:),x2Grid(:)];        % The grid
[~,scores2] = predict(SVMmodel_testm,xGrid); % The scores

figure();
h(1:2)=gscatter(m3(:,1), m3(:,2), g,'br','ox');
hold on
    % Support vectors
h(3) = plot(m3(SVMmodel_testm.IsSupportVector,1),m3(SVMmodel_testm.IsSupportVector,2),'ko','MarkerSize',10);
    % Decision boundary
contour(x1Grid,x2Grid,reshape(scores2(:,1),size(x1Grid)),[0 0],'k');
xlabel('varX'); ylabel('varY'); 
set(gca,'Color',[0.5 0.5 0.5]);
hold off

1 个答案:

答案 0 :(得分:0)

SVM的常见问题或任何分类方法都是非标准化数据。你有一个维度为0到1,另一个维度从0.3到0.4。这导致特征之间的不平衡。通常的做法是以某种方式规范化特征,例如std。试试这段代码:

g(1:14,1)=1;
g(15:26,1)=-1;
m3(:,1)=rand(26,1); %varX
m3(:,2)=[0.4008; 0.3984; 0.4054; 0.4048; 0.4052; 0.4071; 0.4088; 0.4113; 0.4189;
    0.4220; 0.4265; 0.4353; 0.4361; 0.4288; 0.3458; 0.3415; 0.3528; 
    0.3481; 0.3564; 0.3374; 0.3610; 0.3241; 0.3593; 0.3434; 0.3361; 0.3201]; %varY
m3(:,2) = m3(:,2)./std(m3(:,2));
SVMmodel_testm =  fitcsvm(m3,g,'KernelFunction','Linear');

注意最后一行之前的行。