我正在使用skLearning,并有一个问题与亲和力传播。我已经建立了一个输入矩阵,我一直得到以下错误。
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
删除无限值,但这也不起作用。我能做些什么来摆脱矩阵中的无限值,以便我可以使用亲和传播算法?
我使用蟒蛇和python 2.7.9。
这可能发生在scikit内部,这取决于您正在做什么。我建议您阅读所使用函数的文档。您可能正在使用一个矩阵,它取决于您的矩阵是正定的,并且不满足该标准。
编辑:我怎么会错过这个:
np.isnan(mat.any()) #and gets False
np.isfinite(mat.all()) #and gets True
这显然是错误的。正确的做法是:
np.any(np.isnan(mat))
和
np.all(np.isfinite(mat))
您希望检查元素是否为NaN,而不是检查any
函数的返回值是否为数字。。。
我在与熊猫一起使用sklearn时收到了相同的错误消息。我的解决方案是在运行任何sklearn代码之前重置数据帧的索引df
:
df = df.reset_index()
当我删除df
中的一些条目时,我多次遇到这个问题,例如
df = df[df.label=='desired_one']
这是我的函数(基于此)来清理数据集的nan
,Inf
和丢失的单元格(对于倾斜的数据集):
import pandas as pd
import numpy as np
def clean_dataset(df):
assert isinstance(df, pd.DataFrame), "df needs to be a pd.DataFrame"
df.dropna(inplace=True)
indices_to_keep = ~df.isin([np.nan, np.inf, -np.inf]).any(1)
return df[indices_to_keep].astype(np.float64)