热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

AI炼金术:KNN分类器的构建与应用

本文介绍了如何使用Python及其相关库(如NumPy、scikit-learn和matplotlib)构建KNN分类器模型。通过详细的数据准备、模型训练及新样本预测的过程,展示KNN算法的实际操作步骤。

在本文中,我们将使用Python 3.6、NumPy 1.14、scikit-learn 0.19以及matplotlib 2.2等库来构建一个K近邻(K-Nearest Neighbors, KNN)分类器。KNN是一种基于实例的学习方法,用于解决分类问题,其核心思想是在特征空间中找到与待分类样本最近的K个训练样本,并根据这K个样本的多数类别来决定待分类样本的类别。


1. 数据准备


数据准备阶段包括数据的加载与可视化。这一部分相对直观,主要目的是通过图表展示数据的分布情况,以便于后续分析。以下是数据分布的示例图:



AI炼金术:KNN分类器的构建与应用

2. KNN分类器的构建与训练


2.1 模型构建与训练


构建KNN分类器的过程类似于其他机器学习模型,如支持向量机(SVM)和随机森林(Random Forest)。下面是使用scikit-learn构建KNN分类器的代码示例:


# 导入必要的库
from sklearn.neighbors import KNeighborsClassifier

# 定义K值
K = 10

# 创建KNN分类器实例
knn = KNeighborsClassifier(n_neighbors=K, weights='distance')

# 使用数据集训练模型
knn.fit(dataset_X, dataset_y)

上述代码展示了如何利用给定的数据集训练KNN模型。接下来,我们可以通过绘制分类模型在训练数据集上的决策边界来评估模型的性能。从下图可以看出,KNN分类器能够有效地将数据集中的不同类别区分开来:



AI炼金术:KNN分类器的构建与应用

2.2 预测新样本


使用训练好的KNN模型进行新样本的预测也非常简单。以下是预测新样本的代码示例:


# 新样本数据
new_sample = np.array([[4.5, 3.6]])

# 预测新样本的类别
predicted = knn.predict(new_sample)[0]
print("KNN Predicted: {}".format(predicted))

预测结果显示,新样本被归类为第二类。为了更好地理解这一分类结果,我们可以将新样本及其最近的K个邻居在图中标出。为此,我们对绘图函数进行了调整,以显示新样本的具体位置及其周围的K个邻居。调整后的绘图函数如下所示:


# 定义绘图函数
import matplotlib.pyplot as plt
import numpy as np

def plot_classifier(knn_classifier, X, y, new_sample, K):
x_min, x_max = X[:, 0].min() - 1.0, X[:, 0].max() + 1.0
y_min, y_max = X[:, 1].min() - 1.0, X[:, 1].max() + 1.0
step_size = 0.01
x_values, y_values = np.meshgrid(np.arange(x_min, x_max, step_size),
np.arange(y_min, y_max, step_size))
mesh_output = knn_classifier.predict(np.c_[x_values.ravel(), y_values.ravel()])
mesh_output = mesh_output.reshape(x_values.shape)
plt.figure()
plt.pcolormesh(x_values, y_values, mesh_output, cmap=plt.cm.gray)
plt.scatter(X[:, 0], X[:, 1], c=y, s=80, edgecolors='black', linewidth=1, cmap=plt.cm.Paired)
plt.scatter(new_sample[:, 0], new_sample[:, 1], marker='*', color='red')
dist, indices = knn_classifier.kneighbors(new_sample)
plt.scatter(X[indices][0][:, 0], X[indices][0][:, 1], marker='x', s=80, color='r')
plt.xlim(x_values.min(), x_values.max())
plt.ylim(y_values.min(), y_values.max())
plt.xticks(np.arange(int(X[:, 0].min()), int(X[:, 0].max()), 1.0))
plt.yticks(np.arange(int(X[:, 1].min()), int(X[:, 1].max()), 1.0))
plt.show()

执行上述绘图函数后,得到的结果图如下所示:



AI炼金术:KNN分类器的构建与应用

从图中可以看到,红色五角星代表新样本,而红色叉号则表示与新样本最近的K个邻居。大多数邻居属于第二类,因此新样本也被分类为第二类,这与predict函数返回的结果一致。


