第五章.最邻近规则分类(KNN)

news2024/12/26 13:46:56

第五章.最邻近规则分类(KNN)

5.1 最邻近规则分类(KNN)

1.KNN的计算方式

1).为了判断未知实例的类别,以所有已知类别的实例作为参照选择参数K。

2).计算未知实例与所有已知实例的距离 (利用欧氏距离公式)

在这里插入图片描述
其他距离衡量余弦值距离(cos), 相关度 (correlation), 曼哈顿距离 (Manhattan distance)链接: 其他距离衡量方式

3).选择最近的K个已知实例

  • K的取值:一般取值为单数
    在这里插入图片描述

4).根据少数服从多数的投票法则(majority-voting),让未知实例归类为K个最邻近样本中最多数的类别。

2.KNN的缺点

1).算法复杂度高(需要比较所有已知实例与要分类的实例之间的距离)
2).当样本分布不平衡时,比如其中一类样本数量过大,新的未知实例容易被归类为这个主导样本。(原因:因为这类样本实例的数量过大,但这个新的未知实例并没有接近目标样本)

在这里插入图片描述

3.简单KNN示例

1).示例:电影类型的分类:判断“未知”是什么类型的电影

在这里插入图片描述

2).代码:

import numpy as np
import matplotlib.pyplot as plt
import operator

# 已知分类数据
x1 = np.array([3, 2, 1])
y1 = np.array([104, 100, 81])
x2 = np.array([101, 99, 98])
y2 = np.array([10, 5, 2])

scatter1 = plt.scatter(x1, y1, c='r')
scatter2 = plt.scatter(x2, y2, c='b')

# 位置数据
x = np.array([18])
y = np.array([90])

scatter3 = plt.scatter(x, y, c='k')

# 绘制图例
plt.legend(handles=[scatter1, scatter2, scatter3], labels=['LabelA', 'LabelB', 'X'], loc='best')

plt.show()

# 已知分类数据
x_data = np.array([[3, 104],
                   [2, 100],
                   [1, 81],
                   [101, 10],
                   [99, 5],
                   [81, 2]])
y_data = np.array(['A', 'A', 'A', 'B', 'B', 'B'])
x_test = np.array([18, 90])

# 计算样本数量
x_data_size = x_data.shape[0]


# 复制x_test数据,数据类型与x_data相同
x_test_new = np.tile(x_test, (x_data_size, 1))

# 欧式距离
distance = np.sqrt(np.sum((x_test_new - x_data) ** 2, axis=1))

# 排序:从小到大
sortDistance = distance.argsort()
print(sortDistance)

classCount = {}

# 设置K
k = 5
for i in range(k):
    # 获取标签
    votelabel = y_data[sortDistance[i]]

    # 获取标签数量
    classCount[votelabel] = classCount.get(votelabel, 0) + 1  # 返回该元素所对应的值

print(classCount)

# 根据operator.itemgetter(1)-第1个值对classCount排序,然后再取倒序,(classCount.items中包含两部分:key,value)
sortClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
print(sortClassCount)

# 获取数量最多的标签
knnclass = sortClassCount[0][0]
print(knnclass)

3).结果展示:

在这里插入图片描述

4.使用Iris数据集的KNN示例 (原理实现)

  • 数据属性:萼片长度(sepal length),萼片宽度(sepal width),花瓣长度(petal length),花瓣宽度(petal width)
  • 数据类别:Iris setosa, Iris versicolor, Iris virginica

1).代码:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix
import operator


def KNN(x_data, y_data, x_test, k):
    # 计算样本数量
    x_data_size = x_data.shape[0]

    # 赋值x_test数据,类型与x_data相同
    x_test_new = np.tile(x_test, (x_data_size, 1))

    # 欧氏距离
    distances = np.sqrt(np.sum((x_test_new - x_data) ** 2, axis=1))

    # 距离按照从小到大的顺序进行排列
    sortDistances = distances.argsort()

    classCount = {}
    for i in range(k):
        # 获取标签
        votelabel = y_data[sortDistances[i]]

        # 统计标签数量
        classCount[votelabel] = classCount.get(votelabel, 0) + 1  # 返回该元素所对应的值

    # 根据operator.itemgetter(1)-第1个值对classCount排序,然后再取倒序,(classCount.items中包含两部分:key,value)
    sortClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)

    return sortClassCount[0][0]


# 载入数据
iris = load_iris()

