顺序特征选择Matlab

时间:2011-11-27 18:50:17

标签: matlab select forward

有人可以解释如何在Matlab中使用这个功能 “sequentialfs”

它看起来很直接,但我不知道我们怎么能为它设计一个函数处理程序?!

任何线索?!

1 个答案:

答案 0 :(得分:19)

这是一个比文档中更简单的例子。

首先让我们创建一个非常简单的数据集。我们有一些类标签y。 500个来自班级0,500个来自班级1,他们是随机订购的。

>> y = [zeros(500,1); ones(500,1)];
>> y = y(randperm(1000));

我们要使用100个变量x来预测y。其中99个只是随机噪声,但其中一个与类标签高度相关。

>> x = rand(1000,99);
>> x(:,100) = y + rand(1000,1)*0.1;

现在假设我们想要使用线性判别分析对点进行分类。如果我们在不应用任何特征选择的情况下直接执行此操作,我们将首先将数据拆分为训练集和测试集:

>> xtrain = x(1:700, :); xtest = x(701:end, :);
>> ytrain = y(1:700); ytest = y(701:end);

然后我们会对它们进行分类:

>> ypred = classify(xtest, xtrain, ytrain);

最后我们将测量预测的错误率:

>> sum(ytest ~= ypred)
ans =
     0

在这种情况下,我们得到了完美的分类。

要使函数句柄与sequentialfs一起使用,只需将这些部分放在一起:

>> f = @(xtrain, ytrain, xtest, ytest) sum(ytest ~= classify(xtest, xtrain, ytrain));

将所有这些一起传递到sequentialfs

>> fs = sequentialfs(f,x,y)
fs =
  Columns 1 through 16
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 17 through 32
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 33 through 48
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 49 through 64
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 65 through 80
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 81 through 96
     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0     0
  Columns 97 through 100
     0     0     0     1

输出中的最后1表示变量100正如预期的那样是y中变量x的最佳预测变量。

sequentialfs文档中的示例稍微复杂一些,主要是因为预测的类标签是字符串而不是上面的数值,所以~strcmp用于计算错误率而不是~=。此外,它使用交叉验证来估计错误率,而不是如上所述的直接评估。