Moh*_*him 5 matlab select forward
有人可以解释如何在Matlab"sequentialfs"中使用这个函数
它看起来很直接,但我不知道我们怎么能为它设计一个函数处理程序?!
任何线索?!
Sam*_*rts 19
这是一个比文档中的例子更简单的例子.
首先,让我们创建一个非常简单的数据集.我们有一些班级标签y.500个来自班级0,500个来自班级1,他们是随机订购的.
>> y = [zeros(500,1); ones(500,1)];
>> y = y(randperm(1000));
Run Code Online (Sandbox Code Playgroud)
我们有100个变量x可以用来预测y.其中99个只是随机噪声,但其中一个与类标签高度相关.
>> x = rand(1000,99);
>> x(:,100) = y + rand(1000,1)*0.1;
Run Code Online (Sandbox Code Playgroud)
现在假设我们想要使用线性判别分析对点进行分类.如果我们在不应用任何特征选择的情况下直接执行此操作,我们将首先将数据拆分为训练集和测试集:
>> xtrain = x(1:700, :); xtest = x(701:end, :);
>> ytrain = y(1:700); ytest = y(701:end);
Run Code Online (Sandbox Code Playgroud)
然后我们将它们分类:
>> ypred = classify(xtest, xtrain, ytrain);
Run Code Online (Sandbox Code Playgroud)
最后我们将测量预测的错误率:
>> sum(ytest ~= ypred)
ans =
0
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们得到了完美的分类.
要使函数句柄与之一起使用sequentialfs,只需将这些部分放在一起:
>> f = @(xtrain, ytrain, xtest, ytest) sum(ytest ~= classify(xtest, xtrain, ytrain));
Run Code Online (Sandbox Code Playgroud)
并将它们全部传递到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
Run Code Online (Sandbox Code Playgroud)
1输出中的最后一个表明变量100正如预期的那样y是变量中最好的预测变量x.
文档中的示例sequentialfs稍微复杂一些,主要是因为预测的类标签是字符串而不是上面的数值,因此~strcmp用于计算错误率而不是~=.此外,它使用交叉验证来估计错误率,而不是如上所述的直接评估.