Matlab中的简单顺序特征选择

时间:2013-04-24 09:21:53

标签: matlab select machine-learning

我有一个40X3249噪声数据集和40X1结果集。我想在Matlab上对它进行简单的顺序特征选择。 Matlab示例很复杂,我无法遵循它。甚至关于SoF的一些例子也无济于事。我想使用决策树作为分类器来执行特征选择。有人可以用简单的语言解释 还有一个问题是我的数据集与特征数量相比具有非常少的观察数量? 我正在关注此示例:Sequential feature selection Matlab我收到的错误是这样的:

  

培训的合并协方差矩阵必须是正定的。

2 个答案:

答案 0 :(得分:3)

我已经解释了您在回答之前问题时收到的错误消息。

一般来说,问题是你有比样本更多的变量。这将阻止您使用某些技术,例如您尝试的判别分析,但无论如何这都是一个问题。事实是,如果变量与样本的比率很高,那么变量的某些组合很可能会对数据集进行完美分类,即使它们都是随机数。如果您构建单个决策树模型,那就是如此,如果您使用特征选择方法显式搜索变量组合,则更是如此。

我建议你尝试某种降维方法。如果所有变量都是连续的,您可以按照@ user1207217的建议尝试PCA。或者,您可以使用潜在变量方法进行模型构建,例如PLS(MATLAB中的plsregress)。

如果您仍然打算在此数据集上使用带有决策树的顺序特征选择,那么您应该能够修改您链接到的问题中的示例,将一个调用替换为{{1} }。

答案 1 :(得分:1)

此错误来自在该问题中使用classify函数,该函数正在执行LDA。当数据缺乏排名时(或者换句话说,某些特征几乎完全相关),会发生此错误。为了克服这个问题,您应该将数据投影到较低维度的子空间。主成分分析可以为您完成此任务。有关如何在Matlab的统计工具箱中使用pca函数的详细信息,请参阅here

[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那样打破相关特征(由于需要协方差估计的矩阵求逆)。

编辑:P.S我没有对此进行过测试,因为我在Matlab中推出了自己的PCA版本。