【机器学习】K近邻算法

48aa176b3c984fc71a8bd6fc7b96186d.jpeg

一、原理

参数k的确定

0c5ba281b6a32f64f4b40a3c02f3fff4.png

带权重的k近邻算法 与 模糊k近邻算法

4ab51431ea32da5e4dbaad957c9dc88e.jpeg

KNN算法用于回归问题

3f3159fafa95659466ae30432d50b975.jpeg

在使用欧氏距离时应将特征向量归一化

63f1ddbcc07b497f0455a906aa2b3432.jpeg

mahalanobis距离

4d2059f46c80199474795364cc8a80a5.png

如何确定数据的协方差矩阵

0400e2703bd073453b0a4d0b145410fa.jpeg

Bhattacharyya距离

5274f0886101c23b3f2158f19ba42a50.jpeg

距离度量学习

81fbc5e89287218d3da9d949afef6c63.jpeg

距离度量学习大边界最近邻分类

d9146cae0c24bf56a651b9a1025e208f.jpeg

二、示例代码1

9f172c955e03d6b6eec3baad64938a6c.jpeg

import numpy as np  # 导入numpy库,用于进行数值计算
import matplotlib.pyplot as plt  # 导入matplotlib库的pyplot模块,用于绘制图形
from sklearn import datasets  # 导入sklearn库的datasets模块,用于加载数据集
from sklearn.neighbors import KNeighborsClassifier  # 导入sklearn库的neighbors模块中的KNeighborsClassifier类,用于创建k近邻分类器
import matplotlib  # 导入matplotlib库,用于图形绘制


#%matplotlib inline  # 这是一个Jupyter Notebook的魔法命令,用于在Notebook中直接显示图形


# 定义一个函数,用于生成所有测试样本点
def make_meshgrid(x, y, h=.02):
    x_min, x_max = x.min() - 1, x.max() + 1  # 计算x的最小值和最大值
    y_min, y_max = y.min() - 1, y.max() + 1  # 计算y的最小值和最大值
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h), np.arange(y_min, y_max, h))  # 生成网格点
    return xx, yy  # 返回网格点


# 定义一个函数,对测试样本进行预测,并显示
def plot_test_results(ax, clf, xx, yy, **params):
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])  # 对测试样本进行预测
    Z = Z.reshape(xx.shape)  # 调整预测结果的形状
    ax.contourf(xx, yy, Z, **params)  # 绘制等高线图


# 载入iris数据集
iris = datasets.load_iris()
# 只使用前面两个特征
X = iris.data[:, :2]
# 样本标签值
y = iris.target


# 创建kNN分类器
knn = KNeighborsClassifier() 
knn.fit(X,y)  # 对分类器进行训练


title = ('KNNClassifier')


fig, ax = plt.subplots(figsize = (5, 5))  # 创建一个新的图形窗口
plt.subplots_adjust(wspace=0.4, hspace=0.4)  # 调整子图之间的间距


X0, X1 = X[:, 0], X[:, 1]  # 提取特征值
# 生成所有测试样本点
xx, yy = make_meshgrid(X0, X1)


# 显示测试样本的分类结果
plot_test_results(ax, knn, xx, yy, cmap=plt.cm.coolwarm, alpha=0.8)
# 显示训练样本
ax.scatter(X0, X1, c=y, cmap=plt.cm.coolwarm, s=20, edgecolors='k')
ax.set_xlim(xx.min(), xx.max())  # 设置x轴的范围
ax.set_ylim(yy.min(), yy.max())  # 设置y轴的范围
ax.set_xlabel('x1')  # 设置x轴的标签
ax.set_ylabel('x2')  # 设置y轴的标签
ax.set_xticks(())  # 清空x轴的刻度
ax.set_yticks(())  # 清空y轴的刻度
ax.set_title(title)  # 设置标题
plt.show()  # 显示图形

三、示例代码2

1fdd4d0b9eee8d4964295c8b10e820ff.png

数据集

b6236230551f0d429b557163468f23f4.jpeg

输出的混淆矩阵和分类报告

# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


# 导入数据集   注意,Python 中索引是从 0 开始的。
dataset = pd.read_csv('../datasets/Social_Network_Ads.csv')
X = dataset.iloc[:, [2, 3]].values  # 获取数据集中的第3列和第4列数据 年龄 薪水,并将其转换为NumPy数组
y = dataset.iloc[:, 4].values  # 获取数据集中的第4列数据 是否购买,并将其转换为NumPy数组


