《机器学习》——KNN算法

news2025/4/27 9:21:24

文章目录

  • KNN算法简介
  • KNN算法——sklearn
    • sklearn是什么?
    • sklearn 安装
    • sklearn 用法
  • KNN算法 ——距离公式
  • KNN算法——实例
    • 分类问题
      • 完整代码——分类问题
    • 回归问题
      • 完整代码 ——回归问题

KNN算法简介

  • 一、KNN介绍
    • 全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。

      在这里插入图片描述

  • 二、KNN算法的基本要素
    • K值的选择:K值代表选择与新测试样本距离最近的前K个训练样本数,通常K是不大于20的整数。K值的选择对算法结果有重要影响,需要通过交叉验证等方法来确定最优的K值。
    • 距离度量:常用的距离度量方式包括闵可夫斯基距离、欧氏距离、曼哈顿距离、切比雪夫距离、余弦距离等。其中,欧氏距离在KNN算法中最为常用。
    • 分类决策规则:一般采用多数投票法,即选择K个最相似数据中出现次数最多的类别作为新数据的分类。
  • 三、KNN算法的工作流程
    • 准备数据:对数据进行预处理,包括收集、清洗和归一化等步骤,以确保所有特征在计算距离时具有相等的权重。
    • 计算距离:计算测试样本点到训练集中每个样本点的距离。
    • 排序与选择:根据距离对样本点进行排序,并选择距离最小的K个样本点作为测试样本的邻居。
    • 分类决策:根据K个邻居的类别信息,采用多数投票法确定测试样本的类别。
  • 四.KNN算法的优缺点
    • 优点:
      1.简单,易于理解,易于实现,无需训练;
      2.适合对稀有事件进行分类;
      3.对异常值不敏感。
    • 缺点:
      1.样本容量比较大时,计算时间很长;
      ⒉.不均衡样本效果较差;

KNN算法——sklearn

sklearn是什么?

  • Sklearn (Scikit-Learn) 是基于 Python 语言的第三方机器学习库。它建立在 NumPy, SciPy, Pandas 和 Matplotlib库 之上,里面的 API 的设计非常好,所有对象的接口简单,很适合新手上路。

sklearn 安装

pip install scikit-learn
# 也可以自行选择版本,注意不同版本可能会有差异,还可以在后面加-i 镜像地址
# 如:
pip install scikit-learn==1.0.2 -i https://pypi.mirrors.ustc.edu.cn/simple/

sklearn 用法

  • 使用sklearn官网API:https://scikit-learn.org/,knn算法的介绍 搜索k-nearest neighbors,注意版本1.0和1.2问题。
  • sklearn中有两种KNN算法的用法:KNeighborsClassifier(分类问题), KNeighborsRegressor(回归问题),故此要使用KNN算法时首先要判断需求是分类问题还是回归问题。

KNN算法 ——距离公式

在这里插入图片描述
在这里插入图片描述

  • 等距离公式还有很多:距离公式

KNN算法——实例

分类问题

  • 导入模块
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
# sklearn中的neighbors模块的KNeighborsClassifier方法
  • 导入数据
data = np.loadtxt('datingTestSet2.txt')
# 使用numpy中的loadtxt方法读取txt文件,读取后内容为数组
  • 提取数据

    • data[:, -1]:这部分是数组的切片操作。data是一个二维数组,: 表示选取所有行,-1 表示选取最后一列。因此,data[:, -1] 获取了data数组中所有行的最后一列的数据。

    • data[:, -1] == 1:这部分将上一步得到的所有最后一列的值与1进行比较,生成一个布尔数组(或类似布尔索引的结构),其中True表示对应位置的值为1,False表示不是1

    • data[data[:, -1] == 1]:最后,这个布尔数组被用作索引来筛选data数组。具体来说,它会选取data中所有最后一列值为1的行。

x = data[:,:-1]
# 逗号前后分别代表行和列,可以看出data[:,:-1]取从头到尾的行和从头到倒数第二个的列,且最后一个不取。
y = data[:,-1]
# 取从头到尾的行和最后一列。
  • KNN模型——KNeighborsClassifier
    • API

    class sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, *, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=None)

    • n_neighbors : k值,邻居的个数,默认为5。【关键参数】
    • weights : 权重项,默认uniform方法。
      Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
      Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
      Callable:用户自定义权重。
    • algorithm :用于计算最近邻的算法。
      ball_tree:球树实现
      kd_tree:KD树实现, 是一种对n维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
      brute:暴力实现
      auto:自动选择,权衡上述三种算法。【一般按自动即可】
    • leaf_size :空值KD树或者球树的参数,停止建子树的叶子节点的阈值。
    • p : 距离的计算方式。P=1为曼哈顿距离,p=2为欧式距离。
    • metric : 用于树的距离度量
      1.曼哈顿距离2.欧式距离3.切比雪夫距离4.闵可夫斯基距离5.带权重闵可夫斯基距离
      6 .标准化欧式距离7.马氏距离
    • metric_params :用于比较复杂的距离的度量附加参数。
