KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,说的是每个样本都可以用它最接近的K个邻近值来代表。
如上图,假如存在四种朋友关系,即黑名单、普通朋友、好朋友、知音,图中表示在空间中每种关系分别对应你的一个朋友,分别是小黑、小蓝、小绿、小红。那么如果你新认识了一个朋友小灰,怎么知道你们之间将会是什么样的朋友关系呢?
KNN算法可以帮你预测你们之间的朋友关系,帮你择友。
上表中,假如你择友时看重的特征如上,即共同爱好、本性、认知、情商、有趣,而基于这些特征对应的关系程度是你们的朋友关系,姓名列表示你的朋友的名字。
假如四种关系程度分别有五位朋友,将上表择友看重特征分别给这些朋友打分,每个特征0-5分,分越高表示该特征上你认为她/他越好,最终上表你将填充完整。
如果你最近新交了一个朋友X,那么你们的朋友关系怎么预测呢?
填上X朋友对应的择友看重特征各项的分数,不知道的可以靠观察和测试得到,最终要得到的是表中的?的值。
已知:你现有的四种朋友关系每个朋友的特征值和其对应的朋友关系数据集;新认识的朋友X的特征值。
目的:求新认识的朋友X与你的朋友关系。
方法:KNN算法,选择距离新认识朋友X特征向量最近的K个朋友,然后看这K个朋友的朋友关系,投票法得到与X之间的朋友关系预测。
关键:K值的选择。
如图,K值取不同的值,可能有不同的预测结果。
K值选择步骤:
数据集划分。划分为训练集、验证集和测试集。
计算训练集和验证集上的模型评价指标,F1分数(通过混淆矩阵计算得到)。
选择K值。取训练集和验证集指标都比较好的K值。
上图是k折交叉验证。
先将数据集划分为训练集和测试集,然后将训练集划分为k份,图中k为10,然后分别依次用其中一份作为验证集,k-1份作为训练集。
注意的是训练集划分为每个等份时,要尽可能的保持每个等份上的数据分布一致性,通常采用分层采样的方式,即保留每一份数据上每类样本比例相同。
依次计算训练集和验证集上的F1分数,然后取k个F1分数的均值作为训练集和验证集的F1分数。
KNN中的K值依次取1-训练集样本个数,分别得到训练集和验证集上的F1分数,然后绘图,取F1分数在训练集和验证集上都比较高的K值作为该模型最优的K值。
所提供的样本越多,预测结果就会越准确。在填完表格之后,在计算之前,都需要对每个特征进行归一化,这里每个特征如果取值0-5可以不用归一化,归一化的目的是,防止值小的特征被值大的特征所淹没。
至此,KNN科学择友就可以实现了,有了K值,就可以在样本集中找到与X特征向量距离最近的K个朋友,然后看这K个朋友的朋友关系标签都是什么,用投票法取样本个数最多的所对应的标签值,就是你将会与X之后的朋友关系,然后你就可以选择要不要和他/她继续相处了。
只是随意找几个特征是否合适呢,该怎样找更好的特征呢?
只给特征打分是否合适呢?比如本性可以进行分类,善良、冷漠、自私...
是否可以从样本集中提取出自己的特征向量呢?
与KNN算法相关的内容还有以下,后期补充:
加权K近邻
K近邻搜索
度量学习