一,

KNN(K近邻)算法是一种基于实例的监督学习分类方法,其核心思想是“物以类聚”。下面从原理、实现和应用三个层面逐步解析:


一、核心原理

  1. 基本假设
    在特征空间中,相邻样本具有相似的类别属性。对于新样本 $x_q$,通过其最近邻的 $k$ 个已知样本的类别投票决定其类别。

  2. 距离度量
    关键公式:欧氏距离(最常用)
    $$ d(x_i, x_j) = \sqrt{\sum_{m=1}^n (x_{i,m} - x_{j,m})^2} $$
    其他距离:曼哈顿距离、余弦相似度等。

  3. k值选择

    • $k$ 过小:对噪声敏感,易过拟合
    • $k$ 过大:决策边界平滑,但可能忽略局部特征
      (经验法则:$k \leq \sqrt{\text{样本数}}$)

二、算法实现

import numpy as np
from collections import Counter

def knn_predict(X_train, y_train, X_test, k=3):
    predictions = []
    for test_point in X_test:
        # 计算所有训练样本的距离
        distances = np.sqrt(np.sum((X_train - test_point)**2, axis=1))
        # 获取最近的k个样本索引
        nearest_indices = np.argsort(distances)[:k]
        # 统计k个邻居的类别
        nearest_labels = y_train[nearest_indices]
        # 多数投票决策
        pred = Counter(nearest_labels).most_common(1)[0][0]
        predictions.append(pred)
    return predictions


三、典型应用场景

  1. 分类问题

    • 医疗诊断:基于患者指标判断疾病类型
    • 图像识别:手写数字分类(如MNIST数据集)
  2. 回归问题
    输出为连续值(如房价预测),取 $k$ 个邻居的平均值:
    $$ \hat{y}q = \frac{1}{k} \sum{i \in N_k} y_i $$


四、优缺点总结

优势 劣势
无需训练阶段 计算复杂度高($O(n)$)
直观易理解 对高维数据效果差(维度灾难)
天然支持多分类 需妥善处理特征缩放

提示:实际应用中常结合KD树或球树优化搜索效率,并建议使用 scikit-learnKNeighborsClassifier 实现。

KNN(K近邻)算法是一种基于实例的监督学习分类方法,其核心思想是“物以类聚”。下面从原理、实现和应用三个层面逐步解析:


一、核心原理

  1. 基本假设
    在特征空间中,相邻样本具有相似的类别属性。对于新样本 $x_q$,通过其最近邻的 $k$ 个已知样本的类别投票决定其类别。

  2. 距离度量
    关键公式:欧氏距离(最常用)
    $$ d(x_i, x_j) = \sqrt{\sum_{m=1}^n (x_{i,m} - x_{j,m})^2} $$
    其他距离:曼哈顿距离、余弦相似度等。

  3. k值选择

    • $k$ 过小:对噪声敏感,易过拟合
    • $k$ 过大:决策边界平滑,但可能忽略局部特征
      (经验法则:$k \leq \sqrt{\text{样本数}}$)

二、算法实现

import numpy as np
from collections import Counter

def knn_predict(X_train, y_train, X_test, k=3):
    predictions = []
    for test_point in X_test:
        # 计算所有训练样本的距离
        distances = np.sqrt(np.sum((X_train - test_point)**2, axis=1))
        # 获取最近的k个样本索引
        nearest_indices = np.argsort(distances)[:k]
        # 统计k个邻居的类别
        nearest_labels = y_train[nearest_indices]
        # 多数投票决策
        pred = Counter(nearest_labels).most_common(1)[0][0]
        predictions.append(pred)
    return predictions


三、典型应用场景

  1. 分类问题

    • 医疗诊断:基于患者指标判断疾病类型
    • 图像识别:手写数字分类(如MNIST数据集)
  2. 回归问题
    输出为连续值(如房价预测),取 $k$ 个邻居的平均值:
    $$ \hat{y}q = \frac{1}{k} \sum{i \in N_k} y_i $$


四、优缺点总结

优势 劣势
无需训练阶段 计算复杂度高($O(n)$)
直观易理解 对高维数据效果差(维度灾难)
天然支持多分类 需妥善处理特征缩放

提示:实际应用中常结合KD树或球树优化搜索效率,并建议使用 scikit-learnKNeighborsClassifier 实现。

全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。

其中knn算法中有两种经典距离即为欧式距离和曼哈顿距离

其中knn算法中参数的具体意义如下:

n_neighbors:k值,邻居的个数,默认为5。【关键参数】
weights:权重项,默认 uniform 方法。
 
- Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
- Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
- Callable:用户自定义权重。
 
algorithm:用于计算最近邻的算法。
 
- ball_tree:球树实现
- kd_tree:KD 树实现,是一种对 n 维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
- brute:暴力实现
- auto:自动选择,权衡上述三种算法。【一般按自动即可】
 
leaf_size:空值 KD 树或者球树的参数,停止建子树的叶子节点的阈值。
p:距离的计算方式。P=1 为曼哈顿距离,p=2 为欧式距离。
metric:用于树的距离度量
 
1. 曼哈顿距离
2. 欧式距离
3. 切比雪夫距离
4. 闵可夫斯基距离
5. 带权重闵可夫斯基距离
6. 标准化欧式距离
7. 马氏距离
 
metric_params:用于比较复杂的距离的度量附加参数。【用不上】
 
score()

更多推荐