我试图在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.pdf和svm 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');
您可以看到我尝试使用内置缩放属性,但无论输入如何,分类都会显示“正常”类。
答案 0 :(得分:0)
相应的平均值和标准偏差值
你是什么意思? 你有意思和标准吗?开发。对于每个功能?为什么不使用实际的最小/最大值?
我不确定在Matlab中实现这是否可行,但在我的OpenCV / SVM代码中,我存储了每个特征的训练数据中的所有最小/最大值,并使用这些最小/最大值来缩放测试数据相应的功能。
如果测试数据的值通常超出训练数据的最小值/最大值范围,则这是训练数据量不足的强烈暗示。 使用mean和std。开发。您不会明确地检测到这些值。