K-最近邻算法

一、说明

KNN算法是一个分类算法,基本数学模型是距离模型。K-最近邻是一种超级简单的监督学习算法。它可以应用于分类和回归问题。虽然它是在 1950 年代引入的,但今天仍在使用。然而如何实现,本文将给出具体描述。

来源:维基百科

二、KNN原理解释

        让我们使用一个简单的 2D 示例来更好地理解。我们有一个包含 3 组的标记数据集。我们的目标是找出给定的新观察属于哪个组。

        首先,找到给定新点到其他点的距离。

        计算距离有不同的方法。最常用的是欧几里得距离和曼哈顿距离。

2.1 欧氏距离

        这个你小学就知道了。您在毕达哥拉斯定理中发现的斜边。

Source: Wikipedia

        欧氏距离方程

        假设 m 维中有 2 个点。将每个维度中两个点的值相互减去,然后将这些值的平方相加。取总值的平方根。

2.2 曼哈顿距离

        曼哈顿距离(换句话说,出租车距离)是通过网格计算的。想象一下仅使用道路就能从地图上的一个点到达另一个点。最短路线是曼哈顿距离。鸟瞰距离是欧氏距离。

Source: Wikipedia

曼哈顿距离方程

计算距离后,我们将每个距离从小到大排序。考虑直到所选 k 值的距离数。无论大多数人属于哪一类,那将是我们新点的群体。

在回归问题中,取最接近的 k 个选定点值的平均值。

KNN 算法对异常值和不平衡数据集很敏感。

K值控制过拟合和欠拟合之间的平衡。

  • 小K:低偏差,高方差->过度拟合

  • 大 K:高偏差、低方差 -> 欠拟合

2.3 Python代码


sklearn实现 我们用 Iris 数据集来演示一下。

from sklearn import datasets
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score
iris = datasets.load_iris()
X, y = iris.data, iris.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1234
) 

        以上代码(从头开始)

model = Knn()
model.fit(X_train, y_train)
y_pred = clf.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print(cm)
print("Manual Accuracy:", accuracy(y_test, y_pred))#OUT
[[ 9  0  0][ 0 12  1][ 0  0  8]]
Manual Accuracy: 0.9666666666666667 

        sklean训练

model = KNeighborsClassifier(n_neighbors=5)
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print(cm)
print("Manual Accuracy:", accuracy(y_test, y_pred))#OUT
[[ 9  0  0][ 0 12  1][ 0  0  8]]
Manual Accuracy: 0.9666666666666667 

三、如何选择正确的 K 值

        尝试不同的值来选择正确的k值,并根据误差选择最佳的k值。未选择始终给出最小误差的 k 值。这可能会导致过度拟合。遵循所谓的肘击战术。在改善减少的 k 值处,停在那里并选择相应的 k 值。

k_list = list(range(1,50,2))
cv_scores = []for k in k_list:knn = KNeighborsClassifier(n_neighbors=k)scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')cv_scores.append(scores.mean())MSE = [1 - x for x in cv_scores]plt.figure()
plt.figure(figsize=(15,10))
plt.title('K vs Error', fontsize=20, fontweight='bold')
plt.xlabel('K', fontsize=15)
plt.ylabel('Error', fontsize=15)
sns.set_style("whitegrid")
plt.plot(k_list, MSE)plt.show() 

        K 与误差图表。我们可以选择 k 作为 9。

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

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

相关文章

高速USB转4路RS422串口

基于480Mbps 高速USB转8路串口芯片CH344Q,可以为各类主机扩展出4个独立的串口。CH344芯片支持使用操作系统内置的CDC串口驱动,也支持使用厂商提供的VCP串口驱动程序,可支持Windows、Linux、Android、macOS等操作系统。因CDC类协议和类驱动的原…

Android 10.0 系统开启和关闭黑白模式主题功能实现

1. 概述 在10.0的rom系统开发定制化中,在系统SystemUI的下拉状态栏中,产品开发功能需求要求添加黑白模式功能开关的功能,就是打开黑白模式,系统颜色就会变成黑白颜色, 关闭黑白模式开关系统就会变成彩色模式,所以就需要了解下系统是怎么设置黑白模式和彩色模式的,然后添…

DA3 网站的第10位用户信息读取

目录 1.题目描述 2.输入描述 3.输出描述 4.题目分析 5.通过代码 1.题目描述 现有一个Nowcoder.csv文件,它记录了牛客网的部分用户数据,包含如下字段(字段与字段之间以逗号间隔): Nowcoder_ID:用户ID …

git:一、GIT介绍+安装+全局配置+基础操作

版本管理系统(SVN和Git): 集中式版本控制系统(SVN) SVN是集中式版本控制系统,版本库是集中放在中央服务器的. 工作流程如下: 1.从中央服务器远程仓库下载代码 2.修改后将代码提交到中央服务器远程仓库…

with ldid... /opt/MonkeyDev/bin/md: line 326: ldid: command not found

吐槽傻逼xcode 根据提示 执行了这个脚本/opt/MonkeyDev/bin/md 往这里面添加你brew install 安装文件的目录即可

