【Sklearn】基于K邻近算法的数据分类预测(Excel可直接替换数据)

news2024/11/24 4:23:51

【Sklearn】基于K邻近算法的数据分类预测(Excel可直接替换数据)

  • 1.模型原理
      • 模型原理:
      • 数学模型:
  • 2.模型参数
  • 3.文件结构
  • 4.Excel数据
  • 5.下载地址
  • 6.完整代码
  • 7.运行结果

1.模型原理

K最近邻(K-Nearest Neighbors,KNN)是一种基本的监督学习算法,用于分类和回归任务。其模型原理如下:

模型原理:

对于分类任务,KNN的原理可以概括为以下几个步骤:

  1. 训练阶段: 将训练数据集中的每个数据点与其标签一起存储。这些数据点和标签构成了训练样本。

  2. 预测阶段: 当需要对新的数据点进行分类时,KNN算法执行以下步骤:

    • 计算测试数据点与训练数据集中每个点之间的距离,使用所选择的距离度量(如欧氏距离)。

    • 从训练数据集中选择K个与测试数据点距离最近的数据点,这些数据点就是测试数据点的“最近邻居”。

    • 根据这K个最近邻居的标签,预测测试数据点的标签。对于分类任务,可以通过多数表决的方式,即选择K个邻居中出现最多次的标签作为预测标签。

数学模型:

假设我们有一个训练数据集 D D D,包含 N N N 个样本,每个样本有 d d d 个特征。在分类任务中,每个样本都有一个标签。

  • 训练数据集: D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , . . . , ( x N , y N ) } D = \{(x_1, y_1), (x_2, y_2), ..., (x_N, y_N)\} D={(x1,y1),(x2,y2),...,(xN,yN)},其中 x i x_i xi 是一个 d d d 维特征向量, y i y_i yi 是样本 x i x_i xi 对应的标签。

对于一个新的测试数据点 x x x,KNN的分类过程可以用以下公式表示:

y ^ = argmax y ∑ i = 1 K w i ⋅ I ( y i = y ) \hat{y} = \text{argmax}_y \sum_{i=1}^{K} w_i \cdot I(y_i = y) y^=argmaxyi=1KwiI(yi=y)

其中:

  • y ^ \hat{y} y^ 是测试数据点的预测标签。
  • y i y_i yi 是第 i i i 个最近邻居的标签。
  • w i w_i wi 是第 i i i 个最近邻居的权重(通常为1或距离的倒数)。
  • I ( y i = y ) I(y_i = y) I(yi=y) 是指示函数,如果 y i = y y_i = y yi=y,则为1,否则为0。

KNN算法在预测时需要选择合适的 K K K 值、距离度量、权重等参数。较小的 K K K 值会导致模型更容易受到噪声影响,而较大的 K K K 值可能导致决策边界不够灵活。距离度量的选择和权重的设置也会影响算法的性能。

当需要对新的数据点进行分类时,KNN算法执行以下步骤:

  1. 计算距离: 对于测试数据点 x x x,计算它与训练数据集中每个数据点 x i x_i xi 之间的距离。可以使用欧氏距离(Euclidean distance)等距离度量方法:

    欧氏距离公式: d ( x , x i ) = ∑ j = 1 d ( x j − x i j ) 2 d(x, x_i) = \sqrt{\sum_{j=1}^{d} (x_j - x_{ij})^2} d(x,xi)=j=1d(xjxij)2

    其中, d d d 是数据的维度, x j x_j xj 是测试数据点的第 j j j 个特征值, x i j x_{ij} xij 是训练数据点 x i x_i xi 的第 j j j 个特征值。

  2. 选择最近邻: 从训练数据集中选择距离测试数据点最近的 K K K 个数据点,这些数据点就是测试数据点的最近邻居。

  3. 多数表决: 对于分类任务,根据最近邻居的标签进行多数表决,选择出现次数最多的标签作为测试数据点的预测标签。

  4. 欧氏距离公式:
    d ( x , x i ) = ∑ j = 1 d ( x j − x i j ) 2 d(x, x_i) = \sqrt{\sum_{j=1}^{d} (x_j - x_{ij})^2} d(x,xi)=j=1d(xjxij)2