# 切分数据
# x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)  # 分割数据0.2为测试数据,0.8为训练数据

# 打乱数据
data_size = iris.data.shape[0]
index = [i for i in range(data_size)]
np.random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index]

# 切分数据集
test_size = 40
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

predictions = []
k = 5
for i in range(x_test.shape[0]):
    predictions.append(KNN(x_train, y_train, x_test[i], k))

print(classification_report(y_test, predictions))
print(confusion_matrix(y_test, predictions))

2).结果展示:

在这里插入图片描述

5.使用Iris数据集的KNN示例 (sklearn实现)

  • 数据属性:萼片长度(sepal length),萼片宽度(sepal width),花瓣长度(petal length),花瓣宽度(petal width)
  • 数据类别:Iris setosa, Iris versicolor, Iris virginica

1).代码:

import operator
import numpy as np
from sklearn import neighbors
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report, confusion_matrix

# 载入数据
iris = load_iris()

# 切分数据
# x_train, x_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2)  # 分割数据0.2为测试数据,0.8为训练数据

# 打乱数据
data_size = iris.data.shape[0]
index = [i for i in range(data_size)]
np.random.shuffle(index)
iris.data = iris.data[index]
iris.target = iris.target[index]

# 切分数据集
test_size = 40
x_train = iris.data[test_size:]
x_test = iris.data[:test_size]
y_train = iris.target[test_size:]
y_test = iris.target[:test_size]

# 创建模型
knn_model = neighbors.KNeighborsClassifier(n_neighbors=3)
knn_model.fit(x_train, y_train)

predictions = knn_model.predict(x_test)

print(classification_report(y_test, predictions))
print(confusion_matrix(y_test, predictions))

2).结果展示:

在这里插入图片描述

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

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

相关文章

Nginx 原理

nginx是一个反向代理服务器,那么他是如何做到和服务器的连接呢,怎么进行负载均衡呢?如何支持高并发??? Nginx的特点 (1)跨平台:Nginx 可以在大多数 Unix like OS编译运行…

mysql源码编译安装、mysql的主从复制、IOSQL线程优化

文章目录前言一、mysql源码编译安装二、主从复制1.主从复制的作用、原理2.实验过程三、gtid模式四、半同步模式:优化IO线程五、并行复制/多线程复制:优化SQL线程六、延迟复制前言 mysql是现在普遍使用的数据库,但是如果宕机了必然会造成数据…

用PS设置宽480像素*高640像素,分辨率300dpi,24位真彩色 大小限制20K到40K之间的照片

最近需要设置一组照片,是学生录取大学的电子照片,具体要求如下:宽480像素*高640像素,分辨率300dpi,24位真彩色 大小限制20K到40K之间;照片底色为白色或者蓝色,其他颜色均不符合条件。首先&#…

python+pytest接口自动化(3)-接口测试一般流程及方法

首先我们要明确,通常所接口测试其实就属于功能测试,主要校验接口是否实现预定的功能,虽然有些情况下可能还需要对接口进行性能测试、安全性测试。在学习接口自动化测试之前,我们先来了解手工接口测试怎样进行。URL组成为了更好的理…

数学建模介绍

🚀write in front🚀 📜所属专栏: 🛰️博客主页:睿睿的博客主页 🛰️代码仓库:🎉VS2022_C语言仓库 🎡您的点赞、关注、收藏、评论,是对我最大的激励…

【分布式系统】MinIO之Multi-Node Multi-Drive架构分析

文章目录架构分析节点资源硬盘资源服务安装安装步骤创建系统服务新建用户和用户组创建环境变量启动服务负载均衡代码集成注意最近打算使用MinIO替代原来使用的FastDFS,所以一直在学习MinIO的知识。这篇文章是基于MinIO多节点多驱动的部署进行研究。 架构分析 节点资…

迁移系统:换电脑或者硬盘转移磁盘文件的方法!

为什么要将操作系统迁移到新驱动? “将操作系统转移到新驱动您好,我刚刚为我的台式机订购了一个新的2TB希捷Barracuda硬盘,我想知道如何将我的Windows 10操作系统与我下载的其他一些软件一起转移过来。我使用新的/大的硬盘,然…

SpringBoot配置文件(properties yml)

查看官网更多系统配置项:https://docs.spring.io/spring-boot/docs/current/reference/html/application-properties.html#application-properties 1.配置⽂件作⽤ 整个项⽬中所有重要的数据都是在配置⽂件中配置的,⽐如:数据库的连接信息&am…

