机器学习算法——系统性的学会使用 K近邻算法(KNN)

目录

1、K-近邻算法简介

1.1 什么是K-近邻算法

下图所示,根据“邻居”来推断出你的类别,也就是说,根据邻居相隔的远近距离,来判断你所在的地区,离得越近的,则和你的类别就越相近。

在这里插入图片描述

1.2 K-近邻算法(KNN)概念

K Nearest Neighbor算法又叫KNN算法,这个算法是机器学习里面一个比较经典的算法, 总体来说KNN算法是相对比较容易理解的算法.

  • (1)定义:

    • 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

来源:KNN算法最早是由Cover和Hart提出的一种分类算法

  • (2)距离公式:

    • 两个样本的距离可以通过如下公式计算,又叫欧式距离 ,关于距离公式会在后面进行讨论 。
      在这里插入图片描述
      在这里插入图片描述

下面看一个例子说明。

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.51)
经计算得:
d =   2.2361    4.4721    6.7082    2.2361    4.4721    2.2361

2.2361是通过:(1-2)/0.5再平方+(1-2)/1再平方=5,再开根号得到。

3.6 余弦距离(Cosine Distance)

几何中,夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。

  • 二维空间中向量A(x1,y1)与向量B(x2,y2)的夹角余弦公式:
    在这里插入图片描述
  • 两个n维样本点a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夹角余弦为:
    在这里插入图片描述
    即:
    在这里插入图片描述
    夹角余弦取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。

举例:

X=[[1,1],[1,2],[2,5],[1,-4]]
经计算得:
d =   0.9487    0.9191   -0.5145    0.9965   -0.7593   -0.8107

3.7 汉明距离(Hamming Distance):

两个等长字符串s1与s2的汉明距离为:将其中一个变为另外一个所需要作的最小字符替换次数。

例如:

 The Hamming distance between "1011101" and "1001001" is 2. 
 The Hamming distance between "2143896" and "2233796" is 3. 
 The Hamming distance between "toned" and "roses" is 3.

在这里插入图片描述

求下列字符串的汉明距离:

  10111011001001  

  21438962233796 
 
  irie与 rise

汉明重量:是字符串相对于同样长度的零字符串的汉明距离,也就是说,它是字符串中非零的元素个数:对于二进制字符串来说,就是 1 的个数,所以 11101 的汉明重量是 4。因此,如果向量空间中的元素a和b之间的汉明距离等于它们汉明重量的差a-b。

应用:汉明重量分析在包括信息论、编码理论、密码学等领域都有应用。比如在信息编码过程中,为了增强容错性,应使得编码间的最小汉明距离尽可能大。但是,如果要比较两个不同长度的字符串,不仅要进行替换,而且要进行插入与删除的运算,在这种场合下,通常使用更加复杂的编辑距离等算法。

举例:

X=[[0,1,1],[1,1,2],[1,5,2]]
注:以下计算方式中,把2个向量之间的汉明距离定义为2个向量不同的分量所占的百分比。

经计算得:
d =   0.6667    1.0000    0.3333

3.8 杰卡德距离(Jaccard Distance):

杰卡德相似系数(Jaccard similarity coefficient):两个集合A和B的交集元素在A,B的并集中所占的比例,称为两个集合的杰卡德相似系数,用符号J(A,B)表示:
在这里插入图片描述
杰卡德距离(Jaccard Distance):与杰卡德相似系数相反,用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度:
在这里插入图片描述
举例:

X=[[1,1,0][1,-1,0],[-1,1,0]]
注:以下计算中,把杰卡德距离定义为不同的维度的个数占“非全零维度”
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值