【问题标题】:How to label the training projections obtained by PCA to use for training SVM for classification? MATLAB如何标记 PCA 获得的训练投影以用于训练 SVM 进行分类? 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;

标签: matlab libsvm pca


【解决方案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 (你只标记它)......而且我不明白你的类的问题......
    猜你喜欢
    • 2012-06-27
    • 2012-05-31
    • 2012-02-21
    • 2022-01-10
    • 2018-12-20
    • 2012-04-23
    • 2012-01-23
    • 2017-08-13
    • 2015-05-04
    相关资源
    最近更新 更多