1、K-近邻算法简介
1.1 什么是K-近邻算法
下图所示,根据“邻居”来推断出你的类别,也就是说,根据邻居相隔的远近距离,来判断你所在的地区,离得越近的,则和你的类别就越相近。
1.2 K-近邻算法(KNN)概念
K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.
来源:KNN算法最早是由Cover和Hart提出的一种分类算法
下面看一个例子说明。
1.3 电影类型分析
假设我们现在有几部电影:
其中? 号电影不知道类别,如何去预测?我们可以利用K近邻算法的思想,如下让序号1-8分别于9做距离计算:
分别计算每个电影和被预测电影的距离,然后求解:
上面我们得到了每个电影和要预测电影的距离,我们选出最近的5(即k=5)来判断,显然我们可以得出9这个序号的电影属于“喜剧片”,这个就是KNN算法。
1.4 KNN算法流程总结
1)计算已知类别数据集中的点与当前点之间的距离
2)按距离递增次序排序
3)选取与当前点距离最小的k个点
4)统计前k个点所在的类别出现的频率
5)返回前k个点出现频率最高的类别作为当前点的预测分类
2、k近邻算法api初步使用
机器学习流程:
- 1.获取数据集
- 2.数据基本处理
- 3.特征工程
- 4.机器学习
- 5.模型评估
2.1 Scikit-learn工具介绍
- Python语言的机器学习工具
- Scikit-learn包括许多知名的机器学习算法的实现
- Scikit-learn文档完善,容易上手,丰富的API
2.1.1 安装
pip install scikit-learn
安装好之后可以通过以下命令查看是否安装成功
import sklearn
- 注:安装scikit-learn需要Numpy, Scipy等库
2.1.2 Scikit-learn包含的内容
- 分类、聚类、回归
- 特征工程
- 模型选择、调优
2.2 K-近邻算法API
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5)
- n_neighbors:int,可选(默认= 5),k_neighbors查询默认使用的邻居数
下面通过一个简单的例子来看看API怎么用。
2.3 案例
2.3.1 步骤分析
- 1.获取数据集
- 2.数据基本处理(该案例中省略)
- 3.特征工程(该案例中省略)
- 4.机器学习
- 5.模型评估(该案例中省略)
2.3.2 代码过程
- 导入模块
from sklearn.neighbors import KNeighborsClassifier
- 构造数据集
x = [[0], [1], [10], [20]]
y = [0, 0, 1, 1]
- 机器学习 – 模型训练
# 实例化API
estimator = KNeighborsClassifier(n_neighbors=2)
# 使用fit方法进行训练
estimator.fit(x, y)
ret = estimator.predict([[1]])
print(ret) # 离1近,故预测为0
ret = estimator.predict([[7]])
print(ret) # 离10近,故预测为1
问题:
-
1.距离公式,除了欧式距离,还有哪些距离公式可以使用?
-
2.选取K值的大小?
-
3.api中其他参数的具体含义?
3、距离度量
3.1 欧式距离(Euclidean Distance):
欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。
举例:
X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 1.4142 2.8284 4.2426 1.4142 2.8284 1.4142
3.2 曼哈顿距离(Manhattan Distance):
在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”(City Block distance)。
举例:
X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 2 4 6 2 4 2
3.3 切比雪夫距离 (Chebyshev Distance):
国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离。
举例:
X=[[1,1],[2,2],[3,3],[4,4]];
经计算得:
d = 1 2 3 1 2 1
3.4 闵可夫斯基距离(Minkowski Distance):
闵氏距离不是一种距离,而是一组距离的定义,是对多个距离度量公式的概括性的表述。
两个n维变量a(x11,x12,…,x1n)与b(x21,x22,…,x2n)间的闵可夫斯基距离定义为:
其中p是一个变参数:
-
当p=1时,就是曼哈顿距离;
-
当p=2时,就是欧氏距离;
-
当p→∞时,就是切比雪夫距离。
根据p的不同,闵氏距离可以表示某一类/种的距离。
小结:
1 闵氏距离,包括曼哈顿距离、欧氏距离和切比雪夫距离都存在明显的缺点:
e.g. 二维样本(身高[单位:cm],体重[单位:kg]),现有三个样本:a(180,50),b(190,50),c(180,60)。
a与b的闵氏距离(无论是曼哈顿距离、欧氏距离或切比雪夫距离)等于a与c的闵氏距离。但实际上身高的10cm并不能和体重的10kg划等号。
2 闵氏距离的缺点:
(1)将各个分量的量纲(scale),也就是“单位”相同的看待了;
(2)未考虑各个分量的分布(期望,方差等)可能是不同的。
针对上述的缺点,下面进行纠正:
3.5 标准化欧氏距离 (Standardized EuclideanDistance):
标准化欧氏距离是针对欧氏距离的缺点而做的一种改进。
思路:既然数据各维分量的分布不一样,那先将各个分量都“标准化”到均值、方差相等。
- S k S_k Sk 表示各个维度的标准差
如果将方差的倒数看成一个权重,也可称之为加权欧氏距离(Weighted Euclidean distance)。
举例:
X=[[1,1],[2,2],[3,3],[4,4]];(假设两个分量的标准差分别为0.5和1)
经计算得:
d = 2.2361 4.4721 6.7082 2.2361 4.4721 2.2361
2.2361