在这个公式中, d d d 是数据的维度, x j x_j xj 是测试数据点的第 j j j 个特征值, x i j x_{ij} xij 是训练数据点 x i x_i xi 的第 j j j 个特征值。

请注意,上述描述和公式仅概括了KNN算法的基本原理。在实际应用中,还需要根据具体问题选择合适的距离度量、权重等参数,以及处理距离相等的情况等。

2.模型参数

KNeighborsClassifier是Scikit-Learn中用于K最近邻分类的类。以下是部分常用的参数列表:

  1. n_neighbors: K值,表示用于预测的最近邻居的数量。
  2. weights: 用于预测的近邻的权重,可以是’uniform’(均匀权重)或’distance’(根据距离进行加权)。
  3. algorithm: 用于计算最近邻的算法,可以是’auto’(根据数据自动选择),‘ball_tree’,‘kd_tree’,‘brute’。
  4. leaf_size: 在使用’ball_tree’或’kd_tree’算法时,指定叶子节点的大小。
  5. p: 距离度量参数,1表示使用曼哈顿距离,2表示使用欧氏距离,其他值表示使用闵可夫斯基距离。
  6. metric: 距离度量函数,默认为’minkowski’。可以是各种内置度量,或者自定义距离度量函数。
  7. n_jobs: 并行计算的任务数量,-1表示使用所有可用的CPU核心。
  8. algorithm: 用于计算最近邻的算法,可以是’auto’(自动选择),‘ball_tree’,‘kd_tree’,‘brute’。
  9. leaf_size: 在使用’ball_tree’或’kd_tree’算法时,指定叶子节点的大小。
  10. metric_params: 距离度量的附加参数。

以下是使用KNeighborsClassifier的例子:

from sklearn.neighbors import KNeighborsClassifier

# 创建K最近邻模型,设置K值为5,使用欧氏距离,使用均匀权重
model = KNeighborsClassifier(n_neighbors=5, weights='uniform', p=2)

请注意,上述示例只是一部分参数,还有其他可用参数未列出。您可以根据需求在创建模型时调整这些参数。

3.文件结构

在这里插入图片描述

iris.xlsx						% 可替换数据集
Main.py							% 主函数

4.Excel数据

在这里插入图片描述

5.下载地址

- 资源下载地址

6.完整代码

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score, confusion_matrix
import matplotlib.pyplot as plt
import seaborn as sns

def knn_classification(data_path, test_size=0.2, random_state=42, n_neighbors=3):
    # 加载数据
    data = pd.read_excel(data_path)

    # 分割特征和标签
    X = data.iloc[:, :-1]  # 所有列除了最后一列
    y = data.iloc[:, -1]   # 最后一列

    # 划分训练集和测试集
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=test_size, random_state=random_state)

    # 创建K最近邻模型
    # 1. ** n_neighbors: ** K值,表示用于预测的最近邻居的数量。
    # 2. ** weights: ** 用于预测的近邻的权重,可以是'uniform'(均匀权重)或'distance'(根据距离进行加权)。
    # 3. ** algorithm: ** 用于计算最近邻的算法,可以是'auto'(根据数据自动选择),'ball_tree','kd_tree','brute'。
    # 4. ** leaf_size: ** 在使用'ball_tree'或'kd_tree'算法时,指定叶子节点的大小。
    # 5. ** p: ** 距离度量参数,1表示使用曼哈顿距离,2表示使用欧氏距离,其他值表示使用闵可夫斯基距离。
    # 6. ** metric: ** 距离度量函数,默认为'minkowski'。可以是各种内置度量,或者自定义距离度量函数。
    # 7. ** n_jobs: ** 并行计算的任务数量,-1表示使用所有可用的CPU核心。
    # 8. ** algorithm: ** 用于计算最近邻的算法,可以是'auto'(自动选择),'ball_tree','kd_tree','brute'。
    # 9. ** leaf_size: ** 在使用'ball_tree'或'kd_tree'算法时,指定叶子节点的大小。
    # 10. ** metric_params: ** 距离度量的附加参数。
    # 创建K最近邻模型,设置K值为5,使用欧氏距离,使用均匀权重
    model = KNeighborsClassifier(n_neighbors=5, weights='uniform', p=2)

    # 在训练集上训练模型
    model.fit(X_train, y_train)

    # 在测试集上进行预测
    y_pred = model.predict(X_test)

    # 计算准确率
    accuracy = accuracy_score(y_test, y_pred)
    return confusion_matrix(y_test, y_pred), y_test.values, y_pred, accuracy