# 将数据集划分为训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.25, random_state = 0)  # 将数据集划分为75%的训练集和25%的测试集


# 特征缩放
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()  # 创建标准化对象
X_train = sc.fit_transform(X_train)  # 对训练集进行标准化
X_test = sc.transform(X_test)  # 对测试集进行标准化


# 使用K-NN算法训练模型
from sklearn.neighbors import KNeighborsClassifier
classifier = KNeighborsClassifier(n_neighbors = 5, metric = 'minkowski', p = 2)  # 创建K-NN分类器,设置参数n_neighbors为5,metric为闵可夫斯基距离,p为2
classifier.fit(X_train, y_train)  # 使用训练集训练模型


# 使用训练好的模型预测测试集结果
y_pred = classifier.predict(X_test)  # 使用训练好的模型预测测试集的结果


# 生成混淆矩阵
from sklearn.metrics import confusion_matrix
from sklearn.metrics import classification_report
cm = confusion_matrix(y_test, y_pred)  # 生成混淆矩阵
print(cm)  # 打印混淆矩阵
print(classification_report(y_test, y_pred))  # 打印分类报告

83e63db6a382c81f41bc186eb5a49666.jpeg

baf66d88ae46bae2ea0af5e5cc49c19b.png

参考

https://github.com/noobgod/100-Days-Of-ML-Code 

《机器学习-原理、算法与应用》,清华大学出版社,雷明著

The End

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

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

相关文章

项目七 熟练使用Vim程序编辑器与shell

项目七 熟练使用Vim程序编辑器与shell #职业能力目标和要求 1,学会使用vim编辑器。 2,了解shell的强大功能和shell的命令解释过程。 3,学会使用重定向和管道的方法。 4,掌握正则表达式的使用方法。7.1 熟悉使用vim编辑器 7.1.1 …

el-table,列表合并,根据名称列名称相同的品名将其它列值相同的进行合并

