机器学习模型——KNN

news2024/12/24 8:34:24

KNN的基本概念:

KNN(K-Nearest Neighbor)就是k个最近的邻居的意思,即每个样本都可以用它最接近的k个邻居来代表。KNN常用来处理分类问题,但也可以用来处理回归问题

核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。

相似度的衡量标准一般为距离,即距离越近相似度越高,距离越远相似度越小。

KNN算法三要素:

K值的选取

距离度量的方式

分类决策规则

K值的选择:

对于K值的选择,没有一个固定的经验(超参数)。选择较小的K值,就相当于用较小的邻域中的训练实例进行预测,训练误差会减小,容易发生过拟合,选择较大的K值,就相当于用较大邻域中的训练实例进行预测,其优点是可以减少泛华误差,缺点是训练误差会增大。K值一般根据样本的分布,选择较小的值,通常通过交叉验证选择一个合适的K值。

距离度量的方式:

欧氏距离(Euclidean Distance):这是最常用且直观的距离度量方法,它表示多维空间中两点之间的直线距离。在KNN中,欧氏距离通常用于连续数据的相似度计算。

曼哈顿距离(Manhattan Distance):也称为城市街区距离,它是沿着坐标轴测量的距离,适合用于城市地图中的距离计算,其中不能直接穿过建筑物或街区。在KNN中,当处理离散数据或者特征之间相互独立时,曼哈顿距离可能会被使用。

切比雪夫距离(Chebyshev Distance):在无限维的多项式空间中,切比雪夫距离是最大值范数,即各坐标数值差的最大值。这种距离度量方式适用于当一个属性对结果的影响非常显著时的场景。

除了上述三种,还有明可夫斯基距离(Minkowski Distance)余弦相似度(Cosine Similarity)等其他距离度量方式

KNN的优缺点:

KNN算法的优点:

理论成熟,思想简单,

既可以用来做分类也可以用来做回归;

可用于非线性分类; 对数据没有假设,准确度高,对噪声不敏感。

KNN算法的缺点:

计算量大;

样本不平衡问题 (即有些类别的样本数量很多,而其它样本的数量很少);

需要大量的内存。

KNN算法内参数:

n_neighbors:K值

即K值,邻近点的个数

weights:权重

{‘uniform’, ‘distance’}, callable or None, default=’uniform’

unifrom:表示权重相同,即只按照邻近点的多少判断其属于哪一类。

distance:表示权重于距离相关,距离近的点权重高,可能按照最近点来判断属于哪一类点

algorithm:计算临近点所用算法

brute:暴力法,即计算出所有点的距离,选择最近的几个点。

kd树:具体原理较为复杂,推荐大家

https://www.cnblogs.com/ssyfj/p/13053055.html     这里kd树的原理解释的非常清楚

ball_tree:kd树一般用于20维以下,而kd树一旦超过20维,效果会不尽人意,因此ball_tree就是为了解决高维问题而提出的,具体原理大家可以去网上学习一下原理。

p:默认值为2,表示Minkowski度量的幂参数

当p=1时,等效于使用曼哈顿距离(l1),当p=2时,等效于使用欧几里得距离(l2)。对于任意p,使用Minkowski距离(l_p)。此参数应为正数。

metric:距离的计算方式

比如:欧氏距离,曼哈顿距离等,默认为:minkowski

代码实现:

from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor   #C是处理分类,R是处理回归
from sklearn.datasets import load_wine

wine = load_wine()

X = wine.data
y = wine.target

knn = KNeighborsClassifier(n_neighbors=5)

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)

knn.fit(X_train,y_train)

print(knn.score(X_test,y_test))


#  结果为:0.7407407407407407

# 可以看到结果并不是很好,所以我们进行优化,调参

from sklearn.neighbors import KNeighborsClassifier,KNeighborsRegressor   #C是处理分类,R是处理回归
from sklearn.datasets import load_wine

wine = load_wine()

X = wine.data
y = wine.target

knn = KNeighborsClassifier(n_neighbors=10)

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)

# print(knn.score(X_test,y_test))

from sklearn.preprocessing import StandardScaler
from sklearn.metrics import confusion_matrix

