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

问题描述 投票:0回答:1

我想使用无监督的最近​​邻居,我的数据中有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。

python numpy scikit-learn nan knn
1个回答
0
投票

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

假设您的数据被缩放为0均值和单位方差,将nan替换为0并不是一个好主意,正如您已经说过的那样。因此,如果至少有一个值为nan,我还决定忽略两个样本之间距离计算的特征。然而,这增加了具有许多缺失值的样本与其他样本的距离较小的机会。因此,通过两个样本完成的特征数量来标准化距离是有意义的,并且当最小量的特征在两个样本中具有值时,仅将样本视为最近邻居。

© www.soinside.com 2019 - 2024. All rights reserved.