【机器学习】K近邻算法

news2024/11/26 9:31:34

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

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

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

相关文章

链接2:静态链接、目标文件、符号和符号表

文章目录 静态链接符号解析 (symbolresolution)重定位 (relocation) 目标文件1.可重定位目标文件2.可执行目标文件3.共享目标文件 可重定位目标文件text:rodata:.data.bss.symtab.rel.text.rel.data:debug:line:strtab: 符号和符号表由m定义并能被其他模块引用的全局符号由其他…

【开题报告】基于深度学习的驾驶员危险行为检测系统

研究的目的、意义及国内外发展概况 研究的目的、意义:我国每年的交通事故绝对数量是一个十分巨大的数字,造成了巨大的死亡人数和经济损失。而造成交通事故的一个很重要原因就是驾驶员的各种危险驾驶操作行为。如果道路驾驶员的驾驶行为能够得到有效识别…

奇数求和(C++)

系列文章目录 进阶的卡莎C++_睡觉觉觉得的博客-CSDN博客数1的个数_睡觉觉觉得的博客-CSDN博客双精度浮点数的输入输出_睡觉觉觉得的博客-CSDN博客足球联赛积分_睡觉觉觉得的博客-CSDN博客大减价(一级)_睡觉觉觉得的博客-CSDN博客小写字母的判断_睡觉觉觉得的博客-CSDN博客纸币(…

详细介绍如何使用深度学习自动车牌(ALPR)识别-含(数据集+源码下载)

深度学习一直是现代世界发展最快的技术之一。深度学习已经成为我们日常生活的一部分,从语音助手到自动驾驶汽车,它无处不在。其中一种应用程序是自动车牌识别 (ALPR)。顾名思义,ALPR是一项利用人工智能和深度学习的力量自动检测和识别车辆车牌字符的技术。这篇博文将重点讨论…

Servlet-Vue-JSON交互

Servlet-Vue-JSON交互 统一结果返回 定义 package org.example.result;import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;Data NoArgsConstructor AllArgsConstructor public class Result<T> {private Integer code;private St…

人工智能_AI服务器安装清华开源_CHATGLM大语言模型_GLM-6B安装部署_人工智能工作笔记0092

看到的这个开源的大模型,很牛,~关键让我们自己也可以部署体验一把了,虽然不知道具体内部怎么构造的但是,也可以自己使用也挺好. 可以部署在自己的机器上也可以部署在云服务器上. 安装以后,是可以使用python代码进行提问,然后返回结果的,这样就可以实现我们自己的chat应用了, …

5面试题--redis

慢查询⽇志&#xff1a;⽤于记录执⾏时间超过给定时⻓的命令请求&#xff0c;⽤户可以通过这个功能产⽣的⽇志来监视和 优化查询速度。 布隆过滤器&#xff1a;⼆进制数组进⾏存储&#xff0c;若判断元素存在则可能实际存在&#xff0c;若判断不存在则⼀定不存在。 redis中inc…

Linux文件目录结构_文件管理

Linux文件目录结构 Linux目录结构简洁 windows:以多根的方式组织文件 C:\ D:\ E:\ Linux: 以单根的方式组织文件/ Linux目录结构视图 注意区分&#xff1a; 系统管理员&#xff1a;中文“根”&#xff0c;root 系统目录&#xff08;文件夹&#xff09;&#xff1a;根&#xf…

解决ssh使用public key远程登录服务器拒绝问题

目录 使用场景windows安装ssh客户端使用powershell ssh登录服务器生成密钥文件ubuntu ssh服务器配置使用vscode远程登录使用Xshell远程登录使用MobaXtem远程登录Server refused our key问题解决方案 使用场景 使用vscode远程ssh登录使用public key不需要输入密码,比较方便. w…

使用opencv实现更换证件照背景颜色

1 概述 生活中经常要用到各种要求的证件照电子版&#xff0c;红底&#xff0c;蓝底&#xff0c;白底等&#xff0c;大部分情况我们只有其中一种&#xff0c;本文通过opencv实现证件照背景的颜色替换。 1.1 opencv介绍 OpenCV&#xff08;Open Source Computer Vision Librar…

Leetcode 380. O(1) 时间插入、删除和获取随机元素

文章目录 题目代码&#xff08;11.28 首刷看解析&#xff09; 题目 Leetcode 380. O(1) 时间插入、删除和获取随机元素 代码&#xff08;11.28 首刷看解析&#xff09; 1.length:表示的是数组的长度 数组 2.length():表示的是字符串的长度 字符串 3.size():表示的是集合中有多…

人工智能|机器学习——感知器算法原理与python实现

感知器算法是一种可以直接得到线性判别函数的线性分类方法&#xff0c;它是基于样本线性可分的要求下使用的。 一、线性可分与线性不可分 为了方便讨论&#xff0c;我们蒋样本增加了以为常数&#xff0c;得到增广样向量 y&#xff08;1;;;...;&#xff09;,则n个样本的集合为&a…

vue项目中使用jsonp跨域请求百度联想接口

一. 内容简介 vue项目中使用jsonp跨域请求百度联想接口 二. 软件环境 2.1 Visual Studio Code 1.75.0 2.2 chrome浏览器 2.3 node v18.14.0 三.主要流程 3.1 代码 核心代码 // 这个是请求函数doLeno() {// 挂载回调函数&#xff0c;不挂载&#xff0c;会报不存在window…

短视频账号矩阵系统源码/saas独立源头技术开发

一、批量剪辑&#xff08;采用php语言&#xff0c;数学建模&#xff09; 短视频合成批量剪辑的算法主要有以下几种&#xff1a; 1. 帧间插值算法&#xff1a;通过对多个视频的帧进行插帧处理&#xff0c;从而合成一段平滑的短视频。 2. 特征提取算法&#xff1a;提取多个视频中…

viple模拟器使用(四):unity模拟器中实现沿右墙迷宫算法

沿右墙迷宫算法 引导 线控模拟可以使得通过用户手动操作&#xff0c;实现机器人在模拟环境下在迷宫中行走&#xff08;即&#xff1a;运动&#xff09;&#xff0c;算法可以使得机器人按照一定的策略自动行走&#xff0c;沿右墙迷宫算法就是其中的一种策略。 目的 运行程序后&…

MFC容器中使用标准库容器,内存违规

问题描述 CArray中元素不管是直接或间接使用标准库容器&#xff0c;会引发内存违规。与CArray内部实现有关。测试代码如下&#xff1a; struct tagData {std::vector<int> m_Values; }; CArray<tagData, tagData> mIntVecArray; {tagData mData;mData.m_Values.p…

【08】Python运算符

文章目录 1.算术运算符2.赋值运算符3.条件运算符4.逻辑运算符5.比较运算符6.运算符的优先级本期博客中,我们将学习python中常用的运算符的用法。              1.算术运算符 1.加法运算符(+): a = 10 b = 5 c = a + b print(c

仿制剧情吧网站源码 帝国CMS剧情介绍模板

帝国CMS7.5剧情介绍模板&#xff0c;仿制剧情吧网站的风格。该模板并非用于直接播放电影&#xff0c;而是用文字描述剧情&#xff0c;同时包含手机版。本站免费分享供站长学习研究使用。采用伪静态技术&#xff0c;无需生成HTML。出于美观考虑&#xff0c;自带数据仅供本地环境…

跨越威胁的传说:揭秘Web安全的七大恶魔

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

OpenCV | 傅里叶变换——低通滤波器与高通滤波器

import cv2 #opencv 读取的格式是BGR import numpy as np import matplotlib.pyplot as plt #Matplotlib是RGB %matplotlib inline def cv_show(img,name):cv2.imshow(name,img)cv2.waitKey()cv2.destroyAllWindows() 傅里叶变换 傅里叶变换的作用 高频&#xff1a;变化剧烈…