当前位置: 首页 > news >正文

机器学习算法——KNN

一、KNN算法简介

1.KNN思想

(1)K-近邻算法

  • 根据你的“邻居”来推断你是什么类别

  • KNN算法思想:如果一个样本在特征空间(训练集)中的k个最相似的样本中的大多数属于某一个类别。则该样本也属于这个类别

(2)样本相似性

  • 样本都是属于一个任务数据集的,样本距离越近则越相似

  • 计算样本距离

    • 欧氏距离: ∑ i = 1 n ( x i − y i ) 2 \sqrt{\sum_{i=1}^n(x_i-y_i)^2} i=1n(xiyi)2

(3)分类问题处理流程

  • 距离计算: 使用欧氏距离计算未知样本到每个训练样本的距离
  • 排序规则: 将所有训练样本按距离从小到大排序
  • K值选择: 选取距离最近的K个样本(K值由程序员预先设定)
  • 表决机制: 统计K个样本中多数类别,将该类别作为未知样本的预测结果

(4)回归问题处理流程

  • 距离计算: 使用欧氏距离计算未知样本到每个训练样本的距离
  • 排序规则: 将所有训练样本按距离从小到大排序
  • K值选择: 选取距离最近的K个样本(K值由程序员预先设定)
  • 表决机制: 对K个样本的标签值(目标值)取平均值,作为未知样本预测的值

(5)K值设置

a. K值过小
  • 异常值敏感:当K=1时,若最近邻是异常值,预测结果会完全错误
  • 模型复杂度:K值减小会使模型变复杂,容易发生过拟合
  • 学习偏差:会学到训练集中不该学的噪声特征,如当K=1时可能错误学习异常点的特征
b. K值过大
  • 样本均衡问题:当K=N(训练样本总数)时,预测结果总是训练集中最多的类别
  • 模型简化:K值增大会使模型变得过于简单,导致欠拟合
c. K值选择的经验法则
  • 二分类问题:避免选择2的倍数(如2、4等)
  • 三分类问题:避免选择3的倍数(如3、6等)
  • 五分类问题:避免选择5的倍数
d. K值调优方法

交叉验证网格搜索

  • 通用方法:适用于所有算法的超参数调优
  • 实现方式:通过交叉验证评估不同K值表现,网格搜索寻找最优参数
  • 注意事项:调优过程需考虑计算成本与模型性能的平衡

二、KNN算法API

1.KNN分类API

# 1.工具包
from sklearn.neighbors import KNeighborsClassifier# 2.数据(特征处理)
x = [[0],[1],[2],[3],[4]]
y = [0,0,1,1,1]# 3.实例化
model = KNeighborsClassifier(n_neighbors=3) # 二分类,避免设置成2的倍数# 4.训练
model.fit(x,y)# 5.预测
print(model.predict([[5]])) # 输出[1]
  • 多维特征处理

    • 特征可以是任意维度,如三维特征:  X = [ [ 0 , 2 , 3 ] , [ 1 , 3 , 4 ] , [ 3 , 5 , 6 ] ] X=[[0,2,3],[1,3,4],[3,5,6]] X=[[0,2,3],[1,3,4],[3,5,6]]
    • 预测时输入特征维度必须与训练数据一致
  • 变量命名:

    • 模型实例可命名为estimator或model
    • 预测结果通常保存到变量如myret
  • 注意事项

    • 分类和回归使用不同API,不能混用
    • 输入数据必须是二维数组格式,即使单个样本也要用双层括号
    • 特征工程可以插入在数据准备和模型训练之间
    • 预测结果打印使用print函数查看

2.KNN回归API

# 1.工具包
from sklearn.neighbors import KNeighborsRegressor# 2.数据(特征工程)
x = [[0],[1],[2],[3]]
y = [0.1,0.2,0.3,0.4]  # 目标值是连续的# 3.实例化
model = KNeighborRegressor(n_neighbors=3)# 4.训练
model.fit(x,y)# 5.预测
print(model.predict([[5]])) # 输出[0.3]

三、距离度量

1.欧氏距离

∑ i = 1 n ( x i − y i ) 2 \sqrt{\sum_{i=1}^n(x_i-y_i)^2} i=1n(xiyi)2

2.曼哈顿距离

  • 别称:城市街区距离(City Block distance)
  • 几何意义:在横平竖直的街区道路中,从一个点到另一个点需要行走的最短路径长度
  • 二维公式:点 a ( x 1 , y 1 ) a(x1,y1) a(x1,y1) b ( x 2 , y 2 ) b(x2,y2) b(x2,y2)间距离为 d 12 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d_{12}=|x_1-x_2|+|y_1-y_2| d12=x1x2+y1y2
  • n维公式: d = ∑ n ∣ x i − x j ∣ d=\sum^n|x_i-x_j| d=nxixj
  • 计算原理:对应坐标相减取绝对值后求和

3.切比雪夫距离

  • 计算公式: 二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1) b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2)间的切比雪夫距离为

    d 12 = max ⁡ ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) d_{12} = \max(|x_1 - x_2|, |y_1 - y_2|) d12=max(x1x2,y1y2)

  • 移动特性: 相比只能沿 x y xy xy方向走的曼哈顿距离,切比雪夫距离允许沿45度对角线方向移动,这是其核心改变。

