人工智能-机器学习(二)——KNN 算法核心知识体系

目录

  1. KNN 算法简介(思想 + 分类 / 回归流程)
  2. KNN 算法 API 介绍(分类 + 回归实现)
  3. 距离度量(常用距离计算方法)
  4. 特征预处理(归一化 + 标准化)

1. KNN 算法简介

1.1 学习目标

  1. 理解 K 近邻(KNN)算法的核心思想
  2. 掌握 KNN 分类问题的处理流程
  3. 掌握 KNN 回归问题的处理流程

1.2 核心内容

1.2.1 KNN 算法思想
  • 定义:K 近邻算法(K Nearest Neighbor,KNN)是一种 “基于相似性” 的算法,核心逻辑是 “看邻居定类别 / 值”——

若一个样本在特征空间中,其最相似的k 个训练样本(邻居)中,大多数属于某类别(分类)或平均值为某值(回归),则该样本也归为此类别 / 值。

  • 关键问题:样本相似性通过 “距离” 衡量(默认欧氏距离,详见第 3 章)。
  • 解决问题:同时支持分类问题(如 “判断邮件是否为垃圾邮件”)和回归问题(如 “预测房屋价格”)。
1.2.2 KNN 分类流程(5 步)
  1. 计算未知样本到每一个训练样本的距离(如欧氏距离);
  2. 将所有训练样本按 “距离从小到大” 升序排列;
  3. 从排序结果中,取出距离最近的k 个训练样本(k 为超参数,默认 5);
  4. 对这 k 个样本进行 “多数表决”:统计每个类别的样本数量;
  5. 未知样本归属到 “数量最多的类别”。
1.2.3 KNN 回归流程(5 步)
  1. 计算未知样本到每一个训练样本的距离(与分类一致);
  2. 将所有训练样本按 “距离从小到大” 升序排列;
  3. 取出距离最近的k 个训练样本
  4. 计算这 k 个样本的 “目标值平均值”;
  5. 该平均值即为未知样本的预测值。

1.3 小总结

  1. 核心思想:近朱者赤,近墨者黑(通过 k 个邻居推断样本属性);
  2. 分类靠 “多数表决”,回归靠 “均值计算”;
  3. 距离计算是核心(决定邻居是谁),k 值是关键超参数(影响结果)。

2. KNN 算法 API 介绍

2.1 学习目标

  1. 掌握 KNN 分类问题的 API 调用方法
  2. 掌握 KNN 回归问题的 API 调用方法

2.2 核心内容(基于 scikit-learn)

2.2.1 KNN 分类 API
  • 类名sklearn.neighbors.KNeighborsClassifier
  • 关键参数

n_neighbors:int 类型,可选(默认 = 5)—— 指定 “邻居数量 k”。

  • 核心方法

fit(X, y):用训练数据(X = 特征,y = 标签)训练模型;

predict(X):用训练好的模型预测未知样本(X = 未知样本特征),返回预测标签。

  • 代码示例

from sklearn.neighbors import KNeighborsClassifier

def knn_classification_demo():

    # 1. 准备训练数据(特征X:单特征,标签y:二分类)

    X_train = [[0], [1], [2], [3]]  # 训练样本特征(如“考试分数”)

    y_train = [0, 0, 1, 1]          # 训练样本标签(如“是否及格”:0=不及格,1=及格)

    

    # 2. 初始化KNN分类器(k=1,取1个最近邻居)

    estimator = KNeighborsClassifier(n_neighbors=1)

    

    # 3. 训练模型

    estimator.fit(X_train, y_train)

    

    # 4. 预测未知样本(如“分数=4”)

    y_pred = estimator.predict([[4]])

    

    # 5. 输出结果(预期:[1],即“及格”)

    print("未知样本预测标签:", y_pred)

# 调用函数

knn_classification_demo()

2.2.2 KNN 回归 API
  • 类名sklearn.neighbors.KNeighborsRegressor
  • 关键参数