neigh = KNeighborsClassifier(n_neighbors=10,p=2)
# k = 10,使用欧式距离公式计算。
  • 训练模型
neigh.fit(x,y)
# 使用KNN模型中的fit方法进行训练。
  • 测试模型
print(neigh.predict([[15004,0.08800,0.671355]]))
# neigh.predict():这是 neigh 模型的一个方法,用于对输入数据进行预测。
predict_data = [[9744,11.440364,0.760461],
                [16191,0.100000,0.605619],
                [42377,6.519522,1.058602],
                [27353,11.475155,1.528626]]
print(neigh.predict(predict_data))
# 测试多组数据时
  • 测试结果
    可以看到第一组数据分到2类别,第二组几个数据分别分到第2、2、1、3类别中。
    在这里插入图片描述

完整代码——分类问题

import numpy as np
from sklearn.neighbors import KNeighborsClassifier
data = np.loadtxt('datingTestSet2.txt')
x = data[:,:-1]
y = data[:,-1]
neigh = KNeighborsClassifier(n_neighbors=10,p=2)
neigh.fit(x,y) # 训练模型

print(neigh.predict([[15004,0.08800,0.671355]]))

predict_data = [[9744,11.440364,0.760461],
                [16191,0.100000,0.605619],
                [42377,6.519522,1.058602],
                [27353,11.475155,1.528626]]
print(neigh.predict(predict_data))

回归问题

  • 使用数据
    • 波士顿房价数据
  • 导入模块
import numpy as np
from sklearn.neighbors import KNeighborsRegressor
# 回归问题使用KNeighborsRegressor方法
  • 导入数据
data = np.loadtxt('boston.txt')
# 使用numpy中的loadtxt方法读取txt文件,读取后内容为数组
  • 提取数据
x = data[:,:-1]
# 逗号前后分别代表行和列,可以看出data[:,:-1]取从头到尾的行和从头到倒数第二个的列,且最后一个不取。
y = data[:,-1]
# 取从头到尾的行和最后一列。
  • KNN模型——KNeighborsRegressor
  • API

    class sklearn.neighbors.KNeighborsRegressor(n_neighbors=5, *, weights=‘uniform’, algorithm=‘auto’, leaf_size=30, p=2, metric=‘minkowski’, metric_params=None, n_jobs=None)

    • n_neighbors : k值,邻居的个数,默认为5。【关键参数】
    • weights : 权重项,默认uniform方法。
      Uniform:所有最近邻样本的权重都一样。【一般使用这一个】
      Distance:权重和距离呈反比,距离越近的样本具有更高的权重。【确认样本分布情况,混乱使用这种形式】
      Callable:用户自定义权重。
    • algorithm :用于计算最近邻的算法。
      ball_tree:球树实现
      kd_tree:KD树实现, 是一种对n维空间中的实例点进行存储以便对其进行快速搜索的二叉树结构。
      brute:暴力实现
      auto:自动选择,权衡上述三种算法。【一般按自动即可】
    • leaf_size :空值KD树或者球树的参数,停止建子树的叶子节点的阈值。
    • p : 距离的计算方式。P=1为曼哈顿距离,p=2为欧式距离。
    • metric : 用于树的距离度量
      1.曼哈顿距离2.欧式距离3.切比雪夫距离4.闵可夫斯基距离5.带权重闵可夫斯基距离
      6 .标准化欧式距离7.马氏距离
    • metric_params :用于比较复杂的距离的度量附加参数。
neigh = KNeighborsRegressor(n_neighbors=5,p=2)
# k = 5,使用欧式距离公式计算。
neigh2 = KNeighborsRegressor(n_neighbors=7,p=2)
# k = 7,使用欧式距离公式计算。
  • 训练模型
neigh.fit(x,y)
# 使用KNN模型中的fit方法进行训练。
neigh2.fit(x,y)
  • 测试模型
