我试图用MATLAB中的支持向量机进行两类分类.这两个类别分别为“正常”和“感染”,分别将细胞图像分为正常或受感染。
我使用了一个训练集,它由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');您可以看到,我尝试使用内置的缩放属性,但是无论输入是什么,分类都倾向于显示“正常”类。
发布于 2015-09-14 12:55:09
相应的均值和标准差值
您这是什么意思?你有刻薄和性病。dev.每一个特征?为什么不使用实际的min/max?
我不知道在Matlab中实现这个方法是否可行,但是在我的OpenCV/SVM代码中,我存储了每个特征的训练数据中的所有min/max值,并使用这些min/max值来缩放相应特征的测试数据。
如果测试数据的值经常超出训练数据的min/max范围,这是训练数据数量不足的强烈提示。使用平均值和性病。dev.值,您将不会如此显式地检测到这一点。
https://stackoverflow.com/questions/32543258
复制相似问题