scipy.linalg.sparse.eigsh 不适用于广义特征值

计算科学 Python 特征值 机器学习
2021-12-05 14:51:39

我在 StackOverflow 上问过这个问题,有人告诉我,我会在这里得到更好的答案。所以这是我的问题:

我正在从事一个机器学习项目,该项目涉及对一些标记数据进行主成分分析,并使用这些标签从数据中提取更有价值的信息。

为此,我正在为每个类计算一个散点矩阵,对于每对类,我需要为它们的散点矩阵求解一个广义特征值问题,如下所示:

Siv=w(Sj+βI)v,

在哪里β是一个乘数并且I是单位矩阵。现在,这是python中的代码:

        jeigenvalues = eigsh(scatter_j, k=10, return_eigenvectors=False, maxiter=100)
        print('eigenvalues made')
        beta = betaMult*mean(jeigenvalues)
        print(beta)
        print(scatter_j+beta*eye(shape(x_data)[1]))
        w, v = eigsh(scatter_i,M=scatter_j+beta*eye(shape(x_data)[1]),k=int(numberOfEVs/45), maxiter=100)
        print(i,j,'done')

numberOfEVs在我当前的代码中是 90(所以它可以被 45 整除)。

但问题是,在我使用eigsh上述公式的那一行,它从来没有给我答案。它一直在吃越来越多的内存,甚至没有完成一次迭代(我将它的maxiter输入设置为 1,它仍然没有给出答案)。当我不给eigsh函数提供M参数时(这是广义 EV 问题右侧的矩阵,并且在未指定时假定为“I”),它可以正常工作。但是当M提供时,它变得没有响应。

有任何想法吗?

编辑:散点矩阵有相当小的条目,大多在 10^-5 左右。我还尝试将左侧乘以 RHS 矩阵的逆矩阵,但它又遇到了同样的问题(持续很长时间没有答案)。这些条目的小是问题吗?那我该如何解决呢?

0个回答
没有发现任何回复~