1. 算法核心思想:
通过计算每个训练样本到待分类样本的距离,选取和待分类样本的距离最近的 K 个训练样本,K个样本中那个类别的训练样本占据着多数, 则表明待分类的样本就属于哪一个类别。
KNN算法在类别的决策中, 只与极少数的相邻样本相关。因此,对于类别的样本交叉或重叠较多的待分类样本集来说, KNN较其他算法较为适合。KNN算法的结果很大程度取决于K的选择。
K值得取值一般低于训练数据样本数的平方根
1.1:欧式距离,曼哈顿距离和余弦距离:
上图分别为 欧式距离, 曼哈顿距离和余弦距离
1.欧式距离又称欧几里得距离或欧几里得度量(Euclidean Metric),以空间为基准的两点之间最短距离 :
2.曼哈顿距离又称马氏距离(Manhattan distance),还见到过更加形象的,叫出租车距离的。
3.
余弦距离,也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。
向量,是多维空间中有方向的线段,如果两个向量的方向一致,即夹角接近零,那么这两个向量就相近。而要确定两个向量方向是否一致,这就要用到余弦定理计算向量的夹角。
采用哪种距离度量方法对最终结果有很大影响。例如,你的数据集有很多特征,但是如果任
意一对个体之间的欧氏距离都相等,那么你就没法通过欧氏距离进行比较了!曼哈顿距离在某些
情况下具有更高的稳定性,但是如果数据集中某些特征值很大,用曼哈顿距离的话,这些特征会
掩盖其他特征间的邻近关系。最后,再来说说余弦距离,它适用于特征向量很多的情况,但是它
丢弃了向量长度所包含的在某些场景下可能会很有用的一些信息。 from:blog
2.其算法的描述为:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
3.算法实现
4.算法的优缺点:
scikit-learn 中KNN 的参数:
1. n_neighbors 就是 kNN 里的 k,就是在做分类时,我们选取问题点最近的多少个最近邻。
2.weights 是在进行分类判断时给最近邻附上的加权,默认的 'uniform' 是等权加权,
'distance' 选项是按照距离的倒数进行加权,也可以使用用户自己设置的其他加权方法。
3.algorithm 是分类时采取的算法,有 'brute'、'kd_tree' 和 'ball_tree'。kd_tree 的 kd 树,而 ball_tree 是另一种基于树状结构的 kNN 算法,brute 则是最直接的蛮力计算。根据样本量的大小和特征的维度数量,不同的算法有各自的优势。默认的 'auto' 选项会在学习时自动选择最合适的算法,所以一般来讲选择 auto 就可以。
4.leaf_size 是 kd_tree 或 ball_tree 生成的树的树叶(树叶就是二叉树中没有分枝的节点)的大小。在 kd 树文章中我们所有的二叉树的叶子中都只有一个数据点,但实际上树叶中可以有多于一个的数据点,算法在达到叶子时在其中执行蛮力计算即可。对于很多使用场景来说,叶子的大小并不是很重要,我们设 leaf_size=1 就好。
5.metric 和 p,是距离函数的选项,如果 metric ='minkowski' 并且 p=p 的话,计算两点之间的距离就是
d((x1,…,xn),(y1,…,yn))=(∑i=1n|xi−yi|p)1/p
一般来讲,默认的 metric='minkowski'(默认)和 p=2(默认)就可以满足大部分需求。其他的 metric 选项可见说明文档。metric_params 是一些特殊 metric 选项需要的特定参数,默认是 None。
6.n_jobs 是并行计算的线程数量,默认是 1,输入 -1 则设为 CPU 的内核数。
函数方法:
对数据集进行预测
输出预测概率:
正确率打分