print(neigh.predict([[2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24,666.0,20.21,392.93,10.42]]))
print(neigh2.predict([[2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24,666.0,20.21,392.93,10.42]]))
  • 测试结果
    从结果可以看到根据不同的k值,会产生不同的回归值。
    在这里插入图片描述

完整代码 ——回归问题

import numpy as np
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor

data = np.loadtxt('boston.txt')
x = data[:,:-1]
y = data[:,-1]
neigh = KNeighborsRegressor(n_neighbors=5,p=2)
neigh.fit(x,y)
print(neigh.predict([[2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24,666.0,20.21,392.93,10.42]]))
neigh2 = KNeighborsRegressor(n_neighbors=7,p=2)
neigh2.fit(x,y)
print(neigh2.predict([[2.82838,0.00,18.120,0,0.5320,5.7620,40.32,4.0983,24,666.0,20.21,392.93,10.42]]))

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

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

相关文章

《向量数据库指南》——Milvus Cloud 2.5:Sparse-BM25引领全文检索新时代

Milvus Cloud BM25:重塑全文检索的未来 在最新的Milvus Cloud 2.5版本中,我们自豪地引入了“全新”的全文检索能力,这一创新不仅巩固了Milvus Cloud在向量数据库领域的领先地位,更为用户提供了前所未有的灵活性和效率。作为大禹智库的向量数据库高级研究员,以及《向量数据…

HTML——23. 锚点和空链接二

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>其它页面锚链接</title></head><body><!--跳转到其它页面具体位置锚链接--><!--1.目标页面具体位置要设置锚点--><!--2.用a标签中的href属…

【Devops】什么是Devops?(Development+Operations)和运维的区别?

DevOps&#xff08;Development Operations&#xff09;是一种将开发&#xff08;Development&#xff09;和运维&#xff08;Operations&#xff09;团队结合在一起的文化和实践&#xff0c;目的是通过自动化、协作和持续反馈来加快软件的开发、部署和运维的周期&#xff0c;…

kubernetes Gateway API-1-部署和基础配置

文章目录 1 部署2 最简单的 Gateway3 基于主机名和请求头4 重定向 Redirects4.1 HTTP-to-HTTPS 重定向4.2 路径重定向4.2.1 ReplaceFullPath 替换完整路径4.2.2 ReplacePrefixMatch 替换路径前缀5 重写 Rewrites5.1 重写 主机名5.2 重写 路径5.2.1 重新完整路径5.2.1 重新部分路…

VUE echarts 教程二 折线堆叠图