ss = StandardScaler()
ss.fit(X_train)
X_train = ss.transform(X_train)
X_test = ss.transform(X_test)

knn.fit(X_train,y_train)

cm = confusion_matrix(y_true=y_test,y_pred=knn.predict(X_test))

import seaborn as sns
import matplotlib.pyplot as plt

sns.heatmap(cm,annot=True,cmap="Blues")
print(knn.score(X_test,y_test))
plt.show()

# 结果:0.9629629629629629
# 可以看出,调参后准确率有明显改变

上述是处理分类问题: 对于回归问题我们怎么做呢

import numpy as np
from sklearn.neighbors import KNeighborsRegressor
from sklearn.model_selection import train_test_split


# 创建数据集
X = np.array([[1, 2], [3, 4], [5, 6], [7, 8], [9, 10]])
y = np.array([2, 4, 6, 8, 10])

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

# 创建KNN回归模型
knn = KNeighborsRegressor(n_neighbors=3)

# 训练模型
knn.fit(X_train, y_train)

# 预测
y_pred = knn.predict(X_test)

# 将预测值打印出来
print(y_pred)

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

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

相关文章

好物视频素材哪里找,下面推荐几个好用给大家

想要创作出精彩的好物视频,离不开优质的素材。在这里,我将介绍一些提供免费好物视频素材的网站,让你轻松找到所需素材。 首先,蛙学网(https://www.waxuewang.com)是一个提供高质量视频素材的网站&#xff…

Redis面试题-缓存雪崩、缓存穿透、缓存击穿问题

1 穿透: 两边都不存在(皇帝的新装) (黑名单) (布隆过滤器) 2 击穿:一个热点的key失效了,这时大量的并发请求直接到达数据库. (提前预热) 3 雪崩&#xff1a…

好物视频素材库免费下载去哪找?

你是不是在找抖音好物视频素材库免费的网站,可是不知道哪儿能找到?别急,我来给你推荐几个网站,保证让你找到满意的素材! 首先,蛙学网(https://www.waxuewang.com)是一个提供高质量视…

电子价签通信协议解析:蓝牙5.0有何优势?

电子价签是一种新型的零售显示技术,它可以实时更新商品价格、促销信息等内容,为消费者提供更加便捷的购物体验。电子价签的通信协议是决定其性能的关键因素之一,而蓝牙5.0则是目前相对更适合电子价签的通信协议。 电子价签的工作模式 以云…

Notepad++:格式化json字符串(带转义)

目录 一、效果呈现 二、去除json字符串转义 三、格式化json字符串 一、效果呈现 格式化前 带字符串转义,带unicode编码字符 格式化后 二、去除json字符串转义 方法:采用Notepad的普通替换 第一:\"替换为" 第二:\\…

智能算法-遗传算法 学习笔记

适应度的计算可类别为神经网络的目标函数,但此算法属于无监督学习,宏观来讲为搜寻最优解(梯度)的方式不同? 但神经网络中好像并不存在变异操作(参数矩阵突变)? 交叉的话残差网络ResN…

第一性原理计算代码可使用1个月有效期,龙讯旷腾PWmat

龙讯旷腾系列产品正在陆续入驻国家超算互联网(https://www.scnet.cn),有自己的网上商城了!PWmat(如果您喜欢命令行)以及Q-FlowPWmat组合产品(如果您喜欢用可视化工作流提交任务)&…

iOS网络抓包工具全解析

摘要 本文将深入探讨iOS平台上常用的网络抓包工具,包括Charles、克魔助手、Thor和Http Catcher,以及通过SSH连接进行抓包的方法。此外,还介绍了克魔开发助手作为iOS应用开发的辅助工具,提供的全方面性能监控和调试功能。 在iOS应…

nodejs中使用WebScoket的简单示例

前言 WebScoket可以用来实现即时通信,一般用于通信聊天工具或者是需要实时接受数据等功能 在浏览器环境中,WebScoket是一个构造函数,需要new创建连接的实例; 在nodejs环境中,则需要使用ws模块来完成服务的创建。 示例 下面是可以直接使用的代码,不需要修改 node创建服务端…

31-3 文件包含漏洞 - 文件包含漏洞利用(CVE-2021-3019:Lanproxy 任意文件读取漏洞复现)

一、Lanproxy简介: lanproxy是一个将局域网个人电脑、服务器代理到公网的内网穿透工具,支持TCP流量转发,可支持任何TCP上层协议(访问内网网站、本地支付接口调试、SSH访问、远程桌面等)。 二、漏洞概述: Lanproxy1.0 版本存在目录遍历漏洞,可通过绕过路径限制(../)来…

手游行业如何做好软文推广?媒介盒子揭秘

随着各方面消费持续复苏,手游行业也在逐渐回暖,为了宣传游戏特色和积累游戏热度,很多运营商都会在各大平台投放软文。然而有许多商家在软文投放时只关注数量 不关注质量,导致软文效果不是很好。今天媒介盒子就来和大家聊聊&#x…

机器学习 | 期望最大化(EM)算法介绍和实现

在现实世界的机器学习应用中,通常有许多相关的特征,但只有其中的一个子集是可观察的。当处理有时可观察而有时不可观察的变量时,确实可以利用该变量可见或可观察的实例,以便学习和预测不可观察的实例。这种方法通常被称为处理缺失…

【C++】手撕哈希表的闭散列和开散列

> 作者:დ旧言~ > 座右铭:松树千年终是朽,槿花一日自为荣。 > 目标:手撕哈希表的闭散列和开散列 > 毒鸡汤:谁不是一边受伤,一边学会坚强。 > 专栏选自:C嘎嘎进阶 > 望小伙伴们…

全国超市数据可视化仪表板制作

全国超市消费数据展示 指定 Top几 客户销费数据展示 指定 Top几 省份销费数据展示 省份销售额数据分析 完整结果

蓝牙耳机哪个品牌质量最好最耐用?购前必读的高热度机型指南!

​面对市场上众多不同场景使用的蓝牙耳机,我们该如何选择呢?我们最怕遇到耳机延迟高、不防水防汗、音质差以及佩戴体验差的问题。针对这些常见问题,我这次精选了五款市面上热销且质量不错的蓝牙耳机分享给大家,让我们一起来看看吧…

当当狸智能激光雕刻机 多种材质自由雕刻,轻松打造独一无二的作品

提及“激光雕刻”,大多数人的印象一般都是:笨重巨大、价格昂贵、操作复杂、使用门槛较高、调试难度大...不是普通人能够随意操作的,让人望尘莫及。 而小米有品上新的这台「当当狸桌面智能激光雕刻机L1」,将超乎你的想象&#xff…

【unity】如何汉化unity编译器

在【unity】如何汉化unity Hub这篇文章中,我们已经完成了unity Hub的汉化,现在让我们对unity Hub安装的编译器也进行下汉化处理。 第一步:在unity Hub软件左侧栏目中点击安装,选择需要汉化的编译器,再点击设置图片按钮…

【MATLAB源码-第171期】基于matlab的布谷鸟优化算法(COA)无人机三维路径规划,输出做短路径图和适应度曲线

操作环境: MATLAB 2022a 1、算法描述 布谷鸟优化算法(Cuckoo Optimization Algorithm, COA)是一种启发式搜索算法,其设计灵感源自于布谷鸟的独特生活习性,尤其是它们的寄生繁殖行为。该算法通过模拟布谷鸟在自然界中…

RabbitMQ 的高阶应用及可靠性保证

目录 一、RabbitMQ 高阶应用 1.1 消息何去何从 1.2 过期时间 1.3 死信队列 1.4 延迟队列 1.5 优先级队列 1.6 消费质量保证(QOS) 二、持久化 三、生产者确认 四、消息可靠性和重复消费 4.1 消息可靠性 4.2 重复消费问题 上篇文章介绍了 Rabb…

理解JVM:从字节码到程序运行

大家好,我是程序员大猩猩。 今天我们来讲一下JVM,好多面试者在面试的时候,都会被问及JVM相关知识。那么JVM到底是什么,要理解它到底是出于什么原因? JVM俗称Java虚拟机,它是一个抽象的计算机,…