K 值选对,准确率翻倍:KNN 算法调参的黄金法则

K 值选对,准确率翻倍:KNN 算法调参的黄金法则

目录

 

一、背景介绍

二、KNN 算法原理

2.1 核心思想

2.2 距离度量方法

2.3 算法流程

2.4算法结构:

三、KNN 算法代码实现

3.1 基于 Scikit-learn 的简单实现

3.2 手动实现 KNN(自定义代码)

四、K 值选择与可视化分析

4.1 K 值对分类结果的影响

4.2 交叉验证选择最优 K 值

五、KNN 算法的优缺点与优化

5.1 优点

5.2 缺点

5.3 优化方法

六、KNN 算法的应用场景

七、KNN 与其他算法的对比

八、小结


 

一、背景介绍

K 近邻算法(K-Nearest Neighbors, KNN)是机器学习中最简单、最直观的算法之一,其核心思想源于人类对相似事物的判断逻辑 ——“近朱者赤,近墨者黑”。该算法无需复杂的训练过程,直接通过计算样本间的距离来进行分类或回归,广泛应用于图像识别、文本分类、推荐系统等领域。

二、KNN 算法原理

2.1 核心思想

KNN 的核心思想是:对于一个待预测样本,找到训练数据中与其最相似的 K 个样本(近邻),根据这 K 个样本的类别(分类问题)或数值(回归问题)进行投票或平均,从而确定待预测样本的类别或数值。

关键点

相似性度量:通过距离函数衡量样本间的相似性。

K 值选择:近邻数量 K 对结果影响显著。

投票机制:分类问题通常采用多数投票,回归问题采用均值或加权平均。

2.2 距离度量方法

常见的距离度量方法包括:

欧氏距离:适用于连续变量,计算两点间的直线距离。

曼哈顿距离:适用于城市网格路径等场景,计算两点间的折线距离。

余弦相似度:适用于文本、图像等高维数据,衡量向量间的方向相似性。

2.3 算法流程

KNN 算法的典型流程如下:

1·数据预处理:对数据进行清洗、归一化,避免特征量纲影响距离计算。

2·计算距离:计算待预测样本与所有训练样本的距离。

3·选择近邻:按距离升序排列,选取前 K 个最近邻样本。

4·分类 / 回归决策

分类:统计 K 个近邻的类别,选择出现次数最多的类别。

回归:计算 K 个近邻数值的平均值或加权平均值。

2.4算法结构:

三、KNN 算法代码实现

3.1 基于 Scikit-learn 的简单实现

以鸢尾花数据集(Iris Dataset)为例,演示 KNN 分类的完整流程。

import numpy as np import matplotlib.pyplot as plt from sklearn import datasets from sklearn.model_selection import train_test_split from sklearn.preprocessing import StandardScaler from sklearn.neighbors import KNeighborsClassifier from sklearn.metrics import accuracy_score # 加载鸢尾花数据集 iris = datasets.load_iris() X = iris.data[:, :2] # 仅取前两个特征,便于可视化 y = iris.target feature_names = iris.feature_names[:2] # 划分训练集和测试集 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42) # 数据标准化 scaler = StandardScaler() X_train = scaler.fit_transform(X_train) X_test = scaler.transform(X_test) # 创建KNN分类器(K=5) knn = KNeighborsClassifier(n_neighbors=5) knn.fit(X_train, y_train) # 预测测试集 y_pred = knn.predict(X_test) accuracy = accuracy_score(y_test, y_pred) print(f"Accuracy with K=5: {accuracy:.2f}") # 输出:Accuracy with K=5: 0.98 

3.2 手动实现 KNN(自定义代码)

为深入理解算法原理,我们手动实现 KNN 分类器:

class CustomKNN: def __init__(self, n_neighbors=3): self.n_neighbors = n_neighbors def fit(self, X_train, y_train): self.X_train = X_train self.y_train = y_train def predict(self, X_test): predictions = [] for x in X_test: # 计算距离 distances = [np.sqrt(np.sum((x - x_train)**2)) for x_train in self.X_train] # 获取最近的K个样本索引 k_indices = np.argsort(distances)[:self.n_neighbors] # 获取对应的类别 k_nearest_labels = self.y_train[k_indices] # 多数投票 most_common = np.bincount(k_nearest_labels).argmax() predictions.append(most_common) return np.array(predictions) # 使用自定义KNN custom_knn = CustomKNN(n_neighbors=3) custom_knn.fit(X_train, y_train) y_pred_custom = custom_knn.predict(X_test) print(f"Custom KNN Accuracy: {accuracy_score(y_test, y_pred_custom):.2f}") # 输出:0.96 

