机器学习(五) -- 监督学习(2) -- k近邻

系列文章目录及链接

目录

前言

一、K近邻通俗理解及定义

二、原理理解及公式

1、距离度量

四、接口实现

1、鸢尾花数据集介绍

2、API

3、流程

3.1、获取数据

3.2、数据预处理

3.3、特征工程

3.4、knn模型训练

3.5、模型评估

3.6、结果预测

4、超参数搜索-网格搜索

5、优缺点


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


一、K近邻通俗理解及定义

1、什么叫k近邻(What)

K-近邻算法(K Nearest Neighbor)又叫KNN算法。指如果一个样本在特征空间中的k个最相似(特征空间中最近邻)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

(如图,我离小羽最近,所以我也属于武侯区)

2、k近邻的目的(Why)

核心思想:根据你的“邻居”的类别来推断出你的类别

(通过找到找到样本中离我们最近的K个样本,类别中样本数最多的类别就是我的类别)

3、怎么做(How)

K-近邻算法流程:

  1. 计算已知类别数据集中的点(已知类别点)与当前点(待分类点)之间的距离
  2. 按距离递增次序排序
  3. 选取与当前点距离最小的k个点
  4. 统计前k个点所在的类别出现的频率
  5. 返回前k个点出现频率最高的类别作为当前点的预测分类

这里就有两个问题:K值怎么取?怎么取确定离我最近呢(怎么确定距离)?

一般手动调节K值大小:
        k 值取得过小,容易受到异常点的影响
        k 值取得过大,样本不均衡的影响

距离计算:
        欧氏距离(距离平方值)
        曼哈顿距离 (距离绝对值)
        切比雪夫距离(维度的最大值)
        明可夫斯基距离

二、原理理解及公式

1、距离度量

距离度量用于计算给定问题空间中两个对象之间的差异,即数据集中的特征。然后可以使用该距离来确定特征之间的相似性, 距离越小特征越相似;

1.1、欧氏距离(Euclidean Distance)

空间中两点间的直线距离。(一般使用方法)

欧式距离也称为l2范数,公式:

1.2、曼哈顿距离(Manhattan Distance)

也称为城市街区距离,因为两个点之间的距离是根据一个点只能以直角移动计算的。这种距离度量通常用于离散和二元属性,这样可以获得真实的路径;

欧式距离也称为l1范数,公式: 

1.3、切比雪夫距离(Chebyshev Distance)

切比雪夫距离也称为棋盘距离,二个点之间的距离是其各坐标数值差绝对值的最大值。

欧式距离也称为l-无穷范数,公式:

1.4、闵氏距离(Minkowski)(闵可夫斯基距离)

当p = 1 时,即为曼哈顿距离;
当p = 2 时,即为欧氏距离;注:只有欧式距离具有平移不变性;
当p = ∞时,即为切比雪夫距离;

三、**算法实现

四、接口实现

1、鸢尾花数据集介绍

1.1、API

# API
from sklearn.datasets import load_iris

 1.2、介绍

 鸢尾花数据集共收集了三类鸢尾花,即Setosa鸢尾花、Versicolour鸢尾花和Virginica鸢尾花,每一类鸢尾花收集了50条样本记录,共计150条。

 数据集包括4个属性,分别为花萼的长、花萼的宽、花瓣的长和花瓣的宽。单位是cm。

iris = load_iris()print("鸢尾花数据集的键",iris.keys())
# "数据--特征值","目标值","","目标名","描述","特征名","文件名","数据模型名"print(iris.data.shape)print("鸢尾花数据集特征值名字是:",iris.feature_names)
# sepal length 花萼长度、sepal width 花萼宽度、petal length 花瓣长度、petal width 花瓣宽度(单位是cm)print("鸢尾花数据集目标值名字是:",iris.target_names)
# Setosa(山鸢尾)、Versicolour(杂色鸢尾)、Virginica(维吉尼亚鸢尾)

 其他属性:

