[机器学习]KNN——K邻近算法实现

一.K邻近算法概念

二.代码实现 

# 0. 引入依赖
import numpy as np
import pandas as pd

# 这里直接引入sklearn里的数据集,iris鸢尾花
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split  # 切分数据集为训练集和测试集
from sklearn.metrics import accuracy_score # 计算分类预测的准确率

# 1. 数据加载和预处理
iris = load_iris()
# print(iris)

df = pd.DataFrame(data = iris.data, columns = iris.feature_names)
df['class'] = iris.target
df['class'] = df['class'].map({0: iris.target_names[0], 1: iris.target_names[1], 2: iris.target_names[2]})
df.head(10)
# df.describe()
# print(df)

x = iris.data
y = iris.target.reshape(-1,1)
# print(x.shape, y.shape)

# 划分训练集和测试集
# test_size:测试比例,random_state:随机划分,stratify:按照y的分布等比例分割
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=35, stratify=y)
# print(x_train.shape, y_train.shape)
# print(x_test.shape, y_test.shape)

# 2. 核心算法实现
# 距离函数定义
def l1_distance(a, b):
    return np.sum(np.abs(a - b), axis=1) # 曼哈顿距离

def l2_distance(a, b):
    return np.sqrt(np.sum((a - b) ** 2, axis=1)) # 欧氏距离

# 分类器实现
class kNN(object):
    # 定义一个初始化方法,__init__ 是类的构造方法
    def __init__(self, n_neighbors=1, dist_func=l1_distance):
        self.n_neighbors = n_neighbors
        self.dist_func = dist_func

    # 训练模型方法
    def fit(self, x, y):
        self.x_train = x
        self.y_train = y

    # 模型预测方法
    def predict(self, x):
        # 初始化预测分类数组:初始化一个0数组,x.shape[0]:行数,1:列数,dtype:定义此数据类型
        y_pred = np.zeros((x.shape[0], 1), dtype=self.y_train.dtype)

        # 遍历输入的x数据点,取出每一个数据点的序号i和数据x_test。enumerate:可同时拿出两个(序号和值)
        for i, x_test in enumerate(x):
            # x_test跟所有训练数据计算距离
            distances = self.dist_func(self.x_train, x_test)

            # 得到的距离按照由近到远排序,取出索引值
            nn_index = np.argsort(distances)

            # 选取最近的k个点,保存它们对应的分类类别,n_neighbors:表示取k个邻近的值
            nn_y = self.y_train[nn_index[0:self.n_neighbors]].ravel()

            # 统计类别中出现频率最高的那个,赋给y_pred[i]
            y_pred[i] = np.argmax(np.bincount(nn_y))

        return y_pred

"""
    a = np.array([[3,2,4,2],
                 [2,1,4,23],
                 [12,3,2,3],
                 [2,3,15,23],
                 [1,3,2,3],
                 [13,3,2,2],
                 [213,16,3,63],
                 [23,62,23,23],
                 [23,16,23,43]])
    b = np.array([[1,1,1,1]])
    print("a-b:",a-b) # 下面的a-b:a表示数组,b表示向量
    np.sum(np.abs(a - b), axis=1)
    dist = np.sqrt( np.sum((a-b) ** 2, axis=1) )
    nn_index = np.argsort(dist)
    
    print("dist: ", dist)
    print("nn_index: ", nn_index)
    nn_y = y_train[nn_index[:9]].ravel()
    print("未转换前的y:",y_train[:8])
    print("nn_y:", nn_y)
    print("y计数:",np.bincount(nn_y))
    print("取出现次数最多的y:",np.argmax(np.bincount(nn_y)))
"""

# 3. 测试
# 定义一个knn实例
knn = kNN(n_neighbors = 3)
# 训练模型
knn.fit(x_train, y_train)
# 传入测试数据,做预测
y_pred = knn.predict(x_test)
print("y测试值: ", y_test.ravel())
print("y预测值: ", y_pred.ravel())
# 求出预测准确率
accuracy = accuracy_score(y_test, y_pred)
print("预测准确率: ", accuracy)

