我有一个40X3249
嘈杂的数据集和40X1
结果集。我想在 Matlab 中对其执行简单的顺序特征选择。Matlab示例很复杂,我无法理解。即使是一些关于 SoF 的例子也无济于事。我想使用决策树作为分类器来执行特征选择。有人可以简单地解释一下。
与特征数量相比,我的数据集的观察数量非常少,这也是一个问题吗?
我正在关注这个例子:Sequential feature selection Matlab,我收到这样的错误:
TRAINING 的合并协方差矩阵必须是正定的。
我有一个40X3249
嘈杂的数据集和40X1
结果集。我想在 Matlab 中对其执行简单的顺序特征选择。Matlab示例很复杂,我无法理解。即使是一些关于 SoF 的例子也无济于事。我想使用决策树作为分类器来执行特征选择。有人可以简单地解释一下。
与特征数量相比,我的数据集的观察数量非常少,这也是一个问题吗?
我正在关注这个例子:Sequential feature selection Matlab,我收到这样的错误:
TRAINING 的合并协方差矩阵必须是正定的。
我已经解释了您在回答之前的问题时收到的错误消息。
一般来说,你有比样本更多的变量是一个问题。这将阻止您使用某些技术,例如您尝试的判别分析,但无论如何这是一个问题。事实是,如果变量与样本的比率如此之高,那么即使它们都是随机数,某些变量组合很可能会完美地分类您的数据集。如果您构建单个决策树模型,这是正确的,如果您使用特征选择方法显式搜索变量组合,则更是如此。
我建议您尝试某种降维方法。如果您的所有变量都是连续的,您可以按照@user1207217 的建议尝试 PCA。或者,您可以使用潜在变量方法进行模型构建,例如 PLS(plsregress
在 MATLAB 中)。
如果您仍然打算在此数据集上使用带有决策树的顺序特征选择,那么您应该能够修改您链接到的问题中的示例,将分类调用替换为 one to classregtree
。
此错误来自classify
该问题中执行 LDA 的函数的使用。当数据等级不足(或者换句话说,某些特征几乎完全相关)时,会发生此错误。为了克服这个问题,您应该将数据投影到较低维的子空间。主成分分析可以为您做到这一点。有关如何在 Matlab 的统计工具箱中使用函数的更多详细信息,请参见此处。pca
[basis, scores, ~] = pca(X); % Find the basis functions and their weighting, X is row vectors
indices = find(scores > eps(2*max(scores))); % This is to find irrelevant components up to machine precision of the biggest component .. with a litte extra tolerance (2x)
new_basis = basis(:, indices); % This gets us the relevant components, which are stored in variable "basis" as column vectors
X_new = X*new_basis; % inner products between the new basis functions spanning some subspace of the original, and the original feature vectors
这应该让您自动投影到相关的子空间。请注意,您的特征将不再具有与以前相同的含义,因为它们将是旧特征的加权组合。
额外说明:如果您不想更改您的特征表示,那么您需要使用适用于排名不足数据的东西而不是分类。您可以推出自己的惩罚判别分析版本(这很简单),使用支持向量机或其他不会像 LDA 那样破坏相关特征的分类函数(由于需要协方差估计的矩阵求逆)。
编辑: PS 我没有测试过这个,因为我已经在 Matlab 中推出了我自己的 PCA 版本。