# K最近邻算法

## 应用场景

1. 分类。推荐系统的设计，比如电影推荐系统，淘宝购物推荐系统，总之应用广泛，常用于分类，比如将人群分类，构建用户画像；
2. 回归。面包店明天应该做多少个面包？利用明天的特征来算出一个数字。
3. OCR，光学字符识别，提取特征，找出最近的邻居。
4. 垃圾邮件过滤。用到的算法是朴素贝叶斯分类器。

![](https://3953159057-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_oS8XWzoA34pjHOQZS%2F-LbkVY-uWFvKKzmXJMC4%2F-LbkWIyCl7Mv_LYBrf-K%2Fimage.png?alt=media\&token=4ec72f5f-dbf6-4077-a2e8-435b688760b7)

### 特征抽取

在前面的图表中，相似的用户相距较近，但如何确定两位 用户的相似程度呢？这就需要用到特征抽取了。

![](https://3953159057-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_oS8XWzoA34pjHOQZS%2F-LbkVY-uWFvKKzmXJMC4%2F-LbkWiA3nQjr0ULL5vWB%2Fimage.png?alt=media\&token=0228046d-af06-47cb-986b-ee95de937750)

对每种类型的喜好都对应着特定的数字，然后每个人都对应着五个数字，之后就可以利用距离公式，计算并表示出人与人之间的相似程度。

![](https://3953159057-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-L_oS8XWzoA34pjHOQZS%2F-LbkVY-uWFvKKzmXJMC4%2F-LbkX4As2FbFGfgCCRpW%2Fimage.png?alt=media\&token=fa500895-7fed-4271-80a1-66a0f5f4dfba)

### 回归

假设你不仅要向Priyanka推荐电影，还要预测她将给这部电影打多少分。为此，先找出与她 最近的5个人。 顺便说一句，我老说最近的5个人，其实并非一定要选择5个最近的邻居，也可选择2个、10 个或10 000个。这就是这种算法名为K最近邻而不是5最近邻的原因！

你求这些人打的分的平均值，结果为4.2。这就是回归（regression）。你将使用KNN来做两项 基本工作——分类和回归：

1. 分类就是编组；
2. 回归就是预测结果（如一个数字）。

### 挑选合适的特征

使用KNN时，挑选合适的特征进行比较至关重要。所谓合适的特 征，就是：&#x20;

1. 与要推荐的电影紧密相关的特征；&#x20;
2. 不偏不倚的特征（例如，如果只让用户给喜剧片打分，就无法判断他们是否喜欢动作片）。

### 余弦相似度

余弦相似度 前面计算两位用户的距离时，使用的都是距离公式。还有更合适的公式吗？在实际工作中， 经常使用余弦相似度（cosine similarity）。假设有两位品味类似的用户，但其中一位打分时更 保守。他们都很喜欢Manmohan Desai的电影Amar Akbar Anthony，但Paul给了5星，而Rowan只 给4星。如果你使用距离公式，这两位用户可能不是邻居，虽然他们的品味非常接近。 余弦相似度不计算两个矢量的距离，而比较它们的角度，因此更适合处理前面所说的情况。 本书不讨论余弦相似度，但如果你要使用KNN，就一定要研究研究它！

### 小结

KNN用于分类和回归，需要考虑最近的邻居。&#x20;

1. 分类就是编组。&#x20;
2. 回归就是预测结果（如数字）。&#x20;
3. 特征抽取意味着将物品（如水果或用户）转换为一系列可比较的数字。
4. 能否挑选合适的特征事关KNN算法的成败。