el-table,列表合并,根据名称列名称相同的品名讲其它列值相同的进行合并,并且不能垮品名合并 如图 用到el-table合并行的方法合并 tableSpanMethod({ row, column, rowIndex, columnIndex }) {if (column.property "materielName") {//合并商品名const _row this…

LeetCode-805.保持城市天际线 C/C++实现 超详细思路及过程[M]

🎈归属专栏:深夜咖啡配算法 🚗个人主页:Jammingpro 🐟记录一句:摆烂一天后,写的第一篇博客 文章目录 LeetCode-807. 保持城市天际线🚗题目🚆题目描述🚆题目示…

Java程序连接 nacos集群

我们在bootstrap.yml文件里可以直接连一个nacos集群的. 架构如下 没错,我们程序直连的是通过Nginx的,利用nginx的反向代理来做到连接nacos集群. 我们先把nginx的配置贴上来 upstream cluster{server 127.0.0.1:8848;server 127.0.0.1:8849;server 127.0.0.1:8850; }server{l…

视频字幕处理+AI绘画,Runway 全功能超详细使用教程(4)

runway的视频字幕处理、AI绘图功能介绍,感觉完全就是为了做电影而布局,一整套功能都上线了!想系统学习的必收藏! 在深度研究Runway各个功能后,无论是AI视频生成及后期处理技术,还是AI图像生成技术&#xff…

如何控制Spring工厂创建对象的次数?详解Spring对象的声明周期!

😉😉 学习交流群: ✅✅1:这是孙哥suns给大家的福利! ✨✨2:我们免费分享Netty、Dubbo、k8s、Mybatis、Spring...应用和源码级别的视频资料 🥭🥭3:QQ群:583783…

怎么更新BI报表数据?问我就对了

BI大数据分析工具上有大量的BI报表模板,这些模板都是一个个完整的BI报表,只需将数据源更换,立即就能用来分析我们自己的数据。那,BI报表的数据怎么更新?接下来就来说说这事。 目的:更新BI报表数据 工具&a…

如何编写自己的python包,并在本地进行使用

如何编写自己的python包,并在本地进行使用 一、直接引用 1.创建Python项目pythonProject。 2.并且在此项目下创建pg_message包。 3.pg_message包下默认生成_init_.py文件。 Python中_init_.py是package的标志。init.py 文件的一个主要作用是将文件夹变为一个Python模块,Pyt…

如何使用企业微信 WorkTool API 开源框架快速开发企微聊天机器人(详细教程)

WorkTool 基本框架概述 WorkTool 是一个依附于企业微信来运行的无人值守群管理机器人程序,WorkTool 开源,并且永久免费。您可以使用本应用程序来自动执行一个自己企业微信里的账号(当做机器人账号)可通过后台调用对应的 API 来驱…

Jmeter和Testlink自动化测试框架研究与实施

摘 要 目前基于Jmeter的接口自动化测试框架,大多只实现脚本维护和自动调度,无法与Testlink进行互通,实现测试方案与自动化实施流程连接,本文基于Testlink、Jmeter、Jenkins实现:通过Testlink统一维护接口自动化测试用…

ArrayList和顺序表

目录 线性表 顺序表 实现顺序表: 1,添加元素的时候我们要判断是否需要扩容 2,写异常 3,数组清空 ArrayList: ArrayList的构造方法: ArrayList的add方法: ArrayList的subList 知识点补充&#xff…

知识蒸馏—原理+代码实战(Distillation CNN 和 Progressive Distillation Diffusion)

文章目录 1. Distillation 基本概念2. Distillation MNIST CNN分类代码实战3. Progressive Distillation Diffusion生成代码实战3.1 Progressive Distillation原理3.2 v-parameterization3.2 渐进蒸馏 cifar 代码实战 1. Distillation 基本概念 知识蒸馏被广泛的用于模型压缩和…

使用STM32 HAL库驱动光电传感器的设计和优化

光电传感器在许多应用中起着重要的作用,例如自动计数、距离测量等。STM32微控制器和HAL库提供了丰富的功能和易于使用的接口,使得光电传感器的设计和优化变得更加便捷。本文将介绍如何使用STM32 HAL库驱动光电传感器的设计和优化,包括硬件设计…

Linux Nmap命令解析(Nmap指令)(功能:主机发现、ping扫描、arp扫描、端口扫描、服务版本检测、操作系统识别等)

文章目录 Linux Nmap 命令解析简介Nmap 的核心功能主机发现端口扫描服务版本检测OS 指纹识别(操作系统指纹识别)脚本扫描 安装 NmapNmap 命令结构Nmap 命令文档英文中文 主机发现Ping 扫描ARP 扫描关于nmap -PR(ARP Ping Scan)和n…

接口测试工具(Jmeter)必学技巧

安装 使用JMeter的前提需要安装JDK,需要JDK1.7以上版本 目前在用的是JMeter5.2版本,大家可自行下载解压使用 运行 进入解压路径如E: \apache-jmeter-5.2\bin,双击jmeter.bat启动运行 启动后默认为英文版本,可通过Options – Choos…

web:NewsCenter

题目 打开页面显示如下 页面有个输入框,猜测是sql注入,即search为注入参数点,先尝试一下 返回空白显示错误 正常显示如下 是因为单引号与服务端代码中的’形成闭合,输入的字符串hello包裹,服务端代码后面多出来一个‘导…

java学习part18抽象类

Java抽象类 详解-CSDN博客 111-面向对象(高级)-抽象类与抽象方法的使用_哔哩哔哩_bilibili 1.概念 2.抽象类 抽象类不能实例化,可以有属性,也可以有方法。 方法可以实现或者只声明不实现,要加一个abstract abstract class A{//定义一个抽…

51单片机使用串口查看程序执行的数据

51单片机使用串口查看程序执行的数据 1.概述 这篇文章介绍利用串口输出程序执行的数据,辅助我们调试程序,提高代码定位问题的效率。 2.硬件电路原理 3.串口助手查看程序数据 输出串口数据的方式分为CPU查询方式和中断方式。他们各有优缺点&#xff0…

【CVE-2023-49103】ownCloud graphapi信息泄露漏洞(2023年11月发布)

漏洞简介 ownCloud owncloud/graphapi 0.2.x在0.2.1之前和0.3.x在0.3.1之前存在漏洞。graphapi应用程序依赖于提供URL的第三方GetPhpInfo.php库。当访问此URL时,会显示PHP环境的配置详细信息(phpinfo)。此信息包括Web服务器的所有环境变量&a…

k8s部署sonarqube

1.先决条件需要storageClass,动态制备,自动创建pv/pvc.详情参见 k8s-StoargClass的使用-基于nfs-CSDN博客 部署postgresql 2.创建ServiceAccount,用于权限管控. [rootmaster /zpf/test]$cat init-sc-serviceaccount.yaml apiVersion: v1 kind: ServiceAccount metadata:nam…