使用场景
KNN算法,是一种根据周边的K个相近的数据判断本身数据特点的一种算法, 近朱者赤近墨者黑。其可以运用于回归也可以运用于分类,两者的区别只是在最后进行预测时有区别。例如分类问题,一般使用K中占最多数的类作于预测数据的类别;回归问题一般使用平均的方式,K个数据的平均值作为最后预测数据的值。
原理
KNN算法主要涉及三个方面的内容,K值的选择、距离度量和预测的策略。
K只选择,可以使用交叉验证的方式,选择数据集合中较为适合的K值,K值越小,模型越复杂,极端的情况K=1,即最近的那个数据和需要预测数据一样的类别,这样容易出现过拟合的情况;K值越大,模型月简单,极端的情况是K就是整个数据集合的数量,这样就是在整个数据集中处理,相当于没有训练,出现欠拟合的情况;距离的度量有欧氏距离,曼哈顿距离等,这些都是闵可夫斯基距离的特例
D
(
x
,
y
)
=
(
∣
x
1
−
y
1
∣
)
p
+
(
∣
x
2
−
y
2
∣
)
p
+
.
.
.
+
(
∣
x
n
−
y
n
∣
)
p
p
=
∑
i
=
1
n
(
∣
x
i
−
y
i
∣
)
p
p
D(x,y) =\sqrt[p]{(|x_1-y_1|)^p + (|x_2-y_2|)^p + ... + (|x_n-y_n|)^p} =\sqrt[p]{\sum\limits_{i=1}^{n}(|x_i-y_i|)^p}
D(x,y)=p(∣x1−y1∣)p+(∣x2−y2∣)p+...+(∣xn−yn∣)p=pi=1∑n(∣xi−yi∣)p
曼哈顿距离p取值为1,欧氏距离p取值为2
预测根据分类问题和回归问题的不同有不同的预测策略。
实现方案
蛮力实现
KNN寻找与需要预测数据的K个距离最近的数据,直接使用暴力的方式,即每次遍历所有的数据并计算出相应的距离,然后排序寻找K个距离最近的数据,这样的方法当数据量小时还行,当数据量大且每个样本的属性很多的时候,计算量就变得非常巨大,这样就需要更好的实现方式,下面介绍使用树的思想对KNN进行实现
KD树实现
KD实现树,分为建树->选最近的临界点->预测三个过程
建树
建树是一个递归的过程,选择方差最大的树形作为树分裂的节点,使用该节点中中位数作为分割的点,将数据分成两个部分,然后继续递归进行
选择最近的临界点
首先对需要预测的数据进行在树中查找,并将查找的路径记录下来,计算路径中的距离,记录其中最近的距离,然后回溯将没处理节点中的数据进行查找,若该节点的距离小于记录的数据,那么更新最近的点,再回溯,若已经找到了最近的点,且以当前的最近距离为半径的圆与分开的树没有交集,那么久停止查找。
预测
预测的过程就是寻找K词最近临界点的过程,选择临近点后将该节点进行标注,下次不再进行选择。
球树实现
球树的实现过程与KD树类似,建树->选最近的临界点->预测,之间只有建树不同
建树的过程是,首先构建一个球面,这个球可以将所有的数据包含进去,且该球是最小的,选择球上的一点,在选择与该点最远的点,将其他的点根据两个点之间的距离分成两拨数据,对两拨数据执行上层建立球面的过程,然后递归进行。
选择最近临界点与KD树实现类似,根据建成的树逐级寻找。
使用方法
直接时候用sklearn提供的库,可实现分类和回归的功能