二、算法要点
(一)距离计算
在 KNN 中,要度量空间中点的距离的话,有很多种度量方式,如常见的曼哈顿距离
计算、欧式距离
计算等。关于距离计算,我们在聚类算法中已有详细介绍。不过通常 KNN 算法中使用的是欧式距离,即
在文本数据的机器学习中,更常用的距离计算方法是余弦相似度,其计算公式如下:
余弦相似度是一种用于衡量两个向量之间相似度的度量方法。在向量空间模型中,它通过计算两个向量夹角的余弦值来确定它们的相似程度。对于两个非零向量 A和 B,余弦相似度的取值范围是 [-1,1]。当余弦相似度为 1时,表示两个向量完全相似;当为 -1 时,表示完全相反;当为 0时,表示两个向量正交(即相互垂直,没有任何相似成分)。使用余弦相似度可以消除数据的某些冗余信息,某些情况下更贴近数据的本质。
下图为余弦相似度的动态解析图,通过拉动向量A和B,可以清晰呈现两个向量的余弦相似度在[-1,0,1]及各值下的状态关系。


(二)K 值的选择
在 KNN 算法中,计算过程及原理解析都不复杂,但 K 值的选择至关重要。那么,在实际场景应用中,如何选择 K 值呢?一般来讲,是利用算法工具,如 Orange,进行不同 K 值的测算,通过错误率的对比,找到一个错误率最低的 K 值,K 一般选取 1~20。比如汽车分类案例中,其错误率的曲线如图 2-4-3 所示。
图 2-4-3 汽车分类案例中的 K 值曲线
由图 2-4-3 可知,当 时,错误率达到最低点,表示分类的准确率最高。对于整个图形的走势分布,也易于理解。当增大 K 的时候,一般错误率会先降低,因为有周围更多的样本可以借鉴,分类效果会变好。当超过临界点(如图中的 )时,错误率又会上升,因为太多的样本会混淆 KNN 的判断。考虑一个极限情况,当 时,即把所有的样本均纳入判断范围,则 KNN 将失去意义。

(三)特征工程及 One-hot 编码
KNN 的应用场景是分类,一般来讲,应用于 KNN 的数据集大多数都是离散型、目录型数据结构。特征工程及 one-hot 编码都是将类别变量转换为机器学习算法易于利用的一种形式工具。尤其是 one-hot 编码,对类别进行“二进制化”操作,然后将其作为模型训练的特征,可以快速形成算法程序可识别运算的数据结构。在汽车分类用例
中,其源数据与 one-hot编码转换后的数据格式如表 2-4-1 和表 2-4-2 所示。
表 2-4-1 源数据部分数


(四)KNN 算法的特点
KNN 算法是一种非参的、惰性的算法。非参的意思并不是说 KNN 算法不需要参数,而是意味着这个模型不会对数据做出任何假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说,KNN 建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。
惰性是指与其他分类算法相比,没有损失函数和训练过程。比如,同样是分类算法,逻辑回归或人工神经网络等都需要先对数据进行大量训练,最后才会得到一个算法模型。而KNN 算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。