print("鸢尾花数据集的返回值:\n", iris)
# 返回值类型是bunch--是一个字典类型# 既可以使用[]输出也可以使用.输出
print("鸢尾花数据集特征值是:",iris["data"])
# print("数据集特征值是:",iris.data)
print("鸢尾花数据集目标值是:",iris.target)print("鸢尾花数据集的描述是:",iris.DESCR)

1.3、查看数据分布(两个特征)

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
np.random.seed(1734)#将生成的交互式图嵌入notebook中
%matplotlib notebook #将生成的静态图嵌入notebook中
%matplotlib inlineplt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei # 显示中文
plt.rcParams['axes.unicode_minus']=False # 修复负号问题from sklearn.datasets import load_irisiris = load_iris()# 取150个样本,取中间两列特征,花萼宽度和花瓣长度
x=iris.data[0:150,1:3]
y=iris.target[0:150]#分别取前两类样本,0和1
samples_0 = x[y==0, :]#把y=0,即Iris-setosa的样本取出来
samples_1 = x[y==1, :]#把y=1,即Iris-versicolo的样本取出来
samples_2 = x[y==2, :]#把y=2,即Iris-virginica的样本取出来# 可视化
plt.figure()
plt.scatter(samples_0[:,0],samples_0[:,1],marker='o',color='r')
plt.scatter(samples_1[:,0],samples_1[:,1],marker='x',color='y')
plt.scatter(samples_2[:,0],samples_2[:,1],marker='*',color='b')
plt.xlabel('花萼宽度')
plt.ylabel('花瓣长度')
plt.show()

2、API

sklearn.neighbors.KNbeighborsClassifer导入:
from sklearn.neighbors import KNeighborsClassifier语法:
KNbeighborsClassifer(n_neighbors=5,algorithm='auto')n_neighbors:  默认为5,就是K近邻中的K值 Algorithm:{'auto','ball_tree','kd_tree','brute'}auto:可以理解为算法自己决定合适的搜索算法ball_tree:克服kd树高维失效而发明的,其构造过程是以质心C和半径r分割样本空间,每个节点是一个超球体。kd_tree:构造kd树存储数据以便对其进行快速检索的树形数据结构,kd树也就是数据结构中的二叉树。以中值切分构造的树,每个结点是一个超矩形,在维数小于20时效率高。brute:线性扫描,当训练集很大时,计算非常耗时

3、流程

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_splitfrom sklearn.neighbors import KNeighborsClassifier

3.1、获取数据

# 载入数据
iris = load_iris()
# print(iris)

3.2、数据预处理

# 划分数据集
x_train,x_test,y_train,y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=1473) 

3.3、特征工程

进行KNN时,一般要进行无量纲化。

3.4、knn模型训练

# 实例化一个预估器
knn = KNeighborsClassifier(n_neighbors=3)# 模型训练
knn.fit(x_train, y_train)

 

3.5、模型评估

# 模型评估# 用模型计算测试值,得到预测值
y_pred = knn.predict(x_test)# 准确率
print("预测的准确率",knn.score(x_test,y_test))# 一样的哦
from sklearn.metrics import accuracy_score
print("预测的准确率",accuracy_score(y_test,y_pred))

一般用准确率就行,

# 将预测值与真实值比较
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))

用分类报告【详情请看机器学习(四) -- 模型评估(2)-分类报告】

精确率(precision)、召回率(recall)、F1 值(F1-score)和样本数目(support)

3.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

4、超参数搜索-网格搜索

网格搜索法(Grid Search)是一种在机器学习中用于确定最佳模型超参数的方法之一。

超参数是指在训练模型之前需要手动设置的参数。

4.1、API:

sklearn.model_selection.GridSearchCV导入:
from sklearn.model_selection import GridSearchCV语法:
gs=GridSearchCV(estimator,param_grid,…,cv=’3’)estimator:要优化的模型对象。param_grid:指定参数的候选值范围,可以是一个字典或列表。cv:交叉验证参数,默认None,使用三折交叉验证。gs.fit():运行网格搜索gs.best_estimator_:返回在交叉验证中选择的最佳估计器。
gs.best_params_:返回在交叉验证中选择的最佳参数组合。
gs.best_score_:返回在交叉验证中选择的最佳评分。
gs.cv_results_:返回一个字典,具体用法模型不同参数下交叉验证的结果。
gs.scorer_:返回用于评分的评估器。
gs.n_splits_:返回交叉验证折叠数。

