机器学习模型——KNN

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)

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

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

相关文章

TCPView下载安装使用教程(图文教程)超详细

「作者简介」:CSDN top100、阿里云博客专家、华为云享专家、网络安全领域优质创作者 「推荐专栏」:更多干货,请关注专栏《网络安全自学教程》 TCPView是微软提供的一款「查看网络连接」和进程的工具,常用来查看电脑上的TCP/UDP连接…

水位计在水利工程安全监测中起到的作用

水利工程,作为人类调控水资源、抵御水患以及利用水能的重要工具,其安全性、稳定性与高效性显得尤为关键。水位是水利工程中最基础且至关重要的参数,其精确且实时的监测对于工程的日常运行与管理具有无可替代的重要性。水位计,作为…

多源统一视频融合可视指挥调度平台VMS/smarteye系统概述

系统功能 1. 集成了视频监控典型的常用功能,包括录像(本地录像、云端录像(录像计划、下载计划-无线导出)、远程检索回放)、实时预览(PTZ云台操控、轮播、多屏操控等)、地图-轨迹回放、语音对讲…

ES面试题

1、如何同步索引库 同步调用 在完成数据库操作后,直接调用搜索服务提供的接口 异步通知 在完成数据库操作后,发送MQ消息 搜索服务监听MQ,接收到消息后完成数据修改 监听binlog 2、分词器 ik分词器 ik_smart ik_max_word 自定义分词器 以拼…

基于单片机病房呼叫系统数码管显示房号设计

**单片机设计介绍,基于单片机病房呼叫系统数码管显示房号设计 文章目录 一 概要二、功能设计设计思路 三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机病房呼叫系统数码管显示房号设计概要主要涵盖了利用单片机技术实现病房呼叫系统,并…

一文即可帮助你认识进程和线程~

本文的重点:什么是:进程、进程调度、线程和他们之间的联系。主讲概念知识,不讲代码实现 目录 一、认识进程 1.什么是进程 2.进程的信息 3.进程调度(***) 4.进程调度的基本过程 二、线程 1.线程的引入 2.什么是线程 3.进程于线程的联…

Oracle监听报错TNS-01189

测试环境无法连接数据库,怀疑监听没有启动查看监听状态 lsnrctl status查看监听状态发现监听确实没有启动,start监听却出现TNS-01106: Listener using listener name LISTENER has already been started ps -ef | grep -i tns通过ps查看,发现…

品牌百科词条创建包括哪些模版?品牌百科词条文案如何写!

品牌百科词条是一个旨在为用户提供品牌相关信息的平台,今天腾轩科技传媒来讨论一下如何创建一个优质的品牌百科词条。首先,要点之一是确保信息的准确性。在创建品牌百科词条时,我们必须确保所有信息都是准确的,这包括品牌的历史、…

快速申请通配符证书

通配符证书又名泛域名证书,是一种SSL/TLS证书,用于保护多个域名。是由域名字段中的通配符*表示。通配符证书最大的亮点在于可以通过绑定一个主域名,从而间接绑定无数的次级子域名。等同于通配符证书可以绑定无数的域名,在一些特殊…

【C++】搜索二叉树

1. 二叉搜索树 a. 二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树,或者是具有以下性质的二叉树: 若它的左子树不为空,则左子树上所有节点的值都小于根节点的值若它的右子树不为空,则右子树上所有节点的值都大于根…

解决方案:如何安装neo4j软件

文章目录 一、安装JDK二、安装neo4j 一、安装JDK 第一步先安装JDK,因为neo4j环境需要JDK,过程比较多,截图如下: 安装JDK网址 https://www.oracle.com/java/technologies/downloads winR,输入cmd,再输入j…

【Faster Bing】Bing 搜索结果取消跳转至 bing.com/ck

更快的 Bing (Faster Bing) 1. 介绍 项目地址: GitHub: https://github.com/jiang-taibai/faster-bingGitee: https://gitee.com/jiang-taibai/faster-bingGreasyFork: https://greasyfork.org/en/scripts/490999-faster-bing 在使用 Bing 搜索时,Bin…

如何遍历整个DOM树

原文链接:[如何遍历整个DOM树(外网原文链接)](https://chrisdeo.github.io/2019/07/20/%E5%A6%82%E4%BD%95%E9%81%8D%E5%8E%86%E6%95%B4%E4%B8%AADOM%E6%A0%91/) 作为前端开发工程师,我们大部分工作内容其实还是围绕着DOM在进行Javascript的编写&#xf…

AMD本月发布的成本优化型Spartan UltraScale+ FPGA系列

随着 FPGA 在更多应用中的使用,AMD 推出了最新的成本、功耗与性能平衡的系列产品。为了扩展其可编程逻辑产品组合,AMD最近推出了最新的成本优化型 Spartan FPGA 系列。随着 FPGA 应用于越来越多的产品和设备,设计人员可能经常发现自己正在寻找…

前端实现浏览器自定义滚动条

前言: 最近有个项目,产品觉得浏览器默认滚动条太丑了。想美化一下,比如自定义颜色,加上圆角,宽高都要更改一下。我查了资料和文档总结了一下 写法,特此记录以便之后使用。 浏览器滚动条api 总结&#xff…

git基础-tagging

tagging 与大多数版本控制系统一样,Git具有将存储库历史中的特定点标记为重要tag的能力。通常,人们使用此功能来标记发布点(例如v1.0,v2.0等)。在本节中,将学习如何列出现有的标签,如何创建和删…

智慧公厕的技术融合策略

智慧公厕是迎合现代城市发展需要的一项重要基础设施,其设计的技术融合策略在实现公共厕所泛在感知、互通互联、协同构筑智慧城市等方面起到了关键作用。本文将以智慧公厕源头实力厂家广州中期科技有限公司,大量精品案例现场实景实图实例,从物…

【MybatisPlus-updateById】| 更新字段失效 | 很难受的一个BUG

目录 一. 🦁 写在前面二. 🦁 探索过程三. 🦁 原理解释四. 🦁 最后 一. 🦁 写在前面 如题所言,很难受!!! 原因是 🦁 在写项目的时候,使用 Mybatis…

Docker大全

Docker大全 Docker安装准备工作开启虚拟机系统卸载Docker在线安装Docker离线安装Docker Docker服务基本操作启动docker服务查看docker状态设置docker开机自启禁用docker开机自启重新启动docker服务查看docker信息查看docker info中具体key的信息停止docker服务docker镜像加速 D…

高效沟通:总裁口才提升之道

高效沟通:总裁口才提升之道 在当今这个信息爆炸的时代,沟通已经成为了企业与个人之间不可或缺的一部分。而对于企业的总裁来说,良好的口才更是其领导力的体现和成功的保障。因此,如何提升总裁的口才,实现高效沟通&…