我使用sklearn和有一个问题的亲和传播。我已经建立了一个输入矩阵,我一直得到以下错误。

ValueError: Input contains NaN, infinity or a value too large for dtype('float64').

我已经跑了

np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True

我试着用

mat[np.isfinite(mat) == True] = 0

去除掉无限值,但这也没用。 我要怎么做才能去掉矩阵中的无穷大值,这样我就可以使用亲和传播算法了?

我使用anaconda和python 2.7.9。


当前回答

我有错误后,试图选择一个子集的行:

df = df.reindex(index=my_index)

结果是my_index包含df中不包含的值。索引,所以reindex函数插入一些新行,并用nan填充它们。

其他回答

我有同样的问题,在我的情况下,答案很简单,我有一个单元格在我的CSV中没有值(“x,y,z,,”)。把一个默认值固定为我。

我发现在一个新列上调用pct_change后,nan存在于一行中。我用下面的代码删除nan行

df = df.replace([np.inf, -np.inf], np.nan)
df = df.dropna()
df = df.reset_index()

在处理这个问题很长一段时间后,我意识到这是因为在训练集和测试集的分割中,所有数据行的数据列都是相同的。然后在某些算法中进行一些计算可能会导致无穷大的结果。如果您正在使用的数据的关闭行更可能是相似的,那么重新排列数据会有所帮助。这是scikit的一个漏洞。我使用的是0.23.2版本。

这里没有一个答案对我有用。这是有效的。

Test_y = np.nan_to_num(Test_y)

它将无穷大值替换为高有限值,将nan值替换为数字

如果您正在运行一个估计器,可能是您的学习率太高了。我意外地将错误的数组传递给了网格搜索,最终训练的学习率为500,我可以看到这导致了训练过程中的问题。

基本上,不仅你的输入必须全部有效,中间数据也必须有效。