算法图解之Swift实践【第十章 K最近邻算法】

174 阅读4分钟

本人已参与「新人创作礼」活动,一起开启掘金创作之路。

概念

K最近邻算法(KNN:K-Nearest Neighbours),是根据K个最近邻居的属性来认定该节点的属性的一种算法。 KNN是一个理论上比较成熟的、也是最简单的机器学习算法之一。

核心思想

一个样本与数据集中的k个样本最相似, 如果这k个样本中的大多数属于某一个类别, 则该样本也属于这个类别。 也就是说,该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法在类别决策时,只与极少量的相邻样本有关。

特征提取

由于KNN算法依赖距离的计算,所以必须将节点的属性特征提取为数字,并计算他们的距离。

计算距离的公式为欧氏距离:i=1n(xiyi)2 \sqrt{\sum_{i=1}n(x_i-y_i)2} 。其中n为特征维数,x,y为两个节点。

计算时,通过欧氏距离选取出离目标节点最近的节点,就可以根据最近的k个节点来为目标节点提供参考。

回归

KNN的两项基本工作是分类回归

  • 分类就是编组;
  • 回归就是预测结果。

余弦相似度:在实际工作中,计算距离的方式不仅仅有欧式距离,还会经常使用余弦相似度(cosine similarity)。 余弦相似度不计算两个矢量的距离,而比较它们的角度,对于属性相似,但数值不同的节点而言,他们也是相似的,但若以欧氏距离计算,他们将不是邻居。

小结

  • KNN用于分类和回归,需要考虑最近的邻居。
  • 分类就是编组。
  • 回归就是预测结果(如数字)。
  • 特征抽取意味着将物品(如水果或用户)转换为一系列可比较的数字。
  • 能否挑选合适的特征事关KNN算法的成败。

练习

10.1 在Netflix示例中,你使用距离公式计算两位用户的距离,但给电影打分时,每位用户的标准并不都相同。假设你有两位用户——Yogi和Pinky,他们欣赏电影的品味相同,但Yogi给喜欢的电影都打5分,而Pinky更挑剔,只给特别好的电影打5分。他们的品味一致,但根据距离算法,他们并非邻居。如何将这种评分方式的差异考虑进来呢。

可使用归一化(normalization)。你可计算每位用户的平均评分,并据此来调整用户的评分。例如,你可能发现Pinky的平均评分为星3,而Yogi的平均评分为3.5星。因此,你稍微调高Pinky的评分,使其平均评分也为3.5星。这样就能基于同样的标准比较他们的评分了。

10.2 假设Netflix指定了一组意见领袖。例如,Quentin Tarantino和Wes Anderson就是Netflix的意见领袖,因此他们的评分比普通用户更重要。请问你该如何修改推荐系统,使其偏重于意见领袖的评分呢?

可以给意见领袖分配权重,使其在统计k个邻居时获得更高的权重。如以5个邻居的喜好来统计目标节点的喜好,那么使意见领袖的喜好乘以3,再与其它4个邻居进行平均值计算。就可以使其更偏向于意见领袖的评分了。

9.3 Netflix的用户数以百万计,前面创建推荐系统时只考虑了5个最近的邻居,这是太多还是太少了呢?

太少了。这样的情况下,十分容易出现偏差。一个经验之谈是,如果有N个节点,那么考虑sqrt{N}个邻居。

应用于拓展

KNN算法的优缺点

优点:

  • 简单有效
  • 重新训练代价低
  • 算法复杂度低
  • 适合类域交叉样本
  • 适用大样本自动分类

缺点:

  • 惰性学习
  • 类别分类不标准化
  • 输出可解释性不强
  • 不均衡性
  • 计算量较大