返回

以独特的视角揭秘KNN算法:从原理到实践,助您轻松理解

人工智能

一、KNN算法介绍

KNN算法是一种非参数的分类算法。它不需要对数据做任何假设,也不需要训练任何模型。只需要将待分类的样本与训练集中所有样本进行比较,然后根据最近的K个样本的类别来确定待分类样本的类别。

KNN算法的优点是简单易懂,实现方便。而且它对异常值和噪声数据不敏感。但是,KNN算法也有一个缺点,就是计算量大。当训练集很大时,KNN算法的计算量会非常大。

二、KNN算法核心思想

KNN算法的核心思想是:对于一个待分类的样本,通过计算它与训练集中所有样本的距离,选出距离最小的K个样本,然后根据这K个样本的类别来确定待分类样本的类别。

距离的计算方法有多种,常用的距离计算方法有欧氏距离、曼哈顿距离和切比雪夫距离。其中,欧氏距离是最常用的距离计算方法。

K值的选择也很重要。K值的选择会对KNN算法的准确率产生很大的影响。一般来说,K值越大,KNN算法的准确率越高。但是,K值过大会导致计算量过大。因此,在实际应用中,需要根据具体情况来选择K值。

三、KNN算法三要素

KNN算法有三个要素:

  1. 距离度量:用于计算样本之间的距离。
  2. K值:用于选择最近的K个样本。
  3. 分类规则:用于根据最近的K个样本的类别来确定待分类样本的类别。

四、KNN算法优缺点

KNN算法的优点是:

  1. 简单易懂,实现方便。
  2. 对异常值和噪声数据不敏感。

KNN算法的缺点是:

  1. 计算量大。
  2. 对训练集的大小和分布很敏感。

五、源码简单实现

import numpy as np
import pandas as pd

def knn(X_train, y_train, X_test, k):
  """
  KNN算法

  Args:
    X_train: 训练集特征
    y_train: 训练集标签
    X_test: 测试集特征
    k: 最近邻的数量

  Returns:
    y_pred: 预测标签
  """

  # 计算训练集样本与测试集样本之间的距离
  distances = np.linalg.norm(X_train - X_test, axis=1)

  # 选择最近的k个训练集样本
  k_nearest_indices = np.argsort(distances)[:k]

  # 根据最近的k个训练集样本的标签预测测试集样本的标签
  y_pred = np.array([y_train[i] for i in k_nearest_indices])

  return y_pred


if __name__ == "__main__":
  # 加载数据
  data = pd.read_csv("data.csv")

  # 划分训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(data.drop("label", axis=1), data["label"], test_size=0.2)

  # 训练KNN模型
  model = knn(X_train, y_train, k=5)

  # 预测测试集标签
  y_pred = model.predict(X_test)

  # 评估模型准确率
  accuracy = accuracy_score(y_test, y_pred)

  # 打印模型准确率
  print("模型准确率:", accuracy)

六、全部代码

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

def knn(X_train, y_train, X_test, k):
  """
  KNN算法

  Args:
    X_train: 训练集特征
    y_train: 训练集标签
    X_test: 测试集特征
    k: 最近邻的数量

  Returns:
    y_pred: 预测标签
  """

  # 计算训练集样本与测试集样本之间的距离
  distances = np.linalg.norm(X_train - X_test, axis=1)

  # 选择最近的k个训练集样本
  k_nearest_indices = np.argsort(distances)[:k]

  # 根据最近的k个训练集样本的标签预测测试集样本的标签
  y_pred = np.array([y_train[i] for i in k_nearest_indices])

  return y_pred


if __name__ == "__main__":
  # 加载数据
  data = pd.read_csv("data.csv")

  # 划分训练集和测试集
  X_train, X_test, y_train, y_test = train_test_split(data.drop("label", axis=1), data["label"], test_size=0.2)

  # 训练KNN模型
  model = knn(X_train, y_train, k=5)

  # 预测测试集标签
  y_pred = model.predict(X_test)

  # 评估模型准确率
  accuracy = accuracy_score(y_test, y_pred)

  # 打印模型准确率
  print("模型准确率:", accuracy)