4.闵可夫斯基距离

    • 统一形式:可将欧氏距离和曼哈顿距离统一为闵可夫斯基距离

      d 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ p p d_{12} = \sqrt[p]{\sum_{k=1}^n |x_{1k}-x_{2k}|^p} d12=pk=1nx1kx2kp

    • 参数关系:

      • p = 1 p=1 p=1时为曼哈顿距离
      • p = 2 p=2 p=2时为欧氏距离
      • p → ∞ p\to\infty p时为切比雪夫距离

5.其他距离

余弦距离、马式距离(不通用)

四、特征预处理

1.原因

当特征的单位或大小相差较大,或某特征的方差比其他特征大出几个数量级时,会影响(支配)目标结果,使模型无法有效学习其他特征。

2.归一化

  • 定义:将原始数据通过线性变换映射到指定范围(默认[0,1])的方法。

  • 基本公式: ⁡ X ′ = x − min ⁡ max ⁡ − min ⁡ ⁡X^{\prime} = \frac{x - \min}{\max - \min} X=maxminxmin

  • 扩展公式:若需映射到 [ m i , m x ] [mi,mx] [mi,mx]范围,则

    X ′ ′ = X ′ ∗ ( m x − m i ) + m i X^{\prime\prime} = X^{\prime} * (mx - mi) + mi X′′=X(mxmi)+mi

  • 特点与适用场景

    • 异常值敏感:受最大值最小值影响大,若存在异常值(如年龄特征出现200岁)会显著影响归一化结果。
    • 适用场景:适合取值范围固定且无异常值的数据(如图像像素值固定为0-255)。
    • 不适用场景:不适合大规模数据或存在异常值的情况。
  • API

# 1.导入工具包
from sklearn.preprocessing import MinMaxScaler# 2.数据(只有特征)
x = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]# 3.实例化
process = MinMaxScaler()# 4.fit_transform处理
data = process.fit_transform(x)

3.标准化

  • 通过对原始数据进行标准化,转换为均值为0,标准差为1的标准正态分布的数据

  • 公式: x ′ = x − m e a n σ x^{\prime}=\frac{x-mean}{\sigma} x=σxmean σ 为特征的标准差 \sigma为特征的标准差 σ为特征的标准差

  • 少量的异常值对于平均值的形象并不大,鲁棒性更强,优先选择

  • API

# 1.导入工具包
from sklearn.preprocessing import StandardScaler# 2.数据(只有特征)
x = [[90,2,10,40],[60,4,15,45],[75,3,13,46]]# 3.实例化
process = StandardScaler()# 4.fit_transform处理
data = process.fit_transform(x)print(data)
print(process.mean_)
print(process.var_)

五、超参数选择

1.交叉验证

  • 核心思想: 将训练集划分为n份,每次取1份作为验证集,其余n-1份作为训练集,循环n次
  • 验证集作用: 与测试集功能相同,用于评估模型效果
  • 折数命名: 根据划分份数称为n折交叉验证(如4份即四折交叉验证)
  • 评估方式: 取多次验证结果的平均值作为最终模型评分,比单次划分更可靠

2.网格搜索

  • 产生背景: 模型存在多个需人工设置的超参数(如KNN的k值),不同参数组合效果差异大
  • 工作原理:
    • 预设参数候选值(如k=3,4,5,6)
    • 对每个参数组合进行交叉验证评估
    • 自动选择最优参数组合(如k=5时准确率86%最高)
  • 优势特点: 避免手动调参的低效,自动完成参数组合、训练、评估全流程

3.联系

  • 关键区别:
    • 交叉验证是数据集划分方法
    • 网格搜索是参数优化工具
  • 最佳实践: 两者结合使用可形成完整的模型调优方案
  • 注意事项: 仅对需要人工设置的超参数使用该方法,模型自动学习的参数不适用
http://www.xdnf.cn/news/748351.html

相关文章:

  • vue3的watch用法
  • 树莓派PWM控制LED灯
  • 使用arthas热替换在线运行的java class文件
  • 描述性统计的可视化分析
  • Java弱引用与软引用的核心区别
  • ubuntu20.04.5-arm64版安装robotjs
  • 牛客周赛94
  • 使用Java实现简单的计算机案例
  • uv:一个现代化的 Python 依赖管理工具
  • AMBER软件介绍
  • JS和TS的区别
  • 姜老师MBTI课程:ISTP和ISFP
  • Vue事件处理
  • 【razor】采集模块设置了窗体句柄但并不能直接渲染
  • 《C 盘清理技巧分享》
  • 经济法-7-上市公司首次发行、配股增发条件
  • 【数据治理】要点整理-信息技术数据质量评价指标-GB/T36344-2018
  • 【数据集】30 m空间/1 h时间分辨率地表温度LST数据集
  • 投稿Cover Letter怎么写
  • C语言 — 自定义类型(结构体,联合体,枚举)
  • stm32默认复位刚开始由hsi作为主时钟源而后来才换成的pll
  • 【HTML-15.2】HTML表单按钮全面指南:从基础到高级实践
  • 第十四章 MQTT订阅
  • Wireshark 使用教程:让抓包不再神秘
  • 2025最新版在Windows上安装Redis(仅限开发环境)
  • 【Netty系列】Protobuf编码解码:客户端、服务端
  • 【判断数字递增】2021-12-19
  • C++:指针(Pointers)
  • 11.3JVM调优
  • 零基础SEO优化操作全解析