当前位置: 首页 > java >正文

17day-人工智能-机器学习-分类算法-KNN

1. 什么是knn算法

knn算法全名叫做k-近邻算法(K-Nearest Neighbors,简称KNN),看到名字是不是能想到是算距离的,第一个k是指超参数的意思,就是可以认为设置的意思,这里是指最近的k个样本。

2. 为什么有这个算法

如果我们要给一些数据分类,是不是通过它的一些相似的特征或者都有的特征,我们就将它分为一类,那我们怎么判别数据相不相似是不是可以通过算距离的方法,数据特征都是可以量化为数字的。knn算法就是可以干这个的算距离的。

算距离的方式

3. knn的原理

knn处理的数据是带有标签的,在使用训练集训练模型的时候,前面说了knn是通过算样本之间的距离的,所有训练模型的时候其实什么也没有干就只是保存了数据集,当测试数据的时候才会执行通过算每个样本和测试数据的特征距离,算好以后再排个序(由小到大),然后这里就需要自己传入的k值了,排序完后,就选择前k个数据,k个里面占比最高的类别是什么测试数据就属于什么。

假如黑色的点归为M,红色的点为N,现在有一个a,k为3,那么就找最近的三个点,这里黑色的点有两个虽有将a划分为M。

举个例子:我们这里测试集有1-9条,然后我们需要判断出10条什么电影类型的,假如k为3,那么前三条最近的就是8,1,9,全是喜剧片所以我们就推断10也是喜剧片,原理就这么简单。

4. api实现

KNeighborsClassifier(n_neighbors=5, algorithm='auto')
参数:                                             
(1)n_neighbors: 
int, default=5, 默认情况下用于kneighbors查询的近邻数,就是K
方法:
(1) fit(x, y) 
使用X作为训练数据和y作为目标数据  
(2) predict(X)    预测提供的数据,得到预测数据     

# 用KNN算法对鸢尾花进行分类
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier# 1)获取数据
x,y = load_iris(return_X_y=True)
# 2)划分数据集
x_train, x_test, y_train, y_test = train_test_split(x,y,test_size=0.2,random_state=42)
# 3)特征工程:标准化
transfer = StandardScaler()
x_train = transfer.fit_transform(x_train)
x_test = transfer.transform(x_test)# 4)KNN算法预估器, k=7表示找7个邻近来判断自身类型.
estimator = KNeighborsClassifier(n_neighbors=7)
estimator.fit(x_train, y_train)#该步骤就是estimator根据训练特征和训练目标在自己学习,让它自己变聪敏
# 5)模型评估  测试一下聪敏的estimator能力# 方法1:直接比对真实值和预测值,
y_predict = estimator.predict(x_test) #y_predict预测的目标结果
print("y_predict:\n", y_predict)
print("直接比对真实值和预测值:\n", y_test == y_predict)# 方法2:计算准确率,
score = estimator.score(x_test, y_test)# 里面会自己预测y值,然后和y_test作比较,相等的个数/总数
print("准确率为:\n", score) #1.0

准确率100了,过度拟合了,这样反而是不好的,后面会讲到的。

5. knn的缺点

对于大规模数据集,计算量大,因为需要计算测试样本与所有训练样本的距离。

我们这里没什么感觉是应为数据集只有100多条,但是实际开发中的数据都是几百万上千万的数据,那这个都算一遍就哼恐怖了。

对于高维数据,距离度量可能变得不那么有意义,这就是所谓的“维度灾难”

就是那种算出来的距离为99999999912,99999999914,这样的他们的特征也不一样,但是这么数据太大了比较就有没有意义了。

需要选择合适的k值和距离度量,这可能需要一些实验和调整。

k值过大过小是不是都会影响准确率,k值太大假如接近全部样本的数量了,是不是根本就不用测我们直接统计谁的种类多就好了。

但是knn在实际应用开发中应用的好少,是应为他是训练的时候才去预测的,我们训练时时间花长一点都是没事的,但预测的时候太长,那客户使用的时候且不是要等好久才能有一个结果。

http://www.xdnf.cn/news/17133.html

相关文章:

  • Spring IOC:Java开发中的依赖魔法
  • 【Qt开发】常用控件(一)
  • HTTP性能优化实战:解决高并发场景下的连接瓶颈与延迟问题
  • 【Spring Boot 快速入门】七、阿里云 OSS 文件上传
  • 家庭财务管理系统|基于java和小程序的家庭财务管理系统设计与实现(源码+数据库+文档)
  • 【含文档+PPT+源码】基于SSM的旅游与自然保护平台开发与实现
  • 3D 材质与纹理:让虚拟模型 “以假乱真” 的核心密码
  • 基于ARM+FPGA光栅数据采集卡设计
  • Datart:开源数据可视化的新星,赋能企业数据分析
  • Flink CDC 介绍
  • Linux 系统重置用户密码指南
  • docker镜像源配置教程,以及解决安装好docker配置镜像源后,出现报错。Job for docker.service failed
  • 【Canvas与文字】生存与生活
  • WPF中引用其他元素各种方法
  • 【Mac】OrbStack:桌面端虚拟机配置与使用
  • 机器学习05——正则化与逻辑回归
  • 数据结构:反转链表(reverse the linked list)
  • 华为OD机考2025C卷 - 开源项目热度榜单 (Java Python JS C++ C )
  • Android Espresso 测试框架深度解析:从入门到精通
  • 如何设计和实施高效的向量化数据检索解决方案
  • python基础:数据解析BeatuifulSoup,不需要考虑前端形式的一种获取元素的方法
  • 量子计算接口开发:Python vs Rust 性能对决
  • 我用一个 Postgres 实现一整套后端架构!
  • 分布式版本控制工具Git
  • javacc学习笔记 01、JavaCC本地安装与测试
  • HCIP笔记1
  • Mac中M系列芯片采用rbenv管理ruby版本
  • pytorch 学习笔记3-利用框架内网络训练糖尿病数据集
  • 深入剖析通用目标跟踪:一项综述
  • 抽像代数概念理解——陪集(coset)