# 定义一个knn实例
knn = kNN()
# 训练模型
knn.fit(x_train, y_train)
# 保存结果list
result_list = []
# 针对不同的参数选取,做预测
for p in [1, 2]:
    knn.dist_func = l1_distance if p == 1 else l2_distance
    # 考虑不同的k取值,步长为2(取奇数1,3,5,7,9)
    for k in range(1, 10, 2):
        knn.n_neighbors = k
        # 传入测试数据,做预测
        y_pred = knn.predict(x_test)
        # 求出预测准确率
        accuracy = accuracy_score(y_test, y_pred)
        result_list.append([k, '曼哈顿距离' if p == 1 else '欧氏距离', accuracy])
df = pd.DataFrame(result_list, columns=['k', '距离函数', '预测准确率'])
print(df)

y测试值:  [2 1 2 2 0 0 2 0 1 1 2 0 1 1 1 2 2 0 1 2 1 0 0 0 1 2 0 2 0 0 2 1 0 2 1 0 2 1 2 2 1 1 1 0 0]
y预测值:  [2 1 2 2 0 0 2 0 1 1 1 0 1 1 1 2 2 0 1 2 1 0 0 0 1 2 0 2 0 0 2 1 0 2 1 0 2 1 2 1 1 2 1 0 0]
预测准确率:  0.9333333333333333
   k   距离函数     预测准确率
0  1  曼哈顿距离  0.933333
1  3  曼哈顿距离  0.933333
2  5  曼哈顿距离  0.977778
3  7  曼哈顿距离  0.955556
4  9  曼哈顿距离  0.955556
5  1   欧氏距离  0.933333
6  3   欧氏距离  0.933333
7  5   欧氏距离  0.977778
8  7   欧氏距离  0.977778
9  9   欧氏距离  0.977778

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

基于Python 网络爬虫和可视化的房源信息的设计与实现

摘 要 一般来说,在房地产行业,房源信息采集,对企业来说至关重要,通过人工采集数据的方式进行数据收集,既耗时又费力,影响工作效率,还导致信息时效性变差,可靠性偏低,不利…

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab)

