【问题标题】:One-vs-all multiclass classification一对多的多类分类
【发布时间】:2023-04-05 19:16:01
【问题描述】:

我正在尝试使用 SVM 对步行周期进行分类。我正在使用类似于 RBF 内核的预计算内核。 K(X,X') = exp(-sigma*dtw(X,X')^2)。我正在尝试一种针对多类分类的所有策略。目前,我正在使用概率来预测班级我也想使用多数票但有点卡住了,我需要考虑如何使用多数票来做出班级决定,我想测试模型上的所有示例并预测班级更多投票,这是可以接受的方法吗?我有以下代码。我

    %# Walk cycles dataset
    clear
    clc
    close all

   % addpath to the libsvm toolbox
   %addpath('../libsvm-3.12/matlab');

   % addpath to the data
     dirData = './data';
     addpath(dirData);

   % Load/read the seprated datasets
     load(fullfile(dirData,'myTrainData.mat'));
     trainData =  myTrainData (:,5:104); clear data;
     trainLabel = myTrainData(:,1); clear label;

     load(fullfile(dirData,'myTestData.mat'));
     testData =  myTestData(:,5:104); clear data;
     testLabel = myTestData(:,1); clear label;

   % Extract important information
     labelList = unique(trainLabel);
     NClass = length(labelList);
     [Ntrain D] = size(trainData);
     [Ntest D] = size(testData);


     [~,~,labels] = unique(trainLabel);   %# labels: 1/2/3/4...../51
     %data = zscore(meas); % Currently I am not scaling features             
     numInst = size(trainData,1);
     numLabels = max(trainLabel);

     %# split training/testing
     % I have already seprated train and test Dataset
     idx = randperm(numInst);
     numTrain = 100; 
     numTest = size(testData,1);
     %trainData = data(idx(1:numTrain),:);  testData = data(idx(numTrain+1:end),:);
     %trainLabel = labels(idx(1:numTrain)); testLabel = labels(idx(numTrain+1:end));

     %# train one-against-all models

    preCompKernel = @(X,Y) (distanceMat2(X,Y));
    K_preCompKernel  =  [(1:numTrain)' , preCompKernel(trainData,trainData)];
    K_preCompKernelTest = [(1:numTest)' ,preCompKernel(testData,trainData)];

    k_preCompNum = K_preCompKernel(:,1);
    k_preCompData = K_preCompKernel(:,2:end);

    K_preCompKernelTestNum = K_preCompKernelTest(:,1);
    K_preCompKernelTestData = K_preCompKernelTest (:,2:end);

    kernalMat = exp((-1/sigma).* k_preCompData.^2);
    kernelMatTest = exp((-1/sigma).* K_preCompKernelTestData.^2);


    kernelFinalMat = [k_preCompNum k_preCompData];
    kernelFinalMatTest = [K_preCompKernelTestNum K_preCompKernelTestData];


    model = cell(numLabels,1);
    for k=1:numLabels
        model{k} = svmtrain(double(trainLabel==k), kernelFinalMat, '-c 1 -t 4 -b 1');
    end

   %# get probability estimates of test instances using each model
      prob = zeros(numTest,numLabels);
      for k=1:numLabels
          [~,~,p] = svmpredict(double(testLabel==k), kernelFinalMatTest, model{k}, '-b  1');
          prob(:,k) = p(:,model{k}.Label==1);    %# probability of class==k
      end

   %# predict the class with the highest probability
      [~,pred] = max(prob,[],2);
      acc = sum(pred == testLabel) ./ numel(testLabel)    %# accuracy 
      C = confusionmat(testLabel, pred)  

【问题讨论】:

    标签: kernel svm


    【解决方案1】:

    在一对多的多类分类中不存在多数票。当您对 k 个类别进行 1-vs-all 投票时,您将获得 k 个投票/概率/...标签分配给最高的个人。

    【讨论】:

    • 感谢您的回答。我还有两个困惑。在一对一中,我们训练 c(c-1)/2 模型。假设我使用的是预先计算的内核。在这种情况下,用于训练的内核将在组合(C1&C2)训练数据上计算,依此类推。用于测试的内核也应该从(组合 c1 和 c2)测试数据中计算出来?
    • 我不确定我是否理解您的问题。无论您使用多少类/分类器,内核都需要精确计算。
    猜你喜欢
    • 2018-01-26
    • 2023-03-22
    • 1970-01-01
    • 2019-08-03
    • 1970-01-01
    • 2012-02-15
    • 2018-04-19
    • 2016-03-15
    相关资源
    最近更新 更多