2011-05-07 28 views
0

我跑Matlab的 - 错误与线性判别分析

Y_testing_obtained = classify(X_testing, X_training, Y_training); 

,我得到的错误是

Error using ==> classify at 246 
The pooled covariance matrix of TRAINING must be positive definite. 

X_training为1550×5矩阵。你能告诉我这个错误是什么意思,即为什么出现,以及如何解决它? 感谢

+0

也提及其他变量的维数。 X_testing,X_training需要有相同的列数,X_training,Y_training需要有相同的行数。 – 2011-05-07 22:48:49

+0

分类根据您提供的值创建协方差矩阵。关键是X_training和Y_training,并且必须正确设置。 X_training构建协方差矩阵,因此在担心X_testing之前确保它是正确的。 – Rasman 2011-05-08 19:39:28

+0

如果您的培训数据矩阵中有NaN值,它可能会产生肯定的错误 – BGreene 2012-10-19 09:07:08

回答

4

说明:当您运行功能classify不指定判别函数的类型(像你一样),MATLAB的使用线性判别分析(LDA)。在不涉及LDA的太多细节的情况下,算法需要计算X_testing的协方差矩阵以解决优化问题,并且该矩阵必须是正定的(参见Wikipedia: Positive-definite matrix)。潜在的假设是您的数据由多变量概率分布表示,它总是具有正定协方差矩阵,除非一个或多个变量是其他变量的精确线性组合。

要解决您的问题:您的一个变量可能是其他变量的线性组合。您可以尝试选择一个合理的变量子集,或对训练数据执行主成分分析(PCA),然后使用前几个主成分进行分类。或者,你可以指定判别函数的类型,并选择两个朴素贝叶斯分类器之一,例如:

Y_testing_obtained = classify(X_testing, X_training, Y_training, 'diaglinear'); 

作为一个侧面说明,你还需要有比变量(列)更多的观测(行) ,但在你的情况下,这不是问题,因为你似乎有1550个观察值和5个变量。

最后,您还可以看看发布到Matlab forum上类似问题的答案。

+0

谢谢!刚开始学习分类和'直线'解决了我的问题,非常赞赏的解释! – Austin 2014-09-16 18:32:38

0

尝试在Matlab中使用cvshrink函数规则化数据