我想使用无监督的最近邻居,并且我的数据中包含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。
答案 0 :(得分:0)
在为缺少值的数据实现kNN分类器时,我遇到了同样的问题。调用fit()方法时,scikit-learn将检查数据中是否存在Nan,然后引发错误。我没有找到解决方案,最后写了自己的kNN分类器。
假设您的数据缩放为0均值和单位方差,那么将nan替换为0并不是一个好主意。因此,如果至少一个值是nan,我也决定忽略两个样本之间距离计算中的一个特征。但是,这增加了具有许多缺失值的样本与其他样本之间的距离很小的机会。因此,用两个样本都完整的特征数量来标准化距离是有意义的,并且仅当两个样本中都包含最小数量的特征时才将样本视为最近邻。