KNN算法,结果报错,帮忙怎么改

Python042

KNN算法,结果报错,帮忙怎么改,第1张

knn算法(k-Nearest Neighbor algorithm).是一种经典的分类算法.

注意,不是聚类算法.所以这种分类算法必然包括了训练过程.

然而和一般性的分类算法不同,knn算法是一种 懒惰算法 .它并非

像其他的分类算法先通过训练建立分类模型.,而是一种被动的分类

过程.它是边测试边训练建立分类模型.

算法的一般描述过程如下:

1.首先计算每个测试样本点到其他每个点的距离.

这个距离可以是欧氏距离,余弦距离等.

区别1:分类的目标不同。

聚类和分类最大的不同在于,knn分类的目标是事先已知的,而kmeans聚类则不一样,聚类事先不知道目标变量是什么,类别没有像分类那样被预先定义出来,所以,聚类有时也叫无监督学习。聚类分析试图将相似的对象归入同一簇,将不相似的对象归为不同簇,

区别2:速度不同。

K-means算法虽然比较容易实现,但是其可能收敛到局部最优解,且在大规模数据集上收敛速度相对较慢。

区别3:K的含义不同。

KNN,K的含义:来了一个样本x,要给它分类,即求出它的y,就从数据集中,在x附近找离它最近的K个数据点,这K个数据点,类别c占的个数最多,就把x的label设为c。

K-Means,K的含义:K是人工固定好的数字,假设数据集合可以分为K个簇,由于是依靠人工定好,需要一点先验知识。

KNN利用数据在各个维度上的相关性对数据中的缺失值或者异常值进行填补和修正

本文中讨论的数据集是来源于分布于某地各站点测得的空气污染物浓度数值随着时间的变化记录,在某些地点或某些时刻存在数据缺失,而我们已知,在该批数据中,测点浓度值在 距离 和 时间 上呈现出相关性,即,空间距离越接近,时间越接近的测量点测得的数值也会越相关,所以可以使用KNN算法从经度、纬度和时间三个维度入手进行数据的处理

在上图中,我们没有获得某时刻目标点处的测量值 ,但我们可以获得其周围若干测量值情况 , , ...,  ,这样我们便可使用已有数据对目标值c_x进行估计:

其中权重 与邻点与目标点的距离成反相关,如:

实际使用时可以自行定义权重与距离的关系

在使用KNN算法对数据进行填补时,需要对每条样本寻找其近邻点,所以我们首先需要计算不同样本之间的距离,这里可以使用sklearn.neighbors中的NearestNeighbors来解决

nbrs = NearestNeighbors(n_neighbors, algorithm = 'ball_tree').fit(X)

distances, indices = nbrs.kneighbors(X)

获得了距离矩阵后我们便可以对每个样本寻找其与其他样本的距离,使用前面的公式便可计算出其对应的估计值 这里需要注意,样本距离是指样本在指定的维度上的欧式距离,样本在指定的维度上均满足距离和测量值上的相关性,比如我们可以把样本的经纬度和测量时间作为计算样本距离的维度 ,这样目标点周围那些空间距离越近、测量时间越接近的邻点测量值对目标点估计值 的影响就越大