机器学习:k近邻

所有代码和文档均在golitter/Decoding-ML-Top10: 使用 Python 优雅地实现机器学习十大经典算法。 (github.com),欢迎查看。

K 邻近算法(K-Nearest Neighbors,简称 KNN)是一种经典的机器学习算法,主要用于分类和回归任务。它的核心思想是:给定一个新的数据点,通过查找训练数据中最接近的 K 个邻居,并根据这些邻居的标签来预测新数据点的标签。

KNN 是一种 基于实例的学习(Instance-based learning)算法。在训练阶段,它并不构建显式的模型,而是将训练数据存储起来,在预测阶段计算待预测点与训练集中所有点的距离,然后选择 K 个最近的邻居,根据邻居的标签进行投票或平均来做出预测。

KNN 的优点在于其简单易懂、无需训练过程,并且适用于大多数任务。它能够处理复杂的非线性问题,不依赖数据分布假设,能够很好地适应复杂的决策边界。

然而,KNN 的缺点也很明显。它的计算开销大,因为每次预测都需要计算所有训练数据的距离,导致在大数据集上表现不佳。此外,KNN 需要存储所有训练数据,占用较大的内存空间,并且对异常值敏感,可能会影响预测结果的准确性。

KNN算法步骤:

  1. 选择 K 个邻居的数量,K 值通常是一个奇数,以避免平票的情况。
  2. 计算待预测数据点与训练数据集中每个点的距离。
  3. 根据计算出的距离选择 K 个最接近的点。
  4. 对于分类任务,返回 K 个邻居中最多的类别;对于回归任务,返回 K 个邻居标签的均值。

代码实现

数据处理:使用iris.data数据集,用PCA进行降维。

import numpy as np
import pandas as pd


def pca(X: np.array, n_components: int) -> np.array:
	"""
	PCA 进行降维。
	"""
	# 1. 数据标准化(去均值)
	X_mean = np.mean(X, axis=0)
	X_centered = X - X_mean

	# 2. 计算协方差矩阵
	covariance_matrix = np.cov(X_centered, rowvar=False)

	# 3. 计算特征值和特征向量
	eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)

	# 4. 按特征值降序排序
	sorted_indices = np.argsort(eigenvalues)[::-1]
	top_eigenvectors = eigenvectors[:, sorted_indices[:n_components]]

	# 5. 投影到新空间
	X_pca = np.dot(X_centered, top_eigenvectors)

	return X_pca


def get_data():
	data = pd.read_csv('iris.csv', header=None)
	# print(data.dtypes)
	unq = data.iloc[:, -1].unique()
	for i, u in enumerate(unq):
		data.iloc[:, -1] = data.iloc[:, -1].apply(lambda x: i if x == u else x)

	# print(data.sample(5))
	xuanze = np.random.choice([True, False], len(data), replace=True, p=[0.8, 0.2])
	train_data = data[xuanze]
	test_data = data[~xuanze]
	train_data = np.array(
		train_data,
		dtype=np.float32,
	)
	test_data = np.array(test_data, dtype=np.float32)
	# 归一化
	train_data[:, :-1] = (train_data[:, :-1] - train_data[:, :-1].mean(axis=0)) / train_data[:, :-1].std(axis=0)
	test_data[:, :-1] = (test_data[:, :-1] - test_data[:, :-1].mean(axis=0)) / test_data[:, :-1].std(axis=0)
	return (
		pca(train_data[:, :-1], 2),
		train_data[:, -1].astype(np.int32),
		pca(test_data[:, :-1], 2),
		test_data[:, -1].astype(np.int32),
	)


if __name__ == '__main__':
	x_train, y_train, x_test, y_test = get_data()
	print(y_train.dtype)
	print(x_test, y_test)
	print(x_train.shape, y_train.shape)

knn过程:

from data_processing import get_data
import numpy as np
import matplotlib.pyplot as plt


def euclidean_distance(x_train: np.array, x_test: np.array) -> np.array:
	"""
	计算欧拉距离
	"""
	return np.sqrt(np.sum((x_train - x_test) ** 2, axis=1))


def knn(k: int, x_train: np.array, y_train: np.array, x_test: np.array) -> np.array:
	"""
	k近邻算法
	"""
	predictions = []
	for test in x_test:
		distances = euclidean_distance(x_train, test)
		nearest_indices = np.argsort(distances)[:k]  # 返回最近的k个点的索引
		nearest_labels = y_train[nearest_indices]  # 返回最近的k个点的标签
		prediction = np.argmax(np.bincount(nearest_labels))  # 返回最近的k个点中出现次数最多的标签
		predictions.append(prediction)
	return np.array(predictions)