if __name__ == "__main__":
    # 使用函数进行分类任务
    data_path = "iris.xlsx"
    confusion_mat, true_labels, predicted_labels, accuracy = knn_classification(data_path, n_neighbors=5)

    print("真实值:", true_labels)
    print("预测值:", predicted_labels)
    print("准确率:{:.2%}".format(accuracy))

    # 绘制混淆矩阵
    plt.figure(figsize=(8, 6))
    sns.heatmap(confusion_mat, annot=True, fmt="d", cmap="Blues")
    plt.title("Confusion Matrix")
    plt.xlabel("Predicted Labels")
    plt.ylabel("True Labels")
    plt.show()

    # 用圆圈表示真实值,用叉叉表示预测值
    # 绘制真实值与预测值的对比结果
    plt.figure(figsize=(10, 6))
    plt.plot(true_labels, 'o', label="True Labels")
    plt.plot(predicted_labels, 'x', label="Predicted Labels")

    plt.title("True Labels vs Predicted Labels")
    plt.xlabel("Sample Index")
    plt.ylabel("Label")
    plt.legend()
    plt.show()


7.运行结果

在这里插入图片描述

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/876977.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++入门篇8---vector

vecctor是动态顺序表 一、了解vector的相关接口及其功能 1.构造函数相关接口 函数声明功能介绍vector()无参构造vector(size_type n,const value_type& valvalue_type())构造并初始化n个valvector(const value& x)拷贝构造vector(InputIterator first, InputIterato…

ad+硬件每日学习十个知识点(33)23.8.13 (导出gerber)

文章目录 1.第一次制造输出2.第二次制造输出3.第三次制造输出 1.第一次制造输出 答: 2.第二次制造输出 答: 3.第三次制造输出 答:

企业计算机服务器中了Devos勒索病毒怎么办,勒索病毒解密

社会在发展,科技在进步,企业的生产也得到了很大改善,但是随着网络技术的不断发展,越来越多的企业遭到的网络安全威胁开始增多,其中较为明显的就是勒索病毒攻击。预防勒索病毒攻击成为日常生活中不可或缺的一部分工作。…

Python—行命令搭建HTTP服务器并外网访问本地SQL Server数据库【无公网IP内网穿透】

在强者的眼中,没有最好,只有更好。我们是移动开发领域的优质创作者,同时也是阿里云专家博主。 ✨ 关注我们的主页,探索iOS开发的无限可能! 🔥我们与您分享最新的技术洞察和实战经验,助您在移动…

MySQL中事务特性以及隔离机制

目录 一、什么是事务 二、事务特性——即ACID特性 三、事务的隔离级别 1、脏读 2、不可重复读 3、幻读 Read uncommitted: Read committed: Repeatable read: Serializable: 一、什么是事务 事务(Transaction)——一个最…

小程序用户隐私新规,微信小程序开发者需满足新要求

微信公众平台运营中心最新公告指出,从2023年9月15日开始,涉及处理用户个人信息的小程序开发者需要满足新要求。开发者须主动同步用户同意并遵守小程序的隐私保护指引和其他信息处理规则,方可调用微信提供的隐私接口。 并且,在确认…

第四章,向量组,1-向量组与线性组合、线性表示

第四章,向量组,1-向量组与线性组合、线性表示 向量方程向量与向量组向量向量组 线性组合与线性表示线性组合 线性表示定理定义 多表多(单向)定理推论 定义 等价(多表多:双向) 知识回顾 玩转线性…

用免费Leangoo敏捷看板工具进行可视化的缺陷跟踪管理

用Leangoo敏捷看板进行可视化的缺陷跟踪管理 缺陷管理通常关注如下几个方面: 1. 缺陷的处理速度 2. 缺陷处理的状态 3. 缺陷的分布 4. 缺陷产生的原因 使用Leangoo敏捷看板我们可以对缺陷进行可视化的管理,方便我们对缺陷的处理进展、负责人、当前…

转行软件测试四个月学习,第一次面试经过分享

我是去年上半年从销售行业转行到测试的,从销售公司辞职之后选择去培训班培训软件测试,经历了四个月左右的培训,在培训班结课前两周就开始投简历了,在结课的时候顺利拿到了offer。在新的公司从事软件测试工作已经将近半年有余&…

云渲染效果不对?云渲染前的四个细节表明你的问题出在这里!

云渲染针对3D渲染行业,帮助本地电脑解决渲染慢的问题,大幅提高设计师的工作效率。但小编发现,有不少小伙伴在使用云渲染时,出现了渲染效果不对或丢失的问题,根据小伙伴们的问题和我们创意云云渲染平台给出的解决方案&a…

vue之动态表单(优化)

代码资源在这儿 ↑ vue之动态表单优化 vue2js动态表单优化vue3ts动态表单优化 vue2js动态表单优化 效果图 目录结构 五个文件的完整代码: 以下是App.vue <template><div><router-view></router-view><Formpage /></div> </templa…

【数据结构】栈与队列

1 栈 1.1 栈的概念及结构 栈&#xff1a;一种特殊的线性表&#xff0c;其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶&#xff0c;另一端称为栈底。栈中的数据元素遵守后进先出 LIFO (Last In First Out) 的原则。 压栈&#xff1a;栈…

java中右移>>和无符号右移>>>的区别

public static void main(String[] args) {byte[] dest new byte[2];dest[0] 0x15; //0001 0101dest[1] (byte) 0xfb;//1111 1011System.out.println((dest[0] >> 4) & 0xff);//右移 应该是0000 0001 十进制结果显示1 结果也是1&#xff0c;正确System.out.printl…

【小练习】交互式网格自定义增删改错误记录及解决(进行中)

经过之前的学习&#xff0c;已经能创建简单的交互式网格并设置自定义增删改按钮&#xff0c;但是实现上还是存在一些问题&#xff0c;来完善优化一下。 首先是修改&#xff0c;正常修改都会弹出修改框&#xff0c;里面是之前存储的信息&#xff0c;根据实际需要对其进行修改&a…

小程序多图片组合

目录 子组件 index.js 子组件 index.wxml 子组件 index.wxss 父组件引用&#xff1a; 子组件&#xff1a;preview-image 子组件 index.js Component({properties: {previewData: {type: Array,default: [],observer: function (newVal, oldVal) {console.log(newVal, ol…

AppStream下载元数据失败

错误&#xff1a;为仓库 AppStream 下载元数据失败 : Cannot prepare internal mirrorlist: No URLs in mirrorlist 目录 一、域名解析 二、CentOS-AppStream.repo 三、CentOS-Base.repo 四、CentOS-Extras.repo 五、rpm更新 一、域名解析 先验证 ping www.baidu.com 不…

【C语言】结构体解谜:拆解数据的力量!

&#x1f341;博客主页&#xff1a;江池俊的博客 &#x1f4ab;收录专栏&#xff1a;C语言—探索高效编程的基石 &#x1f4a1;代码仓库&#xff1a;江池俊的代码仓库 &#x1f3aa;我的社区&#xff1a;GeekHub &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐…

9:00面试,9:06就出来了,问的问题实在有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到5月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%,…

Shell函数调用

定义一个函数&#xff0c;计算所有参数的和&#xff1a; #!/bin/bashfunction getsum(){local sum0for n in $do((sumn))donereturn $sum }getsum 10 20 55 15 #调用函数并传递参数 echo $?运行结果&#xff1a; 100

STM32 cubemx CAN

接收用到的结构体如下&#xff1a;CAN概念&#xff1a; 全称Controller Area Network&#xff0c;是一种半双工&#xff0c;异步通讯。 物理层&#xff1a; 闭环&#xff1a;允许总线最长40m&#xff0c;最高速1Mbps&#xff0c;规定总线两端各有一个120Ω电阻&#xff0c;闭环…