我在 StackOverflow 上问过这个问题,有人告诉我,我会在这里得到更好的答案。所以这是我的问题:
我正在从事一个机器学习项目,该项目涉及对一些标记数据进行主成分分析,并使用这些标签从数据中提取更有价值的信息。
为此,我正在为每个类计算一个散点矩阵,对于每对类,我需要为它们的散点矩阵求解一个广义特征值问题,如下所示:
在哪里是一个乘数并且是单位矩阵。现在,这是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 矩阵的逆矩阵,但它又遇到了同样的问题(持续很长时间没有答案)。这些条目的小是问题吗?那我该如何解决呢?