【问题标题】:Matlab - bug with linear discriminant analysisMatlab - 具有线性判别分析的错误
【发布时间】:2011-08-20 21:23:30
【问题描述】:

我跑

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 x 5 矩阵。你能告诉我这个错误是什么意思,即它为什么会出现,以及如何解决它? 谢谢

【问题讨论】:

  • 也提到其他变量的维度。 X_testing、X_training 需要有相同的列数,X_training、Y_training 需要有相同的行数。
  • Classify 正在根据您提供的值创建协方差矩阵。关键是 X_training 和 Y_training 必须正确设置。 X_training 构建协方差矩阵,所以在担心 X_testing 之前确保它是正确的。
  • 如果您的训练数据矩阵中有 NaN 值,它可能会产生正定误差

标签: matlab classification


【解决方案1】:

尝试在 Matlab 中使用 cvshrink 函数对数据进行正则化

【讨论】:

    【解决方案2】:

    解释:当您运行函数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 上发布的类似问题的答案。

    【讨论】:

    • 谢谢!刚开始学习分类,“diaglinear”解决了我的问题,非常感谢您的解释!
    猜你喜欢
    • 2018-07-08
    • 1970-01-01
    • 2013-06-19
    • 2013-12-10
    • 2022-06-22
    • 2020-02-03
    • 2016-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多