与NaN一起使用无监督的最近​​邻居

时间:2019-02-07 07:24:57

标签: python numpy scikit-learn nan knn

我想使用无监督的最近​​邻居,并且我的数据中包含NaN。我希望当记录的特征为NaN时,它不计入与其他任何记录的距离。用0填充NaN会使它接近其他记录,其值接近于0,并且远离远离0的值,因此它将不起作用。

我创建了一个欧几里得度量,因为NaN传播-和**,但对于nansum则为0。但是,由于NaN,我仍然收到错误消息。

有什么办法可以解决此错误?如果需要,我会考虑使用除sklearn之外的其他模块。

from sklearn.neighbors import NearestNeighbors
def metric(x1,x2):
    return np.nansum((x1-x2)**2) 
nn = NearestNeighbors(n_neighbors=10, metric=metric, n_jobs=-1)
nn.fit(x)

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

我的意思是我想,如果某个记录的第10个特征具有NaN(例如),则第10个特征不与任何其他记录相隔距离,因此该记录将与其他任何记录均接近记录第10个功能的值是-1、0、13还是其他数字。

使用NaN删除记录将不起作用,它实际上将删除所有记录。将NaN设置为0或任何其他数字也不起作用。我想掩盖所有功能的距离之和中的NaN。

1 个答案:

答案 0 :(得分:0)

在为缺少值的数据实现kNN分类器时,我遇到了同样的问题。调用fit()方法时,scikit-learn将检查数据中是否存在Nan,然后引发错误。我没有找到解决方案,最后写了自己的kNN分类器。

假设您的数据缩放为0均值和单位方差,那么将nan替换为0并不是一个好主意。因此,如果至少一个值是nan,我也决定忽略两个样本之间距离计算中的一个特征。但是,这增加了具有许多缺失值的样本与其他样本之间的距离很小的机会。因此,用两个样本都完整的特征数量来标准化距离是有意义的,并且仅当两个样本中都包含最小数量的特征时才将样本视为最近邻。