我使用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。


当前回答

在我的例子中,算法要求数据在(0,1)之间不包含。我非常残酷的解决方案是在所有期望值中添加一个小随机数:

y_train = pd.DataFrame(y_train).applymap(lambda x: x + np.random.rand()/100000.0)["col_name"]
y_train[y_train >= 1] = 0.999999

而y_train在[0,1]的范围内。

这当然不适合所有的情况,因为你会弄乱你的输入数据,但如果你有稀疏的数据,只需要一个快速的预测,这是一个解决方案

其他回答

在我的例子中,问题是许多scikit函数返回numpy数组,这些数组没有pandas索引。因此,当我使用那些numpy数组来构建新的dataframe时,有一个索引不匹配,然后我尝试将它们与原始数据混合。

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

df = df.reindex(index=my_index)

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

问题似乎发生在DecisionTreeClassifier输入检查,尝试

X_train = X_train.replace((np.inf, -np.inf, np.nan), 0).reset_index(drop=True)

我有同样的错误,在我的情况下,X和y是数据帧,所以我必须先将它们转换为矩阵:

X = X.values.astype(np.float)
y = y.values.astype(np.float)

编辑:最初建议的X.as_matrix()已弃用

泡芙! !在我的情况下,问题是关于NaN值…

您可以使用此函数列出具有NaN的列

your_data.isnull().sum()

然后你可以在数据集文件中填充这些NAN值。

下面是如何“将NaN替换为零,将无穷大替换为大的有限数”的代码。

your_data[:] = np.nan_to_num(your_data)

从numpy.nan_to_num