四、K 值选择与可视化分析

4.1 K 值对分类结果的影响

K 值是 KNN 算法的核心超参数,其大小直接影响分类结果:

  • K 值过小:模型复杂度高,易受噪声影响,导致过拟合。
  • K 值过大:模型趋于平滑,可能忽略局部特征,导致欠拟合。

示例:在鸢尾花数据集上,不同 K 值的分类边界差异如下:

def plot_decision_boundary(clf, X, y, title, k=None): plt.figure(figsize=(8, 6)) x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1 y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1 xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.02), np.arange(y_min, y_max, 0.02)) Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]) Z = Z.reshape(xx.shape) plt.contourf(xx, yy, Z, alpha=0.8) # 绘制散点图 for i, color in zip([0, 1, 2], ['r', 'g', 'b']): idx = np.where(y == i) plt.scatter(X[idx, 0], X[idx, 1], c=color, label=iris.target_names[i], edgecolor='k') plt.xlabel(feature_names[0]) plt.ylabel(feature_names[1]) plt.title(f"KNN Decision Boundary (K={k})") plt.legend() plt.show() # K=1(过拟合) knn1 = KNeighborsClassifier(n_neighbors=1) knn1.fit(X_train, y_train) plot_decision_boundary(knn1, X_test, y_test, "K=1", k=1) # K=15(欠拟合) knn15 = KNeighborsClassifier(n_neighbors=15) knn15.fit(X_train, y_train) plot_decision_boundary(knn15, X_test, y_test, "K=15", k=15) 

4.2 交叉验证选择最优 K 值

通过交叉验证可以有效选择最优 K 值:

from sklearn.model_selection import cross_val_score # 候选K值 k_values = range(1, 31) cv_scores = [] for k in k_values: knn = KNeighborsClassifier(n_neighbors=k) scores = cross_val_score(knn, X_train, y_train, cv=5, scoring='accuracy') cv_scores.append(scores.mean()) # 绘制K值与准确率曲线 plt.plot(k_values, cv_scores, marker='o', linestyle='--', color='b') plt.xlabel('K Value') plt.ylabel('Cross-Validation Accuracy') plt.title('K Value Selection via Cross-Validation') plt.show() 

五、KNN 算法的优缺点与优化

5.1 优点

简单易懂:原理直观,无需复杂数学推导。

无需训练:直接使用训练数据进行预测。

泛化能力强:对非线性数据分布有较好的适应性。

5.2 缺点

计算复杂度高:预测时需计算与所有训练样本的距离。

存储成本高:需存储全部训练数据。

对噪声敏感:K 值过小时,异常值可能显著影响结果。

5.3 优化方法

数据预处理:归一化、特征选择。

近似最近邻搜索:KD 树、球树等加速算法。

加权投票:根据距离赋予不同权重。

六、KNN 算法的应用场景

  • 图像识别与分类:常用于手写数字识别、人脸识别等任务。
  •  推荐系统:基于用户或物品的相似度进行推荐。
  •  医疗诊断:根据患者的临床指标预测疾病类别。
  •  异常检测:通过判断样本与近邻的距离识别异常点。

七、KNN 与其他算法的对比

算法核心思想优点缺点适用场景
KNN基于相似性投票 / 平均简单直观、无需训练计算慢、存储成本高、高维性能差小规模数据、实时预测
逻辑回归基于概率的线性分类训练快、可解释性强仅适用于线性可分数据、需调参二分类、概率预测
决策树基于特征划分的树结构分类可解释性强、能处理非线性数据易过拟合、对噪声敏感分类规则提取、快速预测

八、小结