def accuracy(predictions: np.array, y_test: np.array) -> float:
	"""
	计算准确率
	"""
	return np.sum(predictions == y_test) / len(y_test)


if __name__ == '__main__':
	k = 5
	x_train, y_train, x_test, y_test = get_data()
	predictions = knn(k, x_train, y_train, x_test)
	acc = accuracy(predictions, y_test)
	print(f'准确率为: {acc * 100:.2f}')

	# 绘制训练数据
	plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap='viridis', marker='o', label='Train Data', alpha=0.7)

	# 绘制测试数据
	plt.scatter(x_test[:, 0], x_test[:, 1], c=y_test, cmap='coolwarm', marker='x', label='Test Data', alpha=0.7)

	# 绘制预测结果
	plt.scatter(
		x_test[:, 0],
		x_test[:, 1],
		c=predictions,
		cmap='coolwarm',
		marker='.',
		edgecolor='black',
		alpha=0.7,
		label='Predictions',
	)

	# 添加标题和标签
	plt.title('KNN Classification Results')
	plt.xlabel('Feature 1')
	plt.ylabel('Feature 2')
	plt.legend()

	# 显示图形
	plt.show()

在这里插入图片描述

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

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

相关文章

低空经济:开启未来空中生活的全新蓝海

引言 随着科技的进步,我们不再仅仅依赖地面交通和传统物流。你是否曾幻想过,未来的某一天,快递、外卖可以像魔法一样直接从空中送到你手中?或者,你能乘坐小型飞行器,快速穿梭于城市之间,告别拥堵…

DeepSeek核心算法解析:如何打造比肩ChatGPT的国产大模型

注:此文章内容均节选自充电了么创始人,CEO兼CTO陈敬雷老师的新书《自然语言处理原理与实战》(人工智能科学与技术丛书)【陈敬雷编著】【清华大学出版社】 文章目录 DeepSeek大模型技术系列一DeepSeek核心算法解析:如何…

苍穹外卖day4 redis相关简单知识 店铺营业状态设置

内存存储 键值对 key-value 一般用于处理突发性大量请求数据操作(暂时浅显理解) 读写速度极快,常用于缓存数据,减少对数据库的访问压力,提高系统性能。例如,可以缓存用户会话、商品信息、页面数据 设置默…

API 接口自动化

HTTP协议 - 白月黑羽 HTTP协议简介 如果客户端是浏览器,如何在chrome浏览器中查看 请求和响应的HTTP消息?按f12-》network 清除当前信息 响应的消息体在Response里看 点preview,可以看响应的消息体展开的格式 HTTP请求消息 请求头 reques…

Oracle序列(基础操作)

序列概念 序列是用于生成唯一、连续序号的对象。 序列可以是升序的,也可以是降序的。 使用CREATE SEQUENCE语句创建序列。 start with 1 指定第一个序号从1开始 increment by 1 指定序号之间的间隔为1 increment by -1 降序1000 999 998这样 maxvalue 2000 表…

【pytorch】weight_norm和spectral_norm

apply_parametrization_norm 和spectral_norm是 PyTorch 中用于对模型参数进行规范化的方法,但它们在实现和使用上有显著的区别。以下是它们的主要区别和对比: 实现方式 weight_norm: weight_norm 是一种参数重参数化技术,将权…

unity学习44:学习Animator 的一个动作捕捉网站,实测好用

目录 1 动作捕捉网站 2 注册和下载 3 比如首页的内容,可以直接下载为fbx模型文件 4 上传并修改 5 在 unity里使用 5.1 下载的fbx文件直接拖入到unity 5.2 动画修改 5.3 游戏里播放 1 动作捕捉网站 一个动作捕捉网站 AI神器集合网站 千面视频动捕 | AI神器…

云原生(五十五) | ECS中自建数据库迁移到RDS

文章目录 ECS中自建数据库迁移到RDS 一、场景说明 二、ECS中自建数据库迁移到RDS实现步骤 三、 创建wordpress数据库 四、登录ECS导出wordpress数据库 五、返回RDS数据库管理控制台 六、开启外网地址并设置白名单 七、获取RDS外网访问地址 八、重新设置wordpress的wp-…

【NLP 22、语言模型 language model】

