应用背景
KNN利用数据在各个维度上的相关性对数据中的缺失值或者异常值进行填补和修正
本文中讨论的数据集是来源于分布于某地各站点测得的空气污染物浓度数值随着时间的变化记录,在某些地点或某些时刻存在数据缺失,而我们已知,在该批数据中,测点浓度值在距离和时间上呈现出相关性,即,空间距离越接近,时间越接近的测量点测得的数值也会越相关,所以可以使用KNN算法从经度、纬度和时间三个维度入手进行数据的处理
KNN数据填补示意图
算法原理
在上图中,我们没有获得某时刻目标点处的测量值,但我们可以获得其周围若干测量值情况
,
, ...,
,这样我们便可使用已有数据对目标值c_x进行估计:
其中权重与邻点与目标点的距离成反相关,如:
实际使用时可以自行定义权重与距离的关系
在使用KNN算法对数据进行填补时,需要对每条样本寻找其近邻点,所以我们首先需要计算不同样本之间的距离,这里可以使用sklearn.neighbors中的NearestNeighbors来解决
nbrs = NearestNeighbors(n_neighbors, algorithm = 'ball_tree').fit(X)
distances, indices = nbrs.kneighbors(X)
获得了距离矩阵后我们便可以对每个样本寻找其与其他样本的距离,使用前面的公式便可计算出其对应的估计值这里需要注意,样本距离是指样本在指定的维度上的欧式距离,样本在指定的维度上均满足距离和测量值上的相关性,比如我们可以把样本的经纬度和测量时间作为计算样本距离的维度
,这样目标点周围那些空间距离越近、测量时间越接近的邻点测量值对目标点估计值
的影响就越大