KNN 算法以其简单性和直观性成为机器学习入门的经典算法,适用于小规模、低维数据的快速分类 / 回归任务。尽管存在计算效率和高维性能的局限,但其思想为许多复杂算法提供了基础。通过数据预处理、近似搜索和加权机制,KNN 的实用性可进一步提升;未来,随着硬件计算能力的提升和近似搜索算法的发展,KNN 在大规模数据中的应用可能迎来新突破。结合深度学习的特征提取能力,可构建更强大的混合模型。

 

Read more

微调模型成本太高,用RAG技术,低成本实现AI升级

微调模型成本太高,用RAG技术,低成本实现AI升级

文章目录 * 大模型 RAG 技术深度解析:从入门到进阶 * 一、大语言模型(LLM)的三大痛点 * 1.1 幻觉问题:一本正经地胡说八道 * 1.2 时效性问题:知识更新不及时 * 1.3 数据安全问题:敏感信息泄露风险 * 二、RAG 技术:检索增强生成 * 2.1 RAG 的定义 * 2.2 RAG 的架构 * 2.2.1 检索器模块 * 2.2.2 生成器模块 * 三、使用 RAG 的八大优势 * 3.1 可扩展性:减少模型大小和训练成本 * 3.

By Ne0inhk
人工智能:计算机视觉的基础与应用

人工智能:计算机视觉的基础与应用

第十二篇:计算机视觉的基础与应用 学习目标 💡 理解计算机视觉的基本概念和重要性 💡 掌握计算机视觉中的图像处理技术、特征提取方法、常用模型与架构 💡 学会使用计算机视觉库(OpenCV、PIL、PyTorch、TensorFlow)进行图像处理、特征提取和模型训练 💡 理解图像分类、目标检测、语义分割等任务的实现方法 💡 通过实战项目,开发一个完整的计算机视觉应用 重点内容 * 计算机视觉的基本概念 * 图像处理技术(图像预处理、增强、滤波) * 特征提取方法(HOG、SIFT、ORB) * 常用模型与架构(LeNet、AlexNet、VGG、ResNet、YOLO) * 实战项目:计算机视觉应用开发(图像分类、目标检测等) 一、计算机视觉基础 1.1 计算机视觉的基本概念 计算机视觉(Computer Vision)是人工智能的一个重要分支,它涉及计算机与图像之间的交互。其目标是让计算机能够理解和解释图像内容,

By Ne0inhk
如何把 AI 大语言模型接入个人项目

如何把 AI 大语言模型接入个人项目

通过 Python 把 AI 大语言模型接入自己的项目 本文以开源项目 HuluAiChat 为例,说明如何用 Python 将任意「OpenAI 兼容」的 AI 聊天模型接入到自己的应用里。读完你将掌握:如何用 openai 库的每一类参数与用法、最小可运行示例、以及如何复用到你的项目中。 目录 * 一、为什么要自己接入 AI 聊天? * 二、用 Python 调用 AI 聊天:参数、函数与用法详解(核心) * 三、HuluChat 项目简介 * 四、整体架构:分层与职责 * 五、流式发送消息的完整流程 * 六、核心代码解析:Chat 抽象与 OpenAI 实现

By Ne0inhk
ArXiv投稿详细操作指南 & AI论文写作最佳实践

ArXiv投稿详细操作指南 & AI论文写作最佳实践

arXiv投稿详细操作指南 & AI论文写作最佳实践 简单来说,arXiv 不是一个传统意义上的论文发表“平台”或“期刊”,而是一个全球知名的、免费开放的科学文献预印本(Preprint)数据库。 1. 核心概念:什么是“预印本”?在传统学术出版中,一篇论文从投稿到正式发表,往往需要经过漫长的“同行评审”流程,可能长达数月甚至一年。* 预印本 (Preprint): 指研究人员在将论文提交给学术期刊进行评审之前,先将论文的初稿(手稿)上传到 arXiv 这样的服务器上。* 目的: 为了抢占学术首发权(通过时间戳证明谁先做出了成果),并快速与同行交流最新发现,避免重复劳动。 2. arXiv 的关键特点特性 说明所属机构 由美国康奈尔大学(Cornell University)维护和管理,起源于洛斯阿拉莫斯国家实验室。覆盖领域 主要集中在理工科:物理学、数学、计算机科学、

By Ne0inhk