有时候我也想听听,我在你心里,是什么样子 —— 25.1.12 一、什么是语言模型 语言是灵活的,也是有规律的 了解一门语言的人可以判断一句话是否“合理” 通俗来讲,语言模型用来评价一句话(句子可以看作是字的组合)是否“合理”或…

qt + opengl 给立方体增加阴影

在前几篇文章里面学会了通过opengl实现一个立方体,那么这篇我们来学习光照。 风氏光照模型的主要结构由3个分量组成:环境(Ambient)、漫反射(Diffuse)和镜面(Specular)光照。下面这张图展示了这些光照分量看起来的样子: 1 环境光照(Ambient …

【鱼眼镜头12】Scaramuzza的鱼眼相机模型实操,不依赖于具体的相机几何结构,直接从图像数据出发,因此更具灵活性。

文章目录 Scaramuzza相机模型标定效果2、原理和代码代码1、 2D映射到3D,函数输入为2D点坐标OCAM参数代码功能详解2、3D --> 2D 3、总结Scaramuzza 模型的核心思想Scaramuzza 模型的核心思想与 Kannala-Brandt 模型的对比Scaramuzza 模型的独特之处Scaramuzza 的意…

【Linux】【进程】epoll内核实现总结+ET和LT模式内核实现方式

【Linux】【网络】epoll内核实现总结ET和LT模式内核实现方式 1.epoll的工作原理 eventpoll结构 当某一进程调用epoll_create方法时,Linux内核会创建一个eventpoll结构体,这个结构体中有两个成员与epoll的使用方式密切相关. struct eventpoll{..../*红…

android 自定义view时钟显示

一、前言 1、圆形数字显示1到12,有指针,分针,秒针。定时器秒针跳动。 2、使用自定义view,继承view实现。 3、使用attr配置属性。 二、效果图 三、代码实现 属性配置 <?xml version="1.0" encoding="utf-8"?> <resources><decla…

使用 DeepSeek 生成商城流程图

步骤 1.下载 mermaid 2.使用 DeepSeek 生成 mermaid 格式 3.复制内容到 4.保存备用。 结束。

数据结构 day06

数据结构 day06 6. 双向链表6.3. 双向循环链表 7. 树 tree7.1. 特点7.1.1. 什么是树7.1.2. 树的特性7.1.3. 关于树的一些术语 7.2. 二叉树7.2.1. 什么是二叉树7.2.2. 二叉树的性质7.2.3. 满二叉树和完全二叉树的区别7.2.4. 二叉树的遍历&#xff08;画图&#xff09;7.2.5. 二叉…

机械学习基础-5.分类-数据建模与机械智能课程自留

data modeling and machine intelligence - CLASSIFICATION 为什么我们不将回归技术用于分类&#xff1f;贝叶斯分类器&#xff08;The Bayes Classifier&#xff09;逻辑回归&#xff08;Logistic Regression&#xff09;对逻辑回归的更多直观理解逻辑 /sigmoid 函数的导数我们…

音频进阶学习十三——Z变换二(有理z变换、稳定性与反变换)

文章目录 前言一、有理Z变换1.定义2.作用3.LTI系统的传递函数1&#xff09;传递函数的定义2&#xff09;差分方程转换传递函数 二、极点和零点1.有理分式的极点和零点2.稳定性实例 二、逆Z变换1.观察法2.部分分式展开法1&#xff09;定义2&#xff09;举例 3.幂级数法/长除法1&…

centos部署open-webui

提示&#xff1a;本文将简要介绍一下在linux下open-webui的安装过程,安装中未使用虚拟环境。 文章目录 一、open-webui是什么&#xff1f;二、安装流程1.openssl升级2.Python3.11安装3.sqlite安装升级4.pip 下载安装open-webui 总结 一、open-webui是什么&#xff1f; Open W…

DeepSeek R1 32B 本地部署实战

#DeepSeek# DeepSeek是一款基于人工智能的智能助手&#xff0c;专为提升工作效率和信息获取能力而设计。它结合了自然语言处理、机器学习和大数据技术&#xff0c;能够快速理解用户需求并提供精准的答案或解决方案。 DeepSeek的核心功能 智能问答 DeepSeek可以回答各种问题&…

day09_实时类标签/指标

文章目录 day09_实时类标签/指标一、日志数据实时采集2、Flume简介2.3 项目日志数据采集Flume配置2.3.1 涉及的Flume组件和参数2.3.2 Nginx日志采集2.3.3 用户行为日志采集 二、Nginx日志数据统计1、日志格式说明2、数据ETL2.1 日志抽取2.1.1 正则表达式2.1.2 基于Spark实现Ngi…