4.2、实践:

# 构造参数列表
param = {"n_neighbors": [3, 5, 10, 12, 15]}# 进行网格搜索,cv=3是3折交叉验证
gs = GridSearchCV(knn, param_grid=param, cv=3)gs.fit(x_train, y_train)  #你给它的x_train,它又分为训练集,验证集# 预测准确率,为了给大家看看
print("在测试集上准确率:", gs.score(x_test, y_test))print("在交叉验证当中最好的结果:", gs.best_score_)print("选择最好的模型是:", gs.best_estimator_)print("最好的参数是 ", gs.best_params_)# print("每个超参数每次交叉验证的结果:", gs.cv_results_)

 有关交叉验证移步【机器学习(四) -- 模型评估(1)】

5、优缺点

5.1、优点:

  • 简单,易于理解,易于实现
  • 分类回归都可以用

5.2、缺点:

  • 必须指定K值,K值选择不当则分类精度不能保证
  • 需要算每个测试点与训练集的距离,当训练集较大时,计算量相当大,时间复杂度高,特别是特征数量比较大的时候。需要大量的内存,空间复杂度高。

  • 懒惰算法,对测试样本分类时的计算量大,内存开销大

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

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

相关文章

从零开始学RSA:已知n,e,d求p,q和私钥文件修复

(8)已知n,e,d求p,q 一看这个标题你就应该有个觉悟,n一定无法直接分解得到p和q。 题目: 10-存货5 题目给出了两个文件,一个是加密脚本chall.py,一个是加密后输出的内容output.txt。 分析一下加密脚本: from gmpy2 import invertf…

相机模型浅析

相机模型 文章目录 相机模型四个坐标系针孔相机模型世界坐标系到相机坐标系相机坐标系到图像坐标系图像坐标到像素坐标 四个坐标系 ①世界坐标系:是客观三维世界的绝对坐标系,也称客观坐标系。因为数码相机安放在三维空间中,我们需要世界坐标…

Python3 replace()函数使用详解:字符串的艺术转换

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通鸿蒙》 …

JavaScript(1)神秘的编程技巧

大家都感兴趣的箭头函数 箭头函数在许多场景中都可以发挥作用,尤其适用于简化函数声明和提高代码的可读性。以下是箭头函数可以使用的一些常见方面: (1)回调函数: 箭头函数特别适合作为回调函数,例如在事…

RuntimeError: Library cublas64_12.dll is not found or cannot be loaded

