机器学习入门 | 【01】K近邻算法

本文深入探讨了K近邻(KNN)算法,包括其基本原理、电影案例分析、API使用方法以及距离度量的各种类型如欧式、曼哈顿和切比雪夫距离。此外,还介绍了k值选择的重要性、kd树在提高搜索效率中的作用,并讲解了数据集处理、特征预处理和交叉验证的相关内容。KNN算法简单有效,但计算量大,对不均衡样本处理不佳。
摘要由CSDN通过智能技术生成

1、K近邻算法【通过你的邻居来判断你的类别】

1、简介

定义:若一个样本在特征空间中的k个最相似(近邻)的样本中的大多数属于一个类别,则该样本也属于该类别

近邻的计算距离公式欧式距离公式

在这里插入图片描述
在这里插入图片描述

2、电影案例分析

在这里插入图片描述

通过k近邻计算后可得出结果,但一个结果进行对比效果较差。所以选择5对其进行判断,即k的值

在这里插入图片描述

3、api的初步使用
3.1 一般的流程:
  • 获取数据
  • 数据处理
  • 特征工程
  • 机器学习
  • 型评估
3.2 sklearn模块介绍

安装pip install scikit-learn,前提需要有Numpymatplotlib以及Scipy

在这里插入图片描述

3.3 API的使用
# _*_ coding:utf-8 _*_
# @File  : KNNDemo.py
# @Author: Jxiepc
# @Time  : 2021-07-19 17:27
from sklearn.neighbors import KNeighborsClassifier

# 获取数据
x = [[2], [4], [5], [0], [0]]
y = [1, 1, 1, 0, 0]

# 实例化训练模型
# n_neighbors:结果与之最小的值的个数
estimator = KNeighborsClassifier(n_neighbors=2)

estimator.fit(x, y)

result = estimator.predict([[0]])
print(result)
3.4 距离度量
3.4.1 欧式距离【前面已提到】
3.4.2 曼哈顿距离

在曼哈顿街区要从一个十字路口开车到另一个十字路口, 驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离"。曼哈顿距离也称为城市街区距离(City Block distance)。

在这里插入图片描述
在这里插入图片描述

3.4.3 切比雪夫距离

国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。 国王从格子(x1,y1)走到格子(x2,y2)最少需要多少步?这个距离就叫切比雪夫距离

在这里插入图片描述

在这里插入图片描述

3.4.4 闵可夫斯基距离【一组距离的定义】

对多个距离度量公式的概括性表述。

补充

总结

  • 都存在前三个距离的缺点;
  • 将各个分量的量纲(单位)都相同看待了;
  • 未考虑各个分量(期望、方差)可能是不同的。
3.4.5 标准欧式距离
  • 针对欧式距离的缺点进行改进;
  • 先将各个分量都标准化到均值、方差相等

在这里插入图片描述

3.4.6 余弦距离

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

在这里插入图片描述

3.4.7汉明距离

一个字符串变成另外一个字符串需要的距离。把2个向量之间的汉明距离定义为2个向量不同的分量所占百分比。

在这里插入图片描述

3.4.8 杰卡德距离

杰卡德相似系数:俩个集合的交集并集中所占的比例J(集合1, 集合2)
杰卡德距离:与杰卡德相似系数相反,用俩个集合不同的元素相同元素的所占比例。

在这里插入图片描述

3.4.9 马氏距离

在这里插入图片描述

基于样本分布。由哈拉诺比斯提出,表示数据的协方差距离。有效计算俩个位置样本集的相似度方法;
与欧式距离不同,它考虑到各种特征之间的联系【独立于测量尺度】;

在这里插入图片描述

特性

  • 量纲无关,排除变量之间的相关性干扰;
  • 该计算是建立在总体样本的基础上;
  • 要求总体样本大于样本的维数。
4、k值的选择
  • k值过小:意味着整体模型变得复杂,易发生过拟合。
  • k值过大:整体的模型变简单。
  • 在实际应用中,k值一般取较小的数值,采用交叉验证将数据划分为训练集和验证集,来选择最优的K值。
  • 近似误差:(训练集)过小,造成过拟合现象。过现有数据可以很好预测,但对未知数据会有较大偏差。
  • 估计误差:(测试集)对未知数据有好的预测能力。
5、kd树【提高KNN搜索效率】
  • 根据KNN每次需要预测一个点时, 我们都需要计算训练数据集里每个点到这个点的距离,然后选出距离最近的k个点进行投票。当数据集很大时,这个计算成本非常高,针对N个样本,D个特征的数据集,其算法复杂度为O(DN^2^)
  • kd树:为了避免每次都重新计算一遍距离,算法会把距离信息保存在一棵树里, 这样在计算之前从树里查询距离信息,尽量避免重新计算。其基本原理是,如果A和B距离很远,B和C距离很近,那么A和C的距离也很远。有了这个信息,就可以在合适的时候跳过距离远的点。时间复杂度为O(DNlogN)。