总结



  • 构建和训练KNN分类器非常简便,只需通过scikit-learn库调用相应的函数即可。

  • KNN分类器通过计算新数据点与训练集中所有数据点的距离,选择最近的K个数据点,并根据这些数据点的多数类别来确定新数据点的类别。通常推荐K值为奇数,以避免平局情况。

  • 选择最优K值是KNN分类器的一个挑战,可以通过交叉验证、网格搜索或随机搜索等方法来实现。


注:本文中涉及的所有代码已上传至我的GitHub仓库,欢迎下载并参考使用。参考资料包括《Python机器学习经典实例》一书,由Prateek Joshi撰写,陶俊杰和陈小莉翻译。


推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 【转】强大的矩阵奇异值分解(SVD)及其应用
    在工程实践中,经常要对大矩阵进行计算,除了使用分布式处理方法以外,就是通过理论方法,对矩阵降维。一下文章,我在 ... [详细]
  • 机器学习算法:SVM(支持向量机)
    SVM算法(SupportVectorMachine,支持向量机)的核心思想有2点:1、如果数据线性可分,那么基于最大间隔的方式来确定超平面,以确保全局最优, ... [详细]
  • 本文介绍了如何利用 `matplotlib` 库中的 `FuncAnimation` 类将 Python 中的动态图像保存为视频文件。通过详细解释 `FuncAnimation` 类的参数和方法,文章提供了多种实用技巧,帮助用户高效地生成高质量的动态图像视频。此外,还探讨了不同视频编码器的选择及其对输出文件质量的影响,为读者提供了全面的技术指导。 ... [详细]
  • 非线性门控感知器算法的实现与应用分析 ... [详细]
  • 在机器学习领域,深入探讨了概率论与数理统计的基础知识,特别是这些理论在数据挖掘中的应用。文章重点分析了偏差(Bias)与方差(Variance)之间的平衡问题,强调了方差反映了不同训练模型之间的差异,例如在K折交叉验证中,不同模型之间的性能差异显著。此外,还讨论了如何通过优化模型选择和参数调整来有效控制这一平衡,以提高模型的泛化能力。 ... [详细]
  • 如何将955万数据表的17秒SQL查询优化至300毫秒
    本文详细介绍了通过优化SQL查询策略,成功将一张包含955万条记录的财务流水表的查询时间从17秒缩短至300毫秒的方法。文章不仅提供了具体的SQL优化技巧,还深入探讨了背后的数据库原理。 ... [详细]
  • 本文详细介绍了在 Python 中如何有效去除浮点数末尾的无意义零及不必要的点,提供多种实现方法,并深入探讨了浮点数在计算机中的表示方式及其可能带来的精度问题。 ... [详细]
  • CoreData 表关联详解
    在企业中,通常会有多个部门,每个员工隶属于某个部门。这种情况下,员工表和部门表之间就会形成关联关系。本文将详细介绍如何在CoreData中实现表关联,并通过示例代码展示如何添加和查询关联数据。 ... [详细]
  • 非计算机专业的朋友如何拿下多个Offer
    大家好,我是归辰。秋招结束后,我已顺利入职,并应公子龙的邀请,分享一些秋招面试的心得体会,希望能帮助到学弟学妹们,让他们在未来的面试中更加顺利。 ... [详细]
  • 本文介绍如何使用OpenCV和线性支持向量机(SVM)模型来开发一个简单的人脸识别系统,特别关注在只有一个用户数据集时的处理方法。 ... [详细]
  • Spring Boot 中配置全局文件上传路径并实现文件上传功能
    本文介绍如何在 Spring Boot 项目中配置全局文件上传路径,并通过读取配置项实现文件上传功能。通过这种方式,可以更好地管理和维护文件路径。 ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 遗传算法中选择算子为何置于交叉算子和变异算子之前?本文探讨了这一问题,并详细介绍了遗传算法中常用的选择算子类型及其作用机制。此外,还分析了不同选择算子对算法性能的影响,为实际应用提供了理论依据。 ... [详细]
  • 从键盘输入年、月、日,要求输出当前日期为当年的第多少天。今天凯凯君又去参加了笔试,碰到了这样一个题目,从键盘输入年、月、日,要求输出当前日期为当年的第多少天。面对这个题目你首先想到 ... [详细]
author-avatar
四川盛地地产顾问有限公司_255
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有