运行guillaumekln/faster-whisper-large-v2模型进行语音识别的时候报错了 RuntimeError: Library cublas64_12.dll is not found or cannot be loaded 代码: from faster_whisper import WhisperModelmodel WhisperModel("H:\\model\\guillaumekln\\faster…

Linux系统安装内网穿透实现固定公网地址访问本地MinIO服务

文章目录 前言1. 创建Buckets和Access Keys2. Linux 安装Cpolar3. 创建连接MinIO服务公网地址4. 远程调用MinIO服务小结5. 固定连接TCP公网地址6. 固定地址连接测试 正文开始前给大家推荐个网站,前些天发现了一个巨牛的 人工智能学习网站, 通俗易懂&am…

你不知道的JavaScript---深入理解 JavaScript 作用域

你好,我是小白Coding日志,一个热爱技术的程序员。在这里,我分享自己在编程和技术世界中的学习心得和体会。希望我的文章能够给你带来一些灵感和帮助。欢迎来到我的博客,一起在技术的世界里探索前行吧! 1. 什么是作用域…

MY-Java高级面试题

1. jdk1.7 到 jdk1.8 Map 发生了什么变化 ( 底层 )? 1.8 之后 hashMap 的数据结构发生了变化,从之前的单纯的数组 链表结构变成数组 链 表 红黑树。也就是说在 JVM 存储 hashMap 的 K-V 时仅仅通过 key 来决定每一个 entry 的存 储槽位&…

网络安全:重要性与应对措施

1. 网络安全的重要性 随着互联网的普及和信息技术的快速发展,网络安全问题已经变得日益突出。网络攻击者可以通过各种手段窃取个人信息、破坏系统、传播病毒等,给个人和社会带来巨大的损失。因此,网络安全已经成为信息化时代的重要问题之一。…

【MySQL】如何判断一个数据库是否出问题

在实际的应用中,其实大多数是主从结构。而采用主备,一般都需要一定的费用。 对于主备,如果主机故障,那么只需要直接将流量打到备机就可以,但是对于一主多从,还需要将从库连接到主库上。 对于切换的操作&a…

pta L1-013 计算阶乘和

L1-013 计算阶乘和 分数 10 全屏浏览 切换布局 作者 陈越 单位 浙江大学 对于给定的正整数N,需要你计算 S1!2!3!...N!。 输入格式: 输入在一行中给出一个不超过10的正整数N。 输出格式: 在一行中输出S的值。 输入样例: …

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记16:蓝桥杯编程手册

一、要背的函数汇总(以例子形式) 1.GPIO相关 输出:HAL_GPIO_WritePin(GPIOC,GPIO_PIN_8 | GPIO_PIN_9,GPIO_PIN_SET) 输入:HAL_GPIO_ReadPin(GPIOB, GPIO_PIN_0) 翻转:HAL_GPIO_TogglePin(GPIOC,0xFF) 2.LCD相关 …

百度获评CCIA数据安全和个人信息保护社会责任评价“三星”示范单位

日前,由中国网络安全产业联盟(CCIA)数据安全工作委员会主办的“促进数据安全合规流通使用”专题研讨会(CCIA数安委年度会议)成功举办。与会介绍了数据安全和个人信息保护社会责任试点评价工作的开展情况,并…

LangChain-11 Code Writing FunctionCalling 大模型通过编写代码完成需求 大模型计算加法

背景简介 我们知道GPT模型对于内容的输出,是对下一个字符的预测,通过概率选出下一个文本。 而且我们也知道,训练样本是非常庞大的,对于GPT来说,也是有可能学习过1 1 2的。 当我们向GPT询问11 时,完全可以…

Android 14 vold 分析(3)vold和mount service通信

vold和mount service都是binder service,并不是mount service只调用vold,vold也会调用mount service,这是双向的,这里解答上一章的问题 思考, vold比mount service启动的早,那开机时vold获取到的listener为…

FME学习之旅---day21

我们付出一些成本,时间的或者其他,最终总能收获一些什么。 教程:AutoCAD 变换 相关的文章 为您的 DWG 赋予一些样式:使用 DWGStyler、模板文件、块等 FME数据检查器在显示行的方式上受到限制。它只能显示线条颜色,而…

Leetcode 374. 猜数字大小

猜数字游戏的规则如下: 每轮游戏,我都会从 1 到 n 随机选择一个数字。 请你猜选出的是哪个数字。 如果你猜错了,我会告诉你,你猜测的数字比我选出的数字是大了还是小了。 你可以通过调用一个预先定义好的接口 int guess(int num)…

电商行业网络安全不可小视,如何保障网商平台的稳定

随着互联网的全面普及,基于互联网的电子商务也应运而生,并在近年来获得了巨大的发展,成为一种全新的商务模式,被许多经济专家认为是新的经济增长点。 作为一种全新的商务模式,它有很大的发展前途,同时&…

为什么pdf拆分出几页之后大小几乎没有变化

PDF 文件的大小在拆分出几页之后几乎没有变化可能有几个原因: 图像压缩: 如果 PDF 文件中包含图像,而这些图像已经被压缩过,拆分后的页面依然会保留这些压缩设置,因此文件大小可能不会显著变化。 文本和矢量图形: PDF 文件中的文…

基于Java+SpringBoot+vue3+uniapp口红销售/商城管理系统设计与实现

博主介绍:✌全网粉丝5W,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验…