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

news2024/11/25 0:38:30

系列文章目录及链接

目录

前言

一、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 inline

plt.rcParams['font.sans-serif'] = 'SimHei' # 设置字体为SimHei # 显示中文
plt.rcParams['axes.unicode_minus']=False # 修复负号问题



from sklearn.datasets import load_iris

iris = 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_split

from 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.coloradmin.cn/o/1580658.html

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

相关文章

【环境搭建】ubuntu工作站搭建全流程(显卡4090)

安装ubuntu22.04系统 首先,先压缩windows分区,按住Win X快捷键,选择磁盘管理,压缩分区,压缩出新的分区用于安装ubuntu22.04 windows插入系统盘,点击重启,一直按F12,选择系统盘启动方式语言选择chinese–…

AI技术将影响更长远,比如未来的就业形势

随着人工智能渗透到工作场所,人类将需要掌握新的工作技能。 AI作为新技术已经开始扰乱就业市场了。对于最新的AI人工智能技术,经济学家、教育工作者、监管机构、商业分析师以及相关领域专家预测,在不久的将来,人工智能一代将需要…

Python常用算法思想--回溯算法思想详解【附源码】

通过回溯算法解决“组合”问题、“排序”问题、“搜索”之八皇后问题、“子集和”之0-1背包问题、字符串匹配等六个经典案例进行介绍: 一、解决“组合”问题 从给定的一组元素中找到所有可能的组合,这段代码中的 backtrack_combinations 函数使用了回溯思想,调用 backtrack…

25.11 MySQL 视图

1. 常见的数据库对象 对象描述表(TABLE)存储数据的逻辑单元, 以行和列的形式存在, 列就是字段, 行就是记录.数据字典系统表, 存放数据库相关信息的表. 数据通常由数据库系统维护, 程序员通常不可修改, 只可查看.约束(CONSTRAINT)执行数据校验的规则, 用于保证数据完整性的规则…

抓住风口,快速上手RAG应用开发!

免责声明~ 任何文章不要过度深思! 万事万物都经不起审视,因为世上没有同样的成长环境,也没有同样的认知水平,更「没有适用于所有人的解决方案」; 不要急着评判文章列出的观点,只需代入其中,适度…

OpenHarmony开发-连接开发板调试应用

在 OpenHarmony 开发过程中,连接开发板进行应用调试是一个关键步骤,只有在真实的硬件环境下,我们才能测试出应用更多的潜在问题,以便后续我们进行优化。本文详细介绍了连接开发板调试 OpenHarmony 应用的操作步骤。 首先&#xf…

RK3568---4G模块驱动实验

作者简介: 一个平凡而乐于分享的小比特,中南民族大学通信工程专业研究生在读,研究方向无线联邦学习 擅长领域:驱动开发,嵌入式软件开发,BSP开发 作者主页:一个平凡而乐于分享的小比特的个人主页…

【攻防世界】wife_wife

原型链污染 源码 app.post(/register, (req, res) > {let user JSON.parse(req.body)if (!user.username || !user.password) {return res.json({ msg: empty username or password, err: true })}if (users.filter(u > u.username user.username).length) {return …

iOS App Store审核要求与Flutter应用的兼容性分析

本文探讨了使用Flutter开发的iOS应用能否上架,以及上架的具体流程。苹果提供了App Store作为正式上架渠道,同时也有TestFlight供开发者进行内测。合规并通过审核后,Flutter应用可以顺利上架。但上架过程可能存在一些挑战,因此可能…

网格矢量如何计算莫兰指数

网格矢量如何计算莫兰指数 引言 遇到一个问题,计算矢量网格的莫兰指数。 概念解释 莫兰指数 莫兰指数(Moran’s Index)是一种空间自相关指标,用于衡量空间数据的相似性和聚集程度。它可以用来描述一个区域与其邻近区域之间的属…

web攻防——js

1.php和js的区别 他只有这一行(所以它是解析形语言)而js写了什么,看源代码就显示什么 安装

性能分析-数据库与磁盘知识

数据库 数据库,其实是数据库管理系统dbms。 数据库管理系统, 常见: 关系型数据库: mysql、pg、 库的表,表与表之间有关联关系; 表二维表统一标准的SQL(不局限于CRUD)非关系型数据…

代码随想录day35 | 贪心算法P4 | ● 860 ● 406 ● 452

860.柠檬水找零 在柠檬水摊上,每一杯柠檬水的售价为 5 美元。顾客排队购买你的产品,(按账单 bills 支付的顺序)一次购买一杯。 每位顾客只买一杯柠檬水,然后向你付 5 美元、10 美元或 20 美元。你必须给每个顾客正确…

共享云桌面和虚拟云桌面优劣势对比分析

随着云计算技术的不断发展,共享云桌面和虚拟云桌面成为了企业信息化建设的热门选择。共享云桌面和虚拟云桌面这两种技术各有优劣势,下面我们将对它们进行对比分析。 首先,我们来了解一下共享云桌面的优势。共享云桌面是指多个用户通过云平台…

软件测试面试入职了,背完这写轻松上岸

全网首发-涵盖16个技术栈 第一部分,测试理论(测试基础需求分析测试模型测试计划测试策略测试案例等等) 第二部分,Linux( Linux基础Linux练习题) 第三部分,MySQL(基础知识查询练习…

Pots(DFS BFS)

//新生训练 #include <iostream> #include <algorithm> #include <cstring> #include <queue> using namespace std; typedef pair<int, int> PII; const int N 205; int n, m; int l; int A, B, C; int dis[N][N];struct node {int px, py, op…

美团一面:说说synchronized的实现原理?问麻了。。。。

引言 在现代软件开发领域&#xff0c;多线程并发编程已经成为提高系统性能、提升用户体验的重要手段。然而&#xff0c;多线程环境下的数据同步与资源共享问题也随之而来&#xff0c;处理不当可能导致数据不一致、死锁等各种并发问题。为此&#xff0c;Java语言提供了一种内置…

揭秘ChatGPT的数据集构建

从Open AI发表的论文《Training language models to follow instructions with human feedback》&#xff0c;我们可以知道ChatGPT/InstructGPT&#xff08;两者技术原理基本一致&#xff0c;下面不再做区分&#xff09;的训练过程分为以下3步&#xff1a; SFT&#xff1a;根据…

私域电商客户要挨一刀的“订单发货管理”,微信:必须强制接入

文丨微三云营销总监胡佳东&#xff0c;点击上方“关注”&#xff0c;为你分享市场商业模式电商干货。 - 引言&#xff1a;超90%的私域运营商家都见到了或者说遇到了这个问题&#xff0c;如果没有读懂这个微信的模型机制&#xff0c;一定会懵逼&#xff0c;微三云营销总监胡佳…

C++11:function包装器

包装器&#xff0c;体现了C11中的封装性&#xff0c;包装器可以应用于&#xff1a;函数指针&#xff0c;仿函数&#xff0c;lambda 而包装器function的出现刚好也弥补了上述三种语法的不足之处 函数指针写起来较为复杂&#xff0c;而仿函数之间类型不同&#xff0c;lambda则在…