K-近邻算法

本文详细介绍了K-近邻(KNN)算法,包括算法特点、分类问题解决方法、KNN算法原理、sklearn库中的应用以及数据集划分、模型评估、归一化和超参数调优。KNN算法是一种简单有效的分类算法,适用于解决分类问题,通过计算样本间的距离找到最近的K个邻居来预测未知样本的类别。文章还探讨了如何在sklearn中实现KNN算法,以及使用GridSearchCV进行超参数搜索和交叉验证。同时,强调了数据预处理的重要性,如归一化和标准化,以避免特征量纲差异对模型的影响。

K-近邻算法

1.1 什么是K-近邻(KNN)算法

学习目标

  • 知道什么是K近邻算法,及其特点
  • 掌握K-近邻算法的基本原理

1 K近邻算法的特点

  • k-近邻算法,也叫KNN算法(K-Nearest Neihbor,KNN),是一个非常适合入门的算法,拥有如下特性:
    • 适用于分类问题,尤其是二分类,当然也可以用来预测回归问题
    • 思想极度简单,应用数学知识少(近乎为零)
      • 对于很多不擅长数学的小伙伴十分友好,KNN算法几乎用不到数学专业知识
      • 机器学习算法的hello world算法
    • 效果好
      • 虽然算法简单,但效果也不错
      • 缺点也是存在的,后面会进行讲解
      • 作为第一个算法,首先归纳总结下解决监督学习中分类问题的一般方法和步骤。

2 解决分类问题的一般方法

根据目标的不同将监督学习任务分为了分类预测问题及回归预测问题。

监督学习任务的基本流程和架构:

(1)首先准备数据,可以是视频、音频、文本、图片等等

(2)抽取所需要的一些列特征,形成特征向量(Feature Vectors)

(3)将这些特征向量连同标记(Label)一并送人机器学习算法中,训练出一个预测模型(Predictive Model)

(4)然后,采用同样的特征提取方法作用于新数据,得到用于测试的特征向量

(5)接下来,使用预测模型对这些待测的特征向量进行预测并得到结果(Expected Model)

(6)最后,评估模型的准确性

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WYurShln-1632790931641)(./img/e5b43be5c96c33382005f5d21745c3c0.jpg)]

注:分类是常见的监督学习问题,最基础的就是二分类问题,即判断是非,从两个类别中选择一个作为预测结果。

3 什么是K-近邻算法

  • 上图中的数据点是分布在一个特征空间中
    • 横轴表示肿瘤大小,纵轴表示发现时间
    • 恶性肿瘤用蓝色表示,良性肿瘤用红色表示
    • 新来了一个病人(下图绿色的点),如何判断新来的病人(即绿色点)是良性肿瘤还是恶性肿瘤?
  • k-近邻算法的做法如下:

    • 取一个值k=3(k值后面介绍,现在可以理解为算法的使用者根据经验取的最优值)

    • 在所有的点中找到距离绿色点最近的三个点

    • 让最近的点所属的类别进行投票

      • 最近的三个点都是蓝色的,所以该病人对应的应该也是蓝色,即恶性肿瘤。
  • 本质:如两个样本足够相似,那他们两个大概率属于同一类别

    • 选择K个样本判断相似:如果只看一个已知样本,可能不准确
    • 如果K个样本中大多数属于同一个类别,则被预测的样本就很可能属于对应的类别
    • 如何衡量“相似性”:依靠距离衡量
  • 再举例:

    • 上图中和绿色的点距离最近的点包含两个红色和一个蓝色,此处红色点和蓝色点的数量比为2:1,则绿色点为红色的概率最大,最后判断结果为良性肿瘤。

通过上述例子不难发现,K近邻算法善于解决监督学习中的分类问题

小结

  • K-近邻算法属于哪类算法?可以用来解决监督学习中的分类问题

  • 算法的思想:通过K个最近的已知分类的样本来判断未知样本的类别

1.2 K-近邻算法实现分类

学习目标

  • 掌握K近邻算法中,距离计算的方法

1 绘制基本图像

import numpy as np
import matplotlib.pyplot as plt

#定义特征值
raw_data_x=[[3.3144558 , 2.33542461],
       [3.75497175, 1.93856648],
       [1.38327539, 3.38724496],
       [3.09203999, 4.47090056],
       [2.58593831, 2.13055653],
       [7.41206251, 4.80305318],
       [5.912852  , 3.72918089],
       [9.21547627, 2.8132231 ],
       [7.36039738, 3.35043406],
       [7.13698009, 0.40130301]]

#定义目标值
raw_data_y=[0,0,0,0,0,1,1,1,1,1]

X_train = np.array(raw_data_x)
y_train = np.array(raw_data_y)

#利用matplotlib绘制图像
plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='g')
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='r')
plt.show()

2 加入预测点,绘制图像

x=np.array([8.093607318,3.365731514])

plt.scatter(X_train[y_train==0,0],X_train[y_train==0,1],color='g')
plt.scatter(X_train[y_train==1,0],X_train[y_train==1,1],color='r')
plt.scatter(x[0],x[1],color='b')
plt.show()
  • 预测蓝色点属于哪一个类别,需要找到距离蓝色点最近的K个邻居,找到K个邻居需要计算距离:

    • 欧式距离:任意空间下两个点的对应维度的坐标值相减的平方和再开方

    • 欧式距离公式:

      • 平面中两点之间的欧式距离:

        ( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 \Large \sqrt{(x^{(a)}-x^{(b)})^2+(y^{(a)}-y^{(b)})^2} (x(a)x(b))2+(y(a)y(b))2

      • 立体中两点之间的距离:

        ( x ( a ) − x ( b ) ) 2 + ( y ( a ) − y ( b ) ) 2 + ( z ( a ) − z ( b ) ) 2 \Large \sqrt{(x^{(a)}-x^{(b)})^2+(y^{(a)}-y^{(b)})^2+(z^{(a)}-z^{(b)})^2} (x(a)x(b))2+(y(a)y(b))2+(z(a)z(b))2

      • 任意维度下的欧拉距离:

        ( x 1 ( a ) − x 1 ( b ) ) 2 + ( x 2 ( a ) − x 2 ( b ) ) 2 + . . . + ( x n ( a ) − x n ( b ) ) 2 \Large \sqrt{(x_{1}^{(a)}-x_{1}^{(b)})^2+(x_{2}^{(a)}-x_{2}^{(b)})^2+...+(x_{n}^{(a)}-x_{n}^{(b)})^2} (x1(a)x1(b)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值