华为云云耀云服务器L实例评测|如何保障华为云云耀云服务器L实例的安全和性能

引言 云耀云服务器L实例是华为云提供的高性能计算实例,为用户提供稳定可靠的云计算环境。为了保障实例的安全和性能,用户可以通过设置防火墙和安全组策略来限制网络访问和防止恶意攻击。华为云提供了灵活的管理工具,用户可以通过控制台、API…

关于ElementUI之首页导航与左侧菜单实现

目录 一.Mock 1.1.什么是Mock.js 1.2.特点 1.3.安装与配置 1.3.1. 安装mock.js 1.3.2.引入mock.js 1.4.mockjs使用 1.4.1.定义测试数据文件 1.4.2.mock拦截Ajax请求 1.4.3.界面代码优化 二.总线 2.1.是什么 2.2.前期准备 2.3.配置组件与路由关系 2.3.1. 配置组件 …

客户端负载均衡_负载均衡策略

以前的Ribbon有多种负载均衡策略 RandomRule - 随性而为 解释: 随机 RoundRobinRule - 按部就班 解释: 轮询 RetryRule - 卷土重来 解释: 先按照RoundRobinRule的策略获取服务,如果获取服务失败则在指定时间内会进行重试。 Weigh…

Golang import

常规 import ("fmt" ) //可以直接调用 fmt.Println("Hello World!!!")省略包名引入 import import ( . "fmt" ) //可以不写包名直接调用 Println("Hello World!!!")别名 import (f "fmt" ) //可以使用自定义名称调用 f.…

北京智和信通亮相2023IT运维大会,共话数智浪潮下自动化运维新生态

2023年9月21日,由IT运维网、《网络安全和信息化》杂志社联合主办的“2023(第十四届)IT运维大会”在北京成功举办。大会以“以数为基 智引未来”为主题,北京智和信通技术有限公司(下文简称:北京智和信通&…

flask+python快速搭建

app.py """APP 入口模块""" from traceback import format_excfrom api_limiter import limiter from flask import Flask, jsonify import loggingfrom controller import api_sql_blueapp Flask(__name__) limiter.init_app(app) app.regist…

golang:context

context作用 goroutine的退出机制 多个goroutine都是平行的被调度的,多个goroutine如何协调工作涉及通信、同步、通知和退出 通信:goroutine之间的通信同步chan通道 同步:不带缓冲的chan提供了一个天然的同步等待机制。通过WaitGroup也可以…

【学习草稿】背包问题

一、01背包问题 图解详细解析 (转载) https://blog.csdn.net/qq_37767455/article/details/99086678 :Vi表示第 i 个物品的价值,Wi表示第 i 个物品的体积,定义V(i,j):当前背包容量 j,前 i 个物…

Kubernetes组件和架构简介

目录 一.概念简介 1.含义: 2.主要功能: 3.相关概念: 二.组件和架构介绍 1.master:集群的控制平面,管理集群 2.node:集群的数据平面,为容器提供工作环境 3.kubernetes简单架构图解 一.概…

技战法-信息收集

搜索引擎语法 Google hacking: site: 限制搜索范围为某一网站,例如: site:baidu.com"admin”可以搜索baidu.com 网站上包含关键词“admin”的页面。 inurl: 限制关键字出现在网址的某个部分,例如: inurl:php?id 可以搜索网址中包含 ph…

Kafka 运维必懂:从原理到调优,看完秒变大佬

1 Kafka 概述 Kafka 起初是 由 LinkedIn 公司采用 Scala 语言开发的一个多分区、多副本且基于 ZooKeeper 协调的分布式消息系统,现已被捐献给 Apache 基金会。 目前 Kafka 已经定位为一个分布式流式处理平台,它以高吞吐、可持久化、可水平扩展、支持流…

Spring源码分析 循环依赖 三级缓存

文章目录 本文目的类图什么是循环依赖如何解决Spring三级缓存三个缓存分别放的是什么? 如果只有二级缓存代理和三级缓存二级缓存在其中的作用 源码分析创建对象之前先从缓存中查找从一二三级缓存中依次查找对象对象实例化时放入到三级缓存中何时放入一级缓存 本文目…

腾讯云cvm云硬盘扩容

过去一直记得腾讯云的系统盘扩容,关于系统盘的扩容直接点资源调整-云硬盘扩容 系统盘扩容后就可以直接使用的? 但是现在操作了发现vda 200G 但是现在vda1不能自动扩容了? 腾讯云cvm云硬盘扩容 先看一眼官方文档吧:在线扩展系统盘分区及文…

LeetCode每日一题:1993. 树上的操作(2023.9.23 C++)

目录 1993. 树上的操作 题目描述: 实现代码与解析: 模拟 dfs 原理思路: 1993. 树上的操作 题目描述: 给你一棵 n 个节点的树,编号从 0 到 n - 1 ,以父节点数组 parent 的形式给出,其中 p…

Android开发MVP架构记录

Android开发MVP架构记录 安卓的MVP(Model-View-Presenter)架构是一种常见的软件设计模式,用于帮助开发者组织和分离应用程序的不同组成部分。MVP架构的目标是将应用程序的业务逻辑(Presenter)、用户界面(V…