序列特征选择Matlab

序列特征选择Matlab,matlab,select,forward,Matlab,Select,Forward,有人能解释一下如何在Matlab中使用这个函数吗 “顺序基金” 它看起来很简单,但我不知道我们如何为它设计一个函数处理程序 有线索吗 这里有一个比文档中更简单的示例 首先,让我们创建一个非常简单的数据集。我们有一些类标签y。500来自类0,500来自类1,它们是随机排序的 >> y = [zeros(500,1); ones(500,1)]; >> y = y(randperm(1000)); 我们有100个变量x,我们想用它们来预测y。其中99个只是随机噪声,但其中一

有人能解释一下如何在Matlab中使用这个函数吗 “顺序基金”

它看起来很简单,但我不知道我们如何为它设计一个函数处理程序


有线索吗

这里有一个比文档中更简单的示例

首先,让我们创建一个非常简单的数据集。我们有一些类标签
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与预期一样,是
x
中变量中
y
的最佳预测值


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

您理解文档中的示例吗?有一点错误:shld be xtrain=x(1:700,:);xtest=x(701:end,:)@SamRoberts我有一个
40X3249
数据集,我将其分为训练集:
28X3249
和测试集:
12X3249
,但当我执行
ypred=classify(…)
我得到了这个错误:
训练的汇总协方差矩阵必须是正定的
。为什么会发生这种情况?@MaxSteel这是因为数据集的变量(3249)比样本(28)多得多。判别分析(分类算法)涉及的一个步骤是反转训练集的协方差矩阵。如果训练集的变量多于样本,协方差矩阵将不是正定的,因此不可逆。获取更多数据,使用PCA等技术降低训练集的维数,或者使用其他没有此限制的方法。@SamRoberts,我在将您的方法应用于其他数据集时遇到以下错误:
function'@(xtrain,ytrain,xtest,ytest)sum(ytest~=classify(xtrain,ytrain,xtest))'生成了以下错误:组的长度必须等于训练中的行数。
@SamRoberts,如果我们有4个类标签,我们遵循的路径将如何更改