我使用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。
这是我的函数(基于此)来清除数据集的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(axis=1)
return df[indices_to_keep].astype(np.float64)
try
mat.sum()
如果你的数据和是无穷大(大于最大浮点值3.402823e+38),你会得到这个错误。
请参阅scikit源代码中的validation.py中的_assert_all_finite函数:
if is_float and np.isfinite(X.sum()):
pass
elif is_float:
msg_err = "Input contains {} or a value too large for {!r}."
if (allow_nan and np.isinf(X).any() or
not allow_nan and not np.isfinite(X).all()):
type_err = 'infinity' if allow_nan else 'NaN, infinity'
# print(X.sum())
raise ValueError(msg_err.format(type_err, X.dtype))