n_neighbors:int 类型,可选(默认 = 5)—— 指定 “邻居数量 k”(与分类一致)。

  • 核心方法

fit(X, y):用训练数据(X = 特征,y = 目标值)训练模型;

predict(X):预测未知样本,返回预测目标值(与分类不同,回归返回连续值)。

  • 代码示例

from sklearn.neighbors import KNeighborsRegressor

def knn_regression_demo():

    # 1. 准备训练数据(特征X:三维特征,目标值y:连续值)

    X_train = [[0, 0, 1], [1, 1, 0], [3, 10, 10], [4, 11, 12]]  # 如“面积、房龄、楼层”

    y_train = [0.1, 0.2, 0.3, 0.4]                              # 如“房屋单价(万元/㎡)”

    

    # 2. 初始化KNN回归器(k=2,取2个最近邻居)

    estimator = KNeighborsRegressor(n_neighbors=2)

    

    # 3. 训练模型

    estimator.fit(X_train, y_train)

    

    # 4. 预测未知样本(如“面积=3,房龄=11,楼层=10”)

    y_pred = estimator.predict([[3, 11, 10]])

    

    # 5. 输出结果(预期:(0.3+0.4)/2=0.35)

    print("未知样本预测目标值:", y_pred)

# 调用函数

knn_regression_demo()

2.3 小总结

  1. 分类用KNeighborsClassifier,返回离散标签;回归用KNeighborsRegressor,返回连续值;
  2. 核心参数n_neighbors(k 值)需手动指定,默认 5;
  3. 调用流程统一:初始化→训练(fit)→预测(predict)。

3. 距离度量

3.1 学习目标

  1. 掌握欧氏距离的计算方法
  2. 掌握曼哈顿距离的计算方法
  3. 了解切比雪夫距离的计算方法
  4. 了解闵可夫斯基距离的通用公式

3.2 核心内容(基于闵可夫斯基距离通用公式)

3.2.1 通用公式:闵可夫斯基距离

对于两个 d 维样本X_1=(x_{11},x_{12},...,x_{1d})X_2=(x_{21},x_{22},...,x_{2d}),闵可夫斯基距离公式为:

d(X_1,X_2) = \left( \sum_{k=1}^d |x_{1k} - x_{2k}|^p \right)^{\frac{1}{p}}

其中,p为 “距离参数”,不同p对应不同距离类型。

3.2.2 常用距离类型(p 值对应)

距离类型

p 值

公式(d 维样本)

通俗理解

适用场景

曼哈顿距离

p=1

d = \sum_{k=1}^d (x_{1k} - x_{2k})

x_{1k} - x_{2k}

$

欧氏距离

p=2

d = \sqrt{\sum_{k=1}^d (x_{1k} - x_{2k})^2}

“直线距离”(两点之间最短路径)

大多数连续特征场景(如 KNN 默认)

切比雪夫距离

p→∞

3.2.3 示例计算(以 2 维样本为例)

设样本X_1=(1,2),X_2=(4,6):

  • 曼哈顿距离(p=1):|1-4| + |2-6| = 3 + 4 = 7;
  • 欧氏距离(p=2):\sqrt{(1-4)^2 + (2-6)^2} = \sqrt{9 + 16} = 5
  • 切比雪夫距离(p→∞):\max(|1-4|, |2-6|) = \max(3,4) = 4

3.3 小总结

  1. 闵可夫斯基距离是 “距离家族” 的通用公式,p 值决定具体类型;
  2. KNN 默认用欧氏距离(p=2),需根据场景调整(如城市数据用曼哈顿距离);
  3. 距离计算受特征单位影响(如 “身高(m)” 和 “体重(kg)”),需先做特征预处理(详见第 4 章)。

4. 特征预处理

4.1 学习目标

  1. 知道特征预处理(归一化 / 标准化)的必要性
  2. 会用归一化 API 处理数据
  3. 会用标准化 API 处理数据
  4. 理解归一化与标准化的适用场景