VUE echarts 教程一 折线图 import * as echarts from echarts;var chartDom document.getElementById(main); var myChart echarts.init(chartDom); var option {title: {text: Stacked Line},tooltip: {trigger: axis},legend: {data: [Email, Union Ads, Video Ads, Dir…

linux安装nginxs报错:openssl not found

系统&#xff1a; linux 版本&#xff1a;centOS7 nginx版本&#xff1a;nginx-1.20.2 linux安装nginx时 执行下面命令时报错&#xff1a; ./configure --with-http_stub_status_module --with-http_ssl_module --prefix/usr/local/nginxchecking for OpenSSL library ... not …

项目基本配置

总说 本节主要记录修改配置文件、连接mysql数据库、git连接 一、配置文件的修改 1.1 配置pom.xml 由于我们要连接mysql数据库&#xff0c;需要在pom.xml中添加相关依赖 这里给出一个网站&#xff0c;可以找到各种依赖Maven Repository: Search/Browse/Explore 添加一个my…

一个最简单的ios程序(object_c)的编写

前言 如何在苹果系统MacOS创建一个简单的ios&#xff08;iphone&#xff09;程序&#xff0c;貌似非常的简单。但是&#xff0c;作为习惯了Windows开发的程序员来说&#xff0c;有时候还觉得有点麻烦&#xff0c;至少开始有点很不习惯。 本博文试着把这个过程展现一下&#xff…

Learning Multi-Scale Photo Exposure Correction

Abstract 用错误的曝光捕捉照片仍然是相机成像的主要错误来源。曝光问题可分为以下两类:(i)曝光过度&#xff0c;即相机曝光时间过长&#xff0c;导致图像区域明亮和褪色;(ii)曝光不足&#xff0c;即曝光时间过短&#xff0c;导致图像区域变暗。曝光不足和曝光过度都会大大降低…

宝塔-firefox(Docker应用)-构建自己的Web浏览器

安装基础软件 宝塔中安装firefox(Docker应用) 。宝塔中需要先安装docker及docker-composefirefox配置安装 点击firefox应用&#xff0c;选择【安装配置】点击右边绿色按钮&#xff0c;进行安装&#xff0c;这一步等待docker-compose根据你的配置初始化docker应用 等待安装 …

【深度学习】时间序列表示方法

自然界除了2D的图片数据之外&#xff0c;还有语音、文字&#xff0c;这些数据都有时间的先后顺序的。对于2D的图像的数据&#xff0c;可以用RGB值来表示像素的色彩度。语音可以用信号幅度值来表示&#xff0c;而Pytorch没有自带String支持&#xff0c;在表示文字之前需要进行Em…

使用 Navicat 官方免费版来实现从 DAT 文件填充 MySQL 8 表

在异构存储库之间迁移数据&#xff08;即源数据库和目标数据库来自不同供应商的不同数据库管理系统&#xff09;会遇到一些挑战。在某些情况下&#xff0c;可以同时连接两个数据库。但有时根本无法实现。面对这样的困境&#xff0c;数据库从业者别无选择&#xff0c;只能从转储…

【CSS in Depth 2 精译_093】16.2:CSS 变换在动效中的应用(上)—— 图标的放大和过渡效果的设置

当前内容所在位置&#xff08;可进入专栏查看其他译好的章节内容&#xff09; 第五部分 添加动效 ✔️【第 16 章 变换】 ✔️ 16.1 旋转、平移、缩放与倾斜 16.1.1 变换原点的更改16.1.2 多重变换的设置16.1.3 单个变换属性的设置 16.2 变换在动效中的应用 ✔️ 16.2.1 放大图…

Linux 信号集与信号掩码

目录 一、引言 二、信号集是什么 三、信号集关键函数 1.信号集的创建与初始化 2.信号的添加与删除 3.信号集的阻塞与解除阻塞 四、信号集实际应用场景 五、信号掩码的作用 六、信号掩码相关函数 1.sigprocmask 函数 2.sigemptyset 和 sigfillset 函数 七、信号掩码注…

CPT203 Software Engineering 软件工程 Pt.5 软件测试(中英双语)

文章目录 8. 软件测试8.1 Testing&#xff08;测试&#xff09;8.1.1 A note of testing under the V & A framework8.1.2 The Basics8.1.3 The Goals8.1.4 The Stages 8.2 Developing testing&#xff08;开发测试&#xff09;8.2.1 Unit testing&#xff08;单元测试&…

微信小程序中遇到过的问题

记录微信小程序中遇到的问题&#xff08;持续更新ing&#xff09; 问题描述&#xff1a;1. WXML中无法直接调用JavaScript方法。2. css中无法直接引用背景图片。3. 关于右上角胶囊按钮。4. 数据绑定问题。5. 事件处理问题。6. 关于movable-view组件的问题7. 关于设置宽度后设置…

【C++】B2084 质因数分解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af; 题目描述&#xff1a;质因数分解输入格式输出格式输入输出样例&#xff1a; &#x1f4af; 问题解析1. 质数的定义2. 题目特点3. 约束范围4. 问题分解 &#x1f4af; 解题…

Unity中列表List使用出类似字典Dictionary的感觉

首先为什么会有这个标题&#xff1f; 因为字典很好用&#xff0c;只需要键就能拿到值&#xff0c;这种感觉是真的爽&#xff0c;新手最喜欢用了&#xff0c;遇事不决就字典&#xff0c;但是也有不好的地方&#xff0c;字典的内存开销比列表List要大&#xff0c;遍历也是List占…

分布式项目___某污水处理项目

一.分布式项目___污水处理项目 项目地址:https://gitee.com/yanyigege/collaborative-water-springboot.git ​ 1.项目背景 总公司在全国各地有处理污水的项目部,各项目部处理自己的污水,总部需要监控各地分项目部每天处理污水的原料用量,掌握各分部的污水处理情况 ​ 2.功…

WebRTC:实现浏览器与移动应用的实时通信

1.技术简介 &#xff08;Web Real-Time&#xff09;是一种开放式实时通信技术&#xff0c;旨在使浏览器和移动应用程序通过简单的API即可实现实时音频、视频和数据传输&#xff0c;而无需安装插件或额外软件。它支持网络应用中的点对点通信&#xff0c;例如视频聊天、语音通话…