首页 > 解决方案 > 在 matlab 中使用多个数据集训练 svm

问题描述

我有多个数据集,它们是 xy 数据,每个数据集代表同一个类,我也有其他 2 个类的多个数据集。

我需要对合并的 xy 数据进行训练,还是需要为每个数据集调用训练函数,注意每个数据集是同一类?每个类类型都有多个数据集。

第 1 类有 150 个 xy 数据集,第 2 类有 68 个,第 3 类有 55 个。如何在 matlab 中训练支持向量机(SVM)?

标签: matlab

解决方案


据我了解您的项目,您想在包含 3 个不同类的数据集上训练分类器。

通常,您希望使用您希望网络学习的类来标记您的数据,以便它可以在训练中检查它在“猜测”之后仍然偏离解决方案的程度,以便它可以优化下一次迭代的权重。

您还想将您的数据集拆分为一个训练集,用于学习,以及两个具有不同数据的部分,网络还不“知道”,并将提供一个很好的参考。这两个是一个验证集,用于在训练期间进行额外验证,另一个是测试集,用于在训练后测试准确性。

可以这样进行:

  1. 在 4D Matrix 中累积训练数据A,其中第一个二维将是您的值,x第三y个维度将是 XY 矩阵的索引。您可以使用A = horzconcat(x,y)

  2. 使用第 4 个维度根据您的班级标记您的数据。在您的情况下,在前 150 个元素中写 1,在后面的 68 中写 2,在最后 55 中写 3

  3. 打乱您的标记数据集。您可以使用randperm创建一个随机索引,然后遍历集合

  4. 将您的数据集拆分为训练、验证和测试部分。(通常60%、20%、20%是合理的)

  5. 将这些集合分别拆分为一个包含训练数据的 3D X 矩阵和一个包含每个训练数据的解的 Y 向量。

  6. 在您的训练选项中,使用您的验证部分指定您的验证数据,例如:

    training_options =  trainingOptions ...
                        ('sgdm', ...
                        'Verbose', 1 ,...
                        'VerboseFrequency' , 20, ...
                        'MaxEpochs', 30, ...
                        'MiniBatchSize', 128, ...
                        'Shuffle', 'every-epoch', ...
                        **'ValidationData', {X_validate, categorical(Y_validate)},...**
                        'ValidationFrequency', 20, ...
                        'ValidationPatience', 5, ...
                        'InitialLearnRate', 0.001, ...
                        'L2Regularization', 0, ...
                        'Momentum', 0, ...
                        'ExecutionEnvironment', 'cpu', ...
                        'Plots','training-progress');
    
  7. 训练你的神经网络 Matlab 对象

    [nn, nn_info] = trainNetwork(X_train, categorical(Y_train), ...
                  layers, training_options);
    
  8. 检索训练网络的准确性:

    acurracy = sum(Y_test_predictions == categorical(Y_test) )/ ...
           size(Y_test, 1)
    

我将这种方法应用于卷积网络,效果很好。希望这可以帮助,

一切顺利,西蒙


推荐阅读