4.2 核心内容

4.2.1 为什么需要预处理?

特征单位 / 量级差异会 “支配” 距离计算,导致模型忽略小量级特征。

  • 示例:特征 “身高(m,1.7 左右)”“体重(kg,70 左右)”“视力(0.2-2.0)”——

体重的量级(70)远大于视力(2.0),计算距离时,体重差异会主导结果,视力的影响被忽略,导致模型偏差。

4.2.2 归一化(Min-Max Scaling)
  • 定义:将原始数据映射到指定区间(默认 [0,1]),公式为:

x_{new} = \frac{x_{old} - x_{min}}{x_{max} - x_{min}} \times (mx - mi) + mi

其中,x_{min}= 特征最小值,x_{max}= 特征最大值,mi= 目标区间最小值(默认 0),mx= 目标区间最大值(默认 1)。

  • APIsklearn.preprocessing.MinMaxScaler(feature_range=(0,1))
    • feature_range:指定映射区间(默认 (0,1));
    • fit_transform(X):对特征矩阵 X 做归一化(先计算 X 的 min/max,再变换)。
  • 代码示例

import numpy as np

from sklearn.preprocessing import MinMaxScaler

def minmax_scaler_demo():

    # 1. 准备原始数据(特征矩阵:3个样本,4个特征)

    data = [[90, 2, 10, 40],  # 如“成绩、年龄、时长、分数”

            [60, 4, 15, 45],

            [75, 3, 13, 46]]

    

    # 2. 初始化归一化器(映射到[0,1])

    scaler = MinMaxScaler(feature_range=(0, 1))

    

    # 3. 执行归一化

    data_scaled = scaler.fit_transform(data)

    

    # 4. 输出结果(所有特征值均在[0,1]之间)

    print("归一化后数据:\n", data_scaled)

# 调用函数

minmax_scaler_demo()

4.2.3 标准化(Standard Scaling)
  • 定义:将原始数据转换为 “均值 = 0,标准差 = 1” 的标准正态分布,公式为:

x_{new} = \frac{x_{old} - \mu}{\sigma}

其中,\mu= 特征均值,\sigma= 特征标准差。

  • APIsklearn.preprocessing.StandardScaler()
    • 无区间参数(固定转为均值 0、标准差 1);
    • fit_transform(X):对特征矩阵 X 做标准化(先计算 X 的\mu\sigma,再变换)。
  • 代码示例

import numpy as np

from sklearn.preprocessing import StandardScaler

def standard_scaler_demo():

    # 1. 准备原始数据(同归一化示例)

    data = [[90, 2, 10, 40],

            [60, 4, 15, 45],

            [75, 3, 13, 46]]

    

    # 2. 初始化标准化器

    scaler = StandardScaler()

    

    # 3. 执行标准化

    data_scaled = scaler.fit_transform(data)

    

    # 4. 输出结果(均值≈0,标准差≈1)

    print("标准化后数据:\n", data_scaled)

    print("各特征均值:", scaler.mean_)       # 输出原始数据各特征的均值

    print("各特征方差:", scaler.var_)        # 输出原始数据各特征的方差(标准差=√方差)

# 调用函数

standard_scaler_demo()

4.2.4 归一化 vs 标准化:适用场景

对比维度

归一化(Min-Max)

标准化(Standard)

异常点影响

敏感(异常点会改变 x_min/x_max)

不敏感(少量异常点对 μ/σ 影响小)

数据要求

需知道特征的 min/max(依赖数据范围)

无需知道范围(仅需 μ/σ)

适用场景

传统小数据、无异常点(如实验室数据)

现代大数据、有异常点(如用户行为数据)

常用度

较低

较高(KNN 等距离类算法首选)

4.3 小总结

  1. 预处理核心目的:消除特征量级差异,避免距离计算被支配;
  2. 归一化映射到固定区间,标准化转为标准正态分布;
  3. 实际项目中,标准化优先用(抗异常点,适配大数据)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值