2023年算法GWCA -CNN-BiLSTM-ATTENTION回归预测(matlab) GWCA -CNN-BiLSTM-Attention长城建造算法优化卷积-长短期记忆神经网络结合注意力机制的数据回归预测 Matlab语言。 长城建造算法(Great Wall Construction Algorithm,GWC…

Zabbix交换分区使用率过高排查

Zabbix High swap space usage 问题现象 Zabbix 出现Highswap space usage(less than 50% free)告警,提示交换分区空间使用率超过50% 处理过程 1. 确定swap分区是否已占满 free -h登录Zabbix服务器检查内存情况,检查发现Linux服务器空闲的内存还有不少…

Docker安装RcoketMQ

1、Docker安装RcoketMQ-4.9.4 在同级文件夹创建目录config,并在里面创建文件broker.conf,文件内容如下: brokerClusterNameDefaultCluster brokerNamebroker-a brokerId0 deleteWhen04 fileReservedTime48 brokerRoleASYNC_MASTER flushDis…

【C/C++ 03】堆排序

堆排序是选择排序算法的进阶,也就是通过二叉树节点存储数组,并通过root节点存储最值与二叉树最后一个节点进行交换完成排序,降低了时间复杂度。在大数据时代,堆排序常用于处理Top-K问题。 排序对象:数组时间复杂度&am…

SpringBoot引入主盘探活定时任务

主盘探活通常是指检查存储设备(例如硬盘)是否可读写,但在Java中并没有直接针对硬件级别的磁盘探活API。然而,我们可以模拟一个场景,即检查某个目录或文件是否可以被Java程序正常读写,以此作为主盘活跃的一个…

MySQL安全(一)权限系统

一、授权 1、创建用户 在MySQL中,管理员可以通过以下命令创建用户: namelocalhost IDENTIFIED BY password; name是要创建的用户名,localhost表示该用户只能从本地连接到MySQL,password是该用户的密码。如果要允许该用户从任何…

源码安装nginx并提供服务脚本

一、下载nginx ①官网复制下载链接 ②在Linux中下载 [rootopenEuler2 ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz 二、解压并指定路径 [rootopenEuler2 ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/ 三、安装依赖 dnf install -y gcc gcc-c mak…

在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1?

一、问题 在Visual Studio 2022中将源文件扩展名改为 .c 后,没有显示 #define _CRT_SECURE_NO_WARNINGS 1? 二、解答 对于使用了不安全的C运行时库函数(如strcpy、scanf等)而触发的安全警告,编译器不会默认包含_CRT_S…

汽车网络安全dos, someip

汽车Cyber Security入门之DoS 攻防 - 知乎 3、SOME/IP-TP 近年来火热地谈论下一代EE架构和SOA的时候,总离不开SOME/IP这个进程间通讯协议。在许多应用场景中,需要通过UDP传输大型的SOME/IP有效载荷。鉴于在以太网上传输数据包的大小限制,SO…

学科网免费自助代下载

这个网站制作的初衷,是为了解决我的教师朋友,没办法很自由的从学科网上下载资料的烦恼。 访问链接:http://47.119.19.90/xuekewang/#/downloadFile 演示视频: 学科网下载演示视频 只需要 获取下载码 ,然后 输入下载链…

Vue-40、Vue中TodoList案例

1、MyHeader.vue <template><div class"todo-header"><input type"text" placeholder"请输入你的任务名称&#xff0c;按回车键确认" v-model"title" keyup.enter"add"></div> </template>&…

YOLOv8改进 | Neck篇 | 2024.1最新MFDS-DETR的HS-FPN改进特征融合层(降低100W参数,全网独家首发)

一、本文介绍 本文给大家带来的改进机制是最近这几天最新发布的改进机制MFDS-DETR提出的一种HS-FPN结构,其是一种为白细胞检测设计的网络结构,主要用于解决白细胞数据集中的多尺度挑战。它的基本原理包括两个关键部分:特征选择模块和特征融合模块,在本文的下面均会有讲解,…

测试ASP.NET Core项目调用EasyCaching的基本用法(InMemory)

EasyCaching属于开源缓存库&#xff0c;支持基本缓存方式及高级缓存用法&#xff0c;提高用户操作缓存的效率。EasyCaching支持的缓存方式包括以下类型&#xff0c;本文学习最基础的InMemory方式的基本用法。   EasyCaching.InMemory包属于基于内存的缓存库&#xff0c;使用的…

记录Postman接口测试,配置token为全局变量,配置测试环境

为什么要进行接口测试&#xff1a; 因为不同端&#xff08;前段&#xff0c;后端&#xff09;的工作进度不一样&#xff0c;所以我们要针对最开始出来的接口&#xff0c;以及需要调用其他公司的&#xff08;银行&#xff0c;支付宝&#xff0c;微信&#xff0c;qq等&#xff0…

ardupilot 遥控器输入量如何转换成目标加速度

目录 文章目录 目录摘要1.理论依据2程序细节分析3.代码实现 摘要 主要根据遥控器的横滚&#xff0c;俯仰通道值转换成对应的欧拉角度&#xff0c;然后根据欧拉角度转换成地理坐标系下的目标加速度的过程。 1.理论依据 2程序细节分析 根据公式&#xff08;8&#xff09;我们可…

【开源】基于JAVA+Vue+SpringBoot的康复中心管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 普通用户模块2.2 护工模块2.3 管理员模块 三、系统展示四、核心代码4.1 查询康复护理4.2 新增康复训练4.3 查询房间4.4 查询来访4.5 新增用药 五、免责说明 一、摘要 1.1 项目介绍 基于JAVAVueSpringBootMySQL的康复中…

关于C++ 出现Bus error问题的排查

前言 项目代码中经常出现莫名其妙的Bus error问题&#xff0c;并且代码中增加很多try catch 后依然不能将错误捕获&#xff0c;一旦Bus erro出现&#xff0c;进程直接崩溃掉。类似如下这种: 经查询google&#xff0c;出现该问题一般是因为地址未对齐引起的&#xff0c;也就是…

数据结构之单链表详解

前言 之前大摆了5天多&#xff0c;没怎么学编程&#xff0c;自昨日起&#xff0c;觉不可如此&#xff0c;痛定思痛&#xff0c;开始继续学习&#xff0c;昨天刷了20多道简单级别的力扣&#xff0c;今天想把链表好好巩固一下&#xff0c;于是乎&#xff0c;把单链表的增删查改搞…

hadoop必记知识点(3)

在这里插入图片描述 Hadoop的Combiner的作用 Hadoop的Combiner是一个在map任务执行完之后、在数据被发送到reduce任务之前执行的函数。其主要作用是减少Map和Reduce之间的数据传输量&#xff0c;提高Hadoop处理大数据的效率。 具体来说&#xff0c;Combiner会对map任务输出的k…