如何扩展SVM分类的输入功能?

时间:2015-09-12 20:12:09

标签: matlab classification svm normalize

我试图在MATLAB中使用SVM执行两类分类。这两个类别是“正常”和“感染”,用于将细胞图像分别分为正常或感染。

我使用由1000个正常细胞图像和300个感染细胞图像组成的训练集。我从每个细胞中提取72个特征。所以我的训练特征集矩阵是72x1300,其中每行代表一个特征,每列代表从相应图像测量的相应特征值。

data: 72x1300 double

我的班级标签向量初始化为:

cellLabel(1:1000) = {'normal'};
cellLabel(1001:1300) = {'infected'};

在这些链接中被抄袭: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdfsvm scaling input values,我开始着手缩放功能值:

for i=1:1:size(data,1)
mu(i) = mean(data(:,i));
sd(i) = std(data(:,i));
scaledData(:,i) = (data(:,i) - mu(i))./sd(i);
end

为了测试,我读了一个测试图像并计算了72x1特征向量。在我分类之前,我使用“数据”中相应的均值和标准差值来缩放测试向量,然后进行分类。如果我这样做,我的训练准确率为0%。 但是,如果我分别从每个类扩展每个类并连接,我获得98%的训练准确性。有人可以解释我的方法是否正确?为了训练准确性,我知道我正在使用什么图像,因此读取平均值和SD值。对于图像标签未知的情况,我该怎么做?

这就是我训练的方式:

[idx,z] = rankfeatures(data,cellLabel,'Criterion','wilcoxon','NUMBER',7);
rnkData = data(idx,:);
rnkData = rnkData';
cellLabel = cellLabel';
SVMModel = fitcsvm(rnkData,cellLabel,'Standardize',true,'KernelFunction','RBF','KernelScale','auto');

您可以看到我尝试使用内置缩放属性,但无论输入如何,分类都会显示“正常”类。

1 个答案:

答案 0 :(得分:0)

  

相应的平均值和标准偏差值

你是什么意思? 你有意思和标准吗?开发。对于每个功能?为什么不使用实际的最小/最大值?

我不确定在Matlab中实现这是否可行,但在我的OpenCV / SVM代码中,我存储了每个特征的训练数据中的所有最小/最大值,并使用这些最小/最大值来缩放测试数据相应的功能。

如果测试数据的值通常超出训练数据的最小值/最大值范围,则这是训练数据量不足的强烈暗示。 使用mean和std。开发。您不会明确地检测到这些值。