我正在尝试在matplotlib中的矩阵上执行PCA,但仍然遇到LinAlgError:SVD没有收敛。我已经检查了我的数据是否存在错误值。我能够在类似的数据集上实现PCA而没有任何问题,但在这种情况下我切换了维度,因为行数必须大于PCA类的列数。我的矩阵有345行和146列浮点数介于0.0和1.0之间。我不确定这里发生了什么或如何调试。我在iPython工作,如果它有所作为,同时拥有numpy和scipy的最新版本(我在以前的版本中读过有与此功能相关的错误)。
我也在同一个单元格上遇到此警告,我不确定它是否相关:
RuntimeWarning: invalid value encountered in true_divide
return (x - self.mu)/self.sigma
这是我的单元格代码:
import numpy as np
from matplotlib.mlab import PCA
t = []
c = []
master = []
for s in sample_master_list.values():
if s.t2d:
t.append(s.pathways.values())
else:
c.append(s.pathways.values())
master = t + c
pca = PCA(np.array(master))
如果有人有任何关于我如何能够找出导致问题的问题的提示我会非常感激。
答案 0 :(得分:2)
可能是master
中的一列是常量。看看np.std(master)
。如果其中一个值为0,则master
的对应列为常量。如果是这种情况,您可以使用pca = PCA(np.array(master), standardize=False)
作为可能的解决方法。 standardize
参数告诉PCA是否将每列中的数据除以该列的标准偏差。 (或者你可以删除常量列。无论如何它都没有提供任何有用的信息,因此忽略它是没有害处的。)