如何标记 PCA 获得的训练投影以用于训练 SVM 进行分类? MATLAB

Posted

技术标签:

【中文标题】如何标记 PCA 获得的训练投影以用于训练 SVM 进行分类? MATLAB【英文标题】:How to label the training projections obtained by PCA to use for training SVM for classification? MATLAB 【发布时间】:2014-02-21 00:08:22 【问题描述】:

我有一组图像“训练集”。我已经形成了“本征空间”。现在我需要标记预测来训练 SVM。 “面 1”到特征空间的投影必须标记为 +1,所有其他面到特征空间的投影必须标记为 -1。

我不知道该怎么做。任何建议都会很有帮助!

我使用以下方法形成了特征空间:

    function [signals,V] = pca2(data)
    [M,N] = size(data); 
    data = reshape(data, M*N,1); % subtract off the mean for each dimension 
    mn = mean(data,2); 
    data = bsxfun(@minus, data, mean(data,1)); 
    % construct the matrix Y 
    Y = data'*data / (M*N-1); 
    [V D] = eigs(Y, 10); % reduce to 10 dimension 
    % project the original data 
    signals = data * V; 

【问题讨论】:

我使用以下方法形成了特征空间:function [signals,V] = pca2(data) [M,N] = size(data);数据 = 重塑(数据,MN,1); % 减去每个维度的平均值 mn = mean(data,2);数据= bsxfun(@减号,数据,平均值(数据,1)); % 构造矩阵 Y Y = data'*data / (MN-1); [V D] = eigs(Y, 10); % 减少到 10 维 % 投影原始数据信号 = 数据 * V; 【参考方案1】:
label = ones(N,1);% N samples in total, +1 represents face 1
for i=1:N 
    % For each face image, you run
    [signals,V] = pca2(data); % ith data
    if ....  % other faces than face 1
        label(i) = -1;
    end
    face(i,:) = reshape(signals,1,[]);
end
model = svmtrain(label,face);

【讨论】:

【参考方案2】:

如果您要识别多个人,则必须为每个人创建一个单独的数据文件,并为每个人创建一个单独的 SVM。这是因为 SVM 专注于二分类。

这是一个在 Matlab 中使用 libsvm 的示例(here 是完整代码),假设您在文件中有数据:

[person1_label, person1_inst] = libsvmread('../person1');
[person2_label, person2_inst] = libsvmread('../person2');
[person3_label, person3_inst] = libsvmread('../person3');

model1 = svmtrain(person1_label, person1_inst, '-c 1 -g 0.07 -b 1');
model2 = svmtrain(person2_label, person2_inst, '-c 1 -g 0.07 -b 1');
model3 = svmtrain(person3_label, person3_inst, '-c 1 -g 0.07 -b 1');

要测试一张人脸,您需要应用所有模型并获得最大输出(使用svmpredict 时,您必须使用'-b 1' 来获得概率估计。

另外,在Matlab中不用svmreadsvmwrite,直接传数据即可:

training_data = [];%Your matrix that contains 4 feature vectors
person1_label =[1,1,-1,-1];
person2_label = [-1,-1,1,-1];
person3_label = [-1,-1,-1,1];

model1 = svmtrain(person1_label, person_inst, '-c 1 -g 0.07 -b 1');
model2 = svmtrain(person2_label, person_inst, '-c 1 -g 0.07 -b 1');
model3 = svmtrain(person3_label, person_inst, '-c 1 -g 0.07 -b 1');

【讨论】:

我现在只尝试识别一张脸。问题是,我使用了 PCA 并将“训练数据”投影到特征空间。我的训练数据包含来自第 1 个人(要识别的那个)的图像以及来自其他人的图像。我现在想将从人员 1 获得的 PCA 标记为 +1,从所有其他人获得的 PCA 标记为 -1,这样当我将测试图像作为人员 1 时,svm 应该能够将标签预测为 -1 .我无法做到这一点,因为 PCA 需要预测,并且在预测之后我无法区分哪些来自第 1 个人和其他人。 好的,我不知道具体怎么解决。在此示例中,您可以看到相同的应用程序(但使用 Python)。也许这对你有帮助:scikit-learn.org/stable/auto_examples/applications/… 我查看了您提到的代码,但他们使用内置函数来“拆分”数据。我需要知道如何手动完成。但是感谢您的努力。【参考方案3】:

您似乎无法训练 SVM...这是有关如何训练 Matlab SVM 的示例:

%Generate 100 positive points (the data is a circle)
r = sqrt(rand(100,1)); % radius
t = 2*pi*rand(100,1); % angle
dataP = [r.*cos(t), r.*sin(t)]; % points

%Generate 100 negative points (the data is a circle)
r2 = sqrt(3*rand(100,1)+1); % radius
t2 = 2*pi*rand(100,1); % angle
dataN = [r2.*cos(t2), r2.*sin(t2)]; % points

data3 = [dataN;dataP];
theclass = ones(200,1);
theclass(1:100) = -1; %First 100 points are negative

%Train the SVM
cl = svmtrain(data3,theclass,'Kernel_Function','rbf');

【讨论】:

我正在使用开源库 'LIBSVM' 来实现 SVM。我需要使用“svmwrite”写入数据,然后使用“svmtrain”训练模型,然后使用“svmpredict”预测测试数据的标签。问题是我的训练文件有来自 +1 类和 -1 类的投影信号,所以我不知道如何适当地标记数据。 @Sid 你应该重新表述这个问题,因为你没有提到 libsvm (你只标记它)......而且我不明白你的类的问题......

以上是关于如何标记 PCA 获得的训练投影以用于训练 SVM 进行分类? MATLAB的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Matlab 中提高 SVM 训练和分类的准确性?

从预先训练的 SVM 中获得准确度以进行图像分类

svm人脸识别训练了svm模型后怎么测试

如何使用 OpenCV 3 训练 SVM 以识别“欧元”硬币?

提取形状上下文描述符以训练 SVM

CNN vs SVM 用于微笑强度检测训练?