使用具有 NaN 的无监督最近邻

Posted

技术标签:

【中文标题】使用具有 NaN 的无监督最近邻【英文标题】:Use Unsupervised Nearest Neighbors with NaN 【发布时间】:2019-07-01 06:26:21 【问题描述】:

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

【问题讨论】:

当您说“不要计算与任何其他记录的距离”时,您是什么意思?你想简单地将包含 NaN 的记录放在任何地方吗? 不,我希望如果一条记录的第 10 个特征具有 NaN,则第 10 个特征不计入与任何其他记录的距离,因此该记录将同样接近任何其他记录 no无论他们是否有第 10 个特征的 -1、0、13 或任何其他数字。 【参考方案1】:

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

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

【讨论】:

以上是关于使用具有 NaN 的无监督最近邻的主要内容,如果未能解决你的问题,请参考以下文章

最近邻算法

ML之监督学习算法之分类算法一 ———— k-近邻算法(最邻近算法)

机器学习之监督学习-分类模型K近邻(KNN)算法实现

监督学习--k近邻算法

机器学习之K-近邻算法

K 最近邻分类具有相同点的特殊情况