5.1 原理

在这里插入图片描述

黄色点为根节点,之间的线为分割超平面。后不断的进行划分。

在这里插入图片描述

5.2 最近邻域搜索

一种对k维空间中实例点进行存储以便对其进行快速检索的树形数据结构。构建kd树相当于不断地用垂直于坐标轴的超平面将k维空间切分,构成一系列的k维超矩形区域。利用kd树可以省去对大部分数据点的搜索,从而减少搜索的计算量

5.3 构造方法
  • 构造根结点,使根结点对应于K维空间中包含所有实例点的超矩形区域;
  • 通过递归方法,对K维空间进行切分生成子结点;
  • 上述过程直到子区域内没有实例时终止(该结点为叶子结点)。将实例保存到相应的结点;
  • 且该kd树为平衡二叉树。
6、 案例分析
6.1 树的建立
  • 将点的坐标x轴排序;
  • 选取中间的数值将其划分;
  • 在对每个区域逐步划分。
7、数据集介绍
7.1 scikit-learn数据集API

sklearn.datasets:加载数据集;
sklearn.datasets.load_*():获取小规模数据集,数据包含在datasets;
sklearn.datasets.fetch_*(data_home=None):获取大规模数据集,第一个参数为下载目录。

7.2 scikit-learn大数据集

sklearn,datasets.fetch_20newsgroups(data_home=None, subset='train')

  • subsettrain、test、all要加载的数据集,默认为train
7.3 数据集返回值介绍

loadfetch返回的数据类型datasets.base.Bunch【字典】

  • data:特征数据数组,二维的ndarray
  • target:标签数组,二维的ndarray
  • DESCR:数据描述;
  • feature_names:特征名;
  • target_names:标签名。

获取方式可用.属性或者["属性"]

8、数据集的划分
8.1 划分为俩个部分
  • 训练数据:用于训练,构建模型;
  • 测试数据:检验以及评估模型。
8.2 api的使用

sklearn.model_selection.train_test.split(arrays, *options)

  • x数据集的特征值
  • y数据集的标签纸
  • test_size:【float】测试集的大小;
  • random_state:随机种子,相同的种子采样结果相同;
  • return:测试集特征 训练集特征 训练标签 测试标签。
9、特征预处理
9.1 定义
  • 通过一些转换函数将特征数据转化成更加合适的算法模型。
  • 包含归一化标准化

在这里插入图片描述

为何要归一化和标准化?

特征的单位或者大小相差较大,或者某特征的方差相比其他的特征要大出几个数量级,易影响目标结果。将特征转化在0~1之间。

9.2 预处理API sklearn.preprossing
9.3 归一化

定义:通过原始数据进行变换把数据映射到0~1间。

公式

在这里插入图片描述

APIsklearn.preprossing.MinMaxScaler(feature_range=(0,1))

  • feature_range:设置转换后数值的区间;
    • .fit_transform(X):X为ndarray数据类型;
  • 返回值:转换后的相同形式的array。

存在问题

数据中异常点较多,会受影响。

在这里插入图片描述

总结

方法鲁棒性【稳定性】较差,只适合传统精确小数据场景。

9.4 标准化

定义:通过原始数据进行变换把数据变换到均值0,标准差为1范围内。

异常点优化:若有异常点,且有一定的数据量,少量异常点对于平均值的影响并不大,从而方差改变较小

APIsklearn.preprossing.StandarScaler()

  • 处理后每列来说所有数据都聚集在均值0附近标准差差为1;
  • fit_trainsform(X):X为ndarray类型;
  • 返回值:转换后的相同形式的array。

总结

  • 异常值影响较小;
  • 适合现代嘈杂大数据场景。
10、交叉验证
10.1 初步介绍
  • 分割方式:
    • 训练集:训练集、验证集;
    • 测试集:测试集。
  • 为了让被评估的模型更加准确;

在这里插入图片描述

10.2 API

sklearn.model_selection.GridSearchCV(estimator, param_gid=None, cv=None):对估计器的指定参数值进行详尽搜索;

  • estimator:估计器对象;
  • param_grid{"n_neighbors": [1, 3, 5...]}
  • cv:指定几折交叉验证;
  • fit:输入训练数据;
  • score:准确率;
  • 结果分析:
    • bestscore_:交叉验证中的最好结果;
    • bestestmator:最好的参数模型;
    • cvresult:每次交叉验证后的验证集准确率结果和训练准确率即通过。
11、总结
11.1 优点
  • 简单有效;
  • 重新训练的代价低;
  • 适合类域交叉样本;
  • 适合大样本自动分类。
11.2 缺点
  • 惰性学习;
  • 类别评分不是规格化;
  • 输出可解释性不强;
  • 对不均衡的样本不擅长;
  • 计算量较大。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jxiepc

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值