【华为OD机试模拟题】用 C++ 实现 - 能力组队(2023.Q1)

最近更新的博客 【华为OD机试模拟题】用 C++ 实现 - 去重求和(2023.Q1) 文章目录 最近更新的博客使用说明能力组队题目输入输出示例一输入输出说明示例二输入输出Code使用说明 参加华为od机试,一定要注意不要完全背诵代码,需要理解之后模仿写出,通过率才会高。 华为 O…

如何调教ChatGPT成为你的策略助手

量化策略开发,高质量社群,交易思路分享等相关内容 『正文』 ˇ 去年12月的时候我们初次体验ChatGPT,《ChatGPT生成量化交易策略》. 当时还是很惊喜的,可以辅助写代码,写注释,给出一些示例。使用的时间长了发现写一…

java面试题-GC垃圾回收

1.如何判断一个对象是否可以回收?Java虚拟机使用可达性分析算法来判断对象是否可以被回收。可达性分析算法的基本思路是从一组称为“GC Roots”的根对象开始遍历所有对象,只有从GC Roots开始的对象可以被访问到,其他的对象都被判定为无用对象…

13 Sentinel介绍

什么是Sentinel 分布式系统的流量防卫兵:随着微服务的普及,服务调用的稳定性变得越来越重要。Sentinel以“流量”为切入点,在流量控制、断路、负载保护等多个领域开展工作,保障服务可靠性。特点: 2. 丰富的应用场景&a…

Java 锁 高频 面试题回答

之前面了几个开发,问了关于锁的知识都是一问三不知 ,也许是业务场景中出现的比较少,所以这些人只能回答出一些基础的线程方面的知识,之前也看了些书,做一些记录 ,所以和大家分享一下 说一下乐观锁和悲观锁的…

Binder系统-C程序示例_框架分析

IPC:进程间的通信,远程调用,比如我们的A进程需要打开LED灯,调用led_open/led_ctl方法,但是他是没有权限去操作的,所以进程A通过:1.首先构造一些数据,2.通过IPC发送数据到进程B&#…

LPC4357JET256/LPC4337FET256/LPC4337JET256 32位MCU 204MHz 1MB

【详情】LPC4300系列微控制器(MCU)拥有全世界首款非对称双核数字信号控制器体系结构,配有ARM Cortex-M4和Cortex-M0处理器。这些NXP Cortex-M4 MCU配有Cortex-M0协处理器,优势在于,可在单一体系结构、开发环境中,开发数字信号处理…

画栋雕梁:定制投资体系2——规划开发能力圈

接上一篇,选择了适合自己“买”的方法,接下来就是要规划买的范围。这个范围一般受个人眼界、认知和理解的限制,也即是价值投资中的一个重要概念——能力圈。每个人的能力圈不可能一样,这和个人过往的学习、工作、成长经历相关。若…

PyQGIS开发 -- 基础学习笔记

1、自主学习QGIS开发虽然QGIS本身功能强大,但还是架不住我们要编写新的功能、新的业务流程、新的算法。前文中我们提到,扩展QGIS有2种方法,一是用Python、C来写QGIS的插件;另一种就是基于QGIS的C API开发独立应用程序。然而后者资…

前端食堂技术周刊第 72 期:Signals 是前端框架的未来、Chrome Headless、ts-reset、magic-regexp、Bun 新文档

美味值:🌟🌟🌟🌟🌟 口味:草莓番茄 食堂技术周刊仓库地址:https://github.com/Geekhyt/weekly 本期摘要 Signals 是前端框架的未来Chrome Headless 进化成完全体Next.js 13.2Deno…

纯x86汇编实现的多线程操作系统实践 - 第二章 BSP的启动

本章主要讲解BSP的初始化过程,对应的代码为mbr.asm。系统加电启动后,BIOS进行必要的初始化,并将硬盘的0扇区512字节的数据搬运到内存地址0x7c00处。之后,BSP的IP被置为0x7c00,开始运行。初始化代码mbr.asm将顺序执行以…

服务网格领域的百花齐放

服务网格是一种技术架构,它用于管理微服务系统中各个服务之间的通信,旨在处理微服务间的流量(也称为东西向流量)。 ​ 在云原生应用中,一个应用的背后可能存在着成百上千个服务,各个服务可能又有着若干个实…