当前位置: 首页 > news >正文

机器学习回顾(二)——KNN算法 - 教程

机器学习回顾(二)——KNN算法 - 教程

什么是KNN算法?

全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。

假设你有一个数据集,其中每个数据点都有若干个特征,并且已知它的类别(如果是分类问题)或者数值(如果是回归问题)。

当来了一个​​新的未知样本​​,KNN算法会这样做:

  1. ​计算新样本与数据集中所有样本的距离​​(比如欧几里得距离);
  2. 选出距离最近的 K 个样本​​(K 是你自己设定的一个正整数,比如 K=3、K=5);
  3. 根据这 K 个邻居的信息进行预测​​:
    • ​如果是分类问题​​:采用​​投票制​​,哪个类别的邻居最多,新样本就属于哪个类别;
    • 如果是回归问题​​:采用​​平均值​​,取这 K 个邻居输出值的平均作为预测值。

假设我们有以下二维平面上的几个点(2个类别:红色○ 和 蓝色×):

红色○:(1, 2), (2, 3), (3, 1) 蓝色×:(6, 5), (7, 7), (8, 6) 现在有一个新点:(5, 4),我们想知道它属于红色还是蓝色。

如果我们设定 ​​K=3​​,那么:

  1. 计算 (5,4) 与所有点的距离;
  2. 找出距离最近的 3 个点;
  3. 看这 3 个点中哪种颜色(类别)多,新点就归为哪一类。

 这就是KNN的直观思想:​​近朱者赤,近墨者黑​​。


KNN算法关键点解析

1. ​​距离度量(Distance Metric)​

KNN需要计算样本之间的距离,常见的距离公式有:

  • 欧几里得距离(Euclidean Distance)​​:最常用

即两点在各维度上的差值平方和再开根号。

  • ​曼哈顿距离(Manhattan Distance)​
  • 余弦相似度(Cosine Similarity)​​:适用于文本等方向性数据

你可以根据问题选择不同的距离计算方式。


2. ​​K值的选择(最重要的超参数)​

  • ​K 值太小(如 K=1)​​:模型对噪声敏感,容易过拟合(受到个别异常点影响大);
  • ​K 值太大​​:模型过于平滑,可能把不同类别的点也考虑进来,导致欠拟合;
  • ​通常通过交叉验证来选择最优的 K 值​​,常见尝试范围是 3、5、7、9 等​​奇数​​(避免平票)。

3. ​​分类 or 回归?​

  • ​分类任务​​:K个邻居里哪个类别最多,新样本就属于该类(多数表决);
  • 回归任务​​:K个邻居的输出值的平均值,作为预测值。

KNN算法的优点与缺点

优点:

  • ​思想简单,易于理解与实现​
  • 无需训练过程(惰性学习 Lazy Learning)​​:模型只是保存数据,预测时才进行计算
  • 对数据分布没有假设​​,适用于多种类型的数据
  • 对于小规模数据表现良好

缺点:

  • 计算量大(预测时需要计算与所有样本的距离)​​,不适合大数据集
  • ​对高维数据效果变差(维度灾难)​
  • 对异常值敏感​
  • 需要合理选择 K 值和距离度量方式​

KNN算法的应用场景

  • ​手写数字识别​​(如MNIST数据集分类)
  • ​推荐系统​​(找相似用户/物品)
  • 图像识别​​(简单场景)
  • 异常检测​
  • 医疗诊断​​(根据病人特征匹配相似病例)

示例

from matplotlib import pyplot as plt
import numpy as np
'''KNN(K-Nearest Neighbors)算法是一种简单而有效的监督学习方法,主要用于分类和回归任务。
它的核心思想是:相似的数据点在特征空间中通常属于同一类别或具有相似的值。'''
'''寻找k个距离最近的数据,k根据项目的数据量决定'''
'''欧式距离,点到点的距离'''
'''曼哈顿距离'''
'''sklearn.neighbors.KNeighborsClassifier(
n_neighbors=5,k值
weights='distance',
algorithm='auto',
leaf_size=30,
metric='minkowski',
metric_params=None,
n_jobs=1,
p=2)'''
# data = np.loadtxt('datingTestSet2.txt', delimiter='\t')#numpy读取文件
# study1 = data[data[:,-1] == 1]#分类,提取。
# study2 = data[data[:,-1] == 2]
# study3 = data[data[:,-1] == 3]
#
#
# #可视化
# fig = plt.figure()   #创建图像
# ax = plt.axes(projection='3d') #建立三维图像
# ax.scatter(study1[:,0], study1[:,1], study1[:,2], c='#FF0000',marker='X') #导入数据
# ax.scatter(study2[:,0], study2[:,1], study2[:,2], c='#0000FF',marker='^')
# ax.scatter(study3[:,0], study3[:,1], study3[:,2], c='#008000',marker='D')
# ax.set(xlabel='x', ylabel='y', zlabel='z')#设置x,y,z轴名称
# plt.title('散点图')
# plt.legend(['study1', 'study2', 'study3'])#添加图例
# plt.show()
#knn算法预测
from sklearn.neighbors import KNeighborsClassifier
data = np.loadtxt('datingTestSet2.txt', delimiter='\t')
neigh = KNeighborsClassifier(n_neighbors=5)
x=data[:800,:-1]
y=data[:800,-1]
neigh.fit(x,y)
print(neigh.score(x,y))#准确率,自测
c1=data[800:,:-1]
c2=data[800:,-1]
right=neigh.score(c1,c2)
print(right)
# print(neigh.predict([[44440,4,0.9]]))#预测数据,接受二维数据
# predict_data = np.loadtxt('predict_data.txt', delimiter='\t')
# print(neigh.predict(predict_data))
'''
TP:真正例
TN:真反例
FP:假正例
FN:假反例
准确率(Accuracy) =
(TP + TN)/
(TP+TN+FP+FN)
正确预测的比例,适用于类别平衡数据
精确率(Precision)=
TP/
(TP+FP)
预测为正的样本中实际为正的比例
召回率(Recall)=
TP/
(TP+FN)
实际为正的样本中被正确预测的比例
F1分数(F1-Score) =
2×Precision×Recall/
(Precision+Recall)
精确率和召回率的调和平均,适用于不平衡数据
'''

相关文章:

机器学习回顾(二)——KNN算法 - 教程

机器学习回顾(二)——KNN算法 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important;…...

利用langchain创建信息检索链对话应用

以下内容有AI生成内容,请注意区分信息检索链 信息检索链三步流程走向图 flowchart TDA[用户输入问题] --> B[第一步: 查询优化]subgraph B [查询优化]B1[原始用户问题] --> B2[LLM分析并优化]B2 --> B3[生成多个搜索查询]endB --> C[第二步: 信息检索]subgraph C …...

不同的.cs文件的命名空间相同

在 .NET(包括 C#)里,“同一个命名空间”完全可以散落在多个 .cs 文件——甚至散落在多个不同的项目/程序集里。不同文件但同一命名空间的类型访问级别受限 → internal 仍互相可见(同一程序集内);public 随便用;private/file 只能在声明文件内。命名空间是“逻辑地址”,…...

MyEMS:开源的力量,如何为企业能源管理带来颠覆性变革?

在能源成本不断上涨和碳中和成为全球共识的今天,高效能源管理已成为企业的核心竞争力。然而,传统能源管理系统往往存在成本高昂、封闭僵化、难以定制等问题,让许多企业望而却步。正是在这样的背景下,MyEMS 作为一款完全开源的能源管理系统,正在以其独特优势重新定义行业标…...

http

上一篇文章 初始化 MCP 环境 & 创建 MCP Server (一) 讲的是如何在 SSE 模式下启动 MCP Server。...

AI招聘机器人制造商Paradox.ai因弱密码泄露数百万求职者数据

安全研究人员发现AI招聘平台Paradox.ai因使用弱密码"123456"导致麦当劳等企业的6400万求职者信息泄露。调查还发现该公司越南开发者的设备感染信息窃取恶意软件,暴露出更多企业内部凭证和认证cookie。弱密码揭露AI招聘机器人制造商Paradox.ai的安全漏洞 安全研究人员…...

完整教程:【Leetcode hot 100】543.二叉树的直径

完整教程:【Leetcode hot 100】543.二叉树的直径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

Thundbird无法获取自签证书。

对于自建的邮件服务器,使用thundbird访问时,老版本会提示证书风险,但新版本没有提示,导致无法添加新的邮件账户。 方法(转自外网): 原文: In config editor, add network.security.ports.banned.override as a string with a value of "993" Then go to Mana…...

Gitee推出SBOM扫描功能:为开源供应链安全构筑数字防火墙

Gitee推出SBOM扫描功能:为开源供应链安全构筑"数字防火墙" 在开源软件占据现代软件开发90%以上组件的今天,供应链安全已成为行业不可忽视的挑战。Gitee最新推出的SBOM(软件物料清单)扫描功能,正在为开发者提供一套完整的开源组件风险管控方案,这标志着国内代码…...

mysql连表查询,轻松掌握多表数据关联技巧

做过数据库开发的朋友一定遇到过这样的困扰:数据分散在不同的表中,怎样才能一次查询获取完整的关联信息?比如你需要同时获取用户姓名和订单详情,或者既要产品信息又要供应商资料。这时候,连表查询就像一座连接数据孤岛的桥梁,让我们能够高效获取分散在各表中的相关联数据…...

Milvus集群部署

#本次部署其中的组件kafka、minio均为外置 将milvus chart包解压拷贝至某个目录下 编辑helm的values.yaml文件 ## Enable or disable Milvus Cluster mode cluster:enabled: trueimage:all:repository: milvusdb/milvustag: v2.4.1pullPolicy: IfNotPresent## Optionally speci…...

Qt-捕获摄像头画面

Qt-捕获摄像头画面在qt中捕获摄像头画面,在ui界面上添加一个comboBox控件、label标签和一个pushButton按钮,comboBox用于显示摄像头的设备,按钮用于开启摄像头,label用于显示摄像头捕获的画面。 //需要在.pro文件中加上multimedia multimediawidgets QT += core gui …...

选择MyEMS的十大核心优势:为您的企业开启智慧能管新纪元

在纷繁复杂的能源管理解决方案中,企业如何做出最明智的选择?如果您正在寻求一个既能立竿见影降本增效,又能为长期发展构建数字化基座的平台,那么MyEMS无疑是您的绝佳选择。它不仅是一款软件,更是一个强大的能源管理生态系统。以下是选择MyEMS的十大不可抗拒的优势。 一、极…...

通过 kubectl 插件 kubectl-tree 查看API对象层级关系

分享一个开源小工具 kubectl-tree,用于查看 k8s API 对象层级关系。 比如对于无状态应用来讲,可以看到Deployment --> ReplicaSet --> Pod 的构成关系。 采用二进制离线方式安装: 1、下载二进制安装包 wget https://github.com/ahmetb/kubectl-tree/releases/download…...

【Unity 性能优化之路——渲染流程(1)】 - 详解

【Unity 性能优化之路——渲染流程(1)】 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace…...

HCIA回顾——STP

...

.NET驾驭Word之力:COM组件二次开发全攻略之连接Word与创建你的第一个自动化文档

面向具有一定C#和.NET基础的开发者,本文将带你进入Word文档自动化处理的世界。通过本系列教程,你将掌握使用.NET操作Word文档的各种技巧,实现文档的自动化生成、处理和操作。引言 在日常开发中,我们经常需要处理Word文档,比如自动生成报告、批量处理文档、格式化文档内容等…...

last logicflow

<template><div class="logicflow-page"><div class="sidebar"><div class="palette-title">组件面板</div><div class="palette-item" @mousedown="startDrag(custom-rect, 矩形)">矩…...

老公对我的精神虐待

2025年09月15日早上。使唤我倒垃圾。然后在我往垃圾桶扔垃圾时,他在吐盔。他对我大呼小叫。从来不会好好说话,一言不合应会对我大呼小叫。在和他相处的过程中,感觉不到做为一个人最基本的尊重‘理解’‘包容’。他还喜欢语言暴力。喜欢贬低人。喜欢和你讲一个故事,然后说里…...

用户沉默之日,产品衰亡之时:逃离迭代中的“沉默陷阱”

一、引言 当前,每天有数以千计的新产品上线,但大多很快陨落,究其原因,不是技术不行或功能太差,甚至不是输给对手,而是消无声息的死去。为什么?原因就在于用户不再反馈和交流,没有真实的反馈作为方向盘,产品如同在夜晚行驶的汽车,或早或晚撞向了深渊。 二、“沉默的大…...

华与华是谁?

华与华是谁? “华与华”是由华杉和华楠两兄弟于2002年创立的战略营销咨询公司。他们的核心方法论是 “超级符号”和“超级话语” ,主张用人类文化中固有的、人人都熟悉符号和话语,来降低品牌的传播成本,让品牌一眼就被记住。 他们的著名成功案例包括:蜜雪冰城:“你爱我,…...

从工具到生态:现代Bug管理系统的平台化转型之路

从工具到生态:现代Bug管理系统的平台化转型之路 在DevOps和持续交付成为行业标配的当下,传统独立的Bug追踪系统正面临前所未有的挑战。随着软件开发流程的日益复杂化,仅具备单一缺陷记录功能的传统系统已难以满足高效协作需求。本文将深入分析传统Bug管理工具的局限性,解读…...

PK-CWT 系列罗氏线圈使用指南:操作方法与注意事项

一、概述 普科科技PRBTEK的PK-CWT系列柔性电流探头是一款采用柔性开环结构的专业测量工具,能够精准复现大功率开关全频段电流波形,在多个领域发挥着重要作用。 在性能方面,该系列产品表现出色。其频率响应带宽范围从0.1Hz至16MHz,这意味着它不仅能精准捕捉超低频段的缓变信…...

IDEA Debug 高阶技巧,老手都是这么玩的~~

IDEA Debug 高阶技巧,老手都是这么玩的~~ 小哈学Java2025年09月14日 15:23 安徽来源:juejin.cn/post/7308539123537592357 👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论新项目:《Spring AI…...

mysql 创建分区,如何轻松提升海量数据查询效率

你是否遇到过这样的烦恼:随着业务增长,MySQL单表数据量突破千万级别,查询速度越来越慢,甚至影响用户体验?本文将带你深入理解MySQL分区功能,掌握提升大表查询性能的实战技巧。 什么是MySQL表分区 MySQL中的数据以文件形式存储在磁盘上,默认路径可通过my.cnf中的datadir查…...

完整教程:瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度

完整教程:瑞派虹泰环城总院 | 打造“一站式宠物诊疗空间”,定义全国宠物医疗新高度pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &…...

BOE(京东方)携新能源领域新品亮相2025服贸会 引领绿色转型新动能

9 月 10 日,以“全球服务 互惠共享”为主题的2025中国国际服务贸易交易会(以下简称“服贸会”)在北京拉开帷幕。作为领先的物联网创新企业,BOE(京东方)携十余款全球首发的钙钛矿光伏产品,以及多款综合能源解决方案惊艳亮相。本次参展服贸会,是对BOE(京东方)可持续品牌…...

SpringBoot 集成支付宝支付,看这篇就够了

SpringBoot 集成支付宝支付,看这篇就够了 小哈学Java2025年09月15日 09:31 安徽来源:juejin.cn/post/7269357836026904633👉 欢迎加入小哈的星球,你将获得: 专属的项目实战(多个项目) / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论新项目:《Spring AI …...

工业智能终端赋能自动化生产线建设数字化管理 - 指南

工业智能终端赋能自动化生产线建设数字化管理 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monosp…...

一道模拟赛题

还没打 mx round7 的请勿观看一种我不太会优化的做法。感觉醍醐灌顶了。 链接:https://www.mxoj.net/problem/P130021?contestId=195人话题意:对值域在 \([1,2^n-1]\) 的严格上升序列计数,要求不能存在连续三个位置使得异或和为 \(0\)。\(n\leq 10^6\)。首先注意到,设 \(i…...

Pycharm打包PaddleOCR过程及疑问解决途径

Pycharm打包PaddleOCR过程及疑问解决途径pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !import…...

uni-app项目支付宝端Input不受控

最近在负责一个多端项目,其中有一个商品数量控制的功能,但是发现在支付宝端踩坑了出现了异常,一起来看看是怎么回事吧?前情 最近又接手一个全新多端项目,包括抖音/快手/微信/支付宝,其中就有支付宝端,需要实现一个SKU选择,同时需要控制选择的商品数量,如下图坑位 既然…...

适合小型企业的项目管理系统推荐:Reddit 用户真实需求

小型企业常遇工具分散、协作低效难题。本文对比5大项目管理系统,解析功能与优势,助你找到合适的项目管理解决方案。原文链接:https://www.nocobase.com/cn/blog/project-management-systems-for-small-businesses。 对于小型企业来说,项目管理系统(Project Management Sys…...

开启研究生学习阶段

人生之路,走走停停,波澜起伏; 没想到又有回到学校继续学习的机会。 小学、中学、大学、职场; 给我不同的人生体验, 其中的喜怒哀乐都像是过眼云烟, 模糊,清晰,历历在目。 当我写下这些文字的时候, 再看以前写的那些博客, 心中感慨万千; 人生如白驹过隙, 最后的结果…...

李航统计学习方法第二版 学习笔记

第一章 统计学习及监督学习概论 主要记录了监督学习内容 1.1 统计学习监督学习输入输出所有可能的取值分别称之为输入空间,输出空间.通常输出空间远小于输入空间(分类问题中 , 输入的是图片特征 , 只输出"是","否) 一个具体的输入为实例由特征向量表示所有可能的…...

如何拥有自己的一台永久免费云主机/云服务器

适用对象:不想花钱就能拥有自己的一台测试服务器,适用于一些大三大四学生和一些手头紧的用户,白嫖党 配置信息:1核1G5M10G 使用感受:虽然配置不是很高,但是满足自己日常的测试使用是足够的,搭建个人网盘,个人博客,用作测试服务器等等都是可以的 地址:阿贝云:https:/…...

第三周训练总结

上周赛时切题情况(含ICPC,附上题目名称和链接)#34.反转DAG图 #34.歪脖子树 #35.矩阵交换 #35.砖块摆放 #35.学习 LIS ICPC J.中位数 ICPC F.景区建设 #36.字符串博弈 #36.闪现数上周订题情况(附上题目名称和链接)#34.倒水问题 #34.树的颜色 #35.战略轰炸上周题解记录情况…...

godot格式化字符串

godot格式化字符串func _handle_rotation(delta):var target_rotation = randf_range(-PI,PI)var current_rotation = transform.basis.get_euler().y#平滑旋转transform.basis = transform.basis.slerp(Basis.from_euler(Vector3(0,target_rotation,0)),rotation_speed*delta)…...

reLeetCode 热题 100-1 两数之和-扩展2 map实现 - MKT

reLeetCode 热题 100-1 两数之和-扩展2 map实现1...

发现一个新的资源论坛 - 小小程序员

3Y论坛页面简约,论坛的资源也很齐全,页面网速也很快。网址:3y论坛 - 纯净的网盘资源分享社区邀请码:266yzo638u...

reLeetCode 热题 100-1 两数之和-扩展3 单向和双向链表实现 - MKT

reLeetCode 热题 100-1 两数之和-扩展3 单向和双向链表实现1...

codeforces1050div4题解

同步更新,但是现在网站的latex还没渲染好 https://happycoding.me/posts/codeforces-round-1050-div4/ A 思路: 当$n$为奇数时,答案为$x$,否则为$0$ B 思路: 显然每条线段都要经过,答案为$n+m$ C 题意: 现有$2$侧:$0$侧和$1$侧,$0$分钟一开始在$0$侧,尽可能地在两侧之…...

深入解析:少儿舞蹈小程序(13)作品播放量累加及点赞

深入解析:少儿舞蹈小程序(13)作品播放量累加及点赞pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monos…...

Ubuntu 24.04 安装最新版podman@5.6.1

0. 更新系统 sudo apt update && sudo apt upgrade -y 1. 下载并解压官方静态包 cd /tmp curl -L -O https://github.com/containers/podman/releases/download/v5.6.1/podman-remote-static-linux_amd64.tar.gz tar -xzf podman-remote-static-linux_amd64.tar.gz chm…...

深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口

深入解析:Unity:XML笔记(二)——Xml序列化、反序列化、IXmlSerializable接口pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…...

2025.9.15——知识点学习

图 回路 起点和终点相同的路径,也叫“环” 重边 两个顶点中间不只有一条边 自环 自己到自己的边 简单图 没有重边和自环的图 完全图 每对定点之间都恰有一条边相连 稠密图 边数接近完全图,e>=NlogN 稀疏图 边数远少于完全图,e<NlogN...

详细介绍:拉帮结派下的制造麻烦

详细介绍:拉帮结派下的制造麻烦pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", monospace !important; fon…...

C# Avalonia 13- MoreDrawing - CustomPixelShader

C# Avalonia 13- MoreDrawing - CustomPixelShader目前Avalonia无法继承Effect类重写,因为构造函数是internal。我们重写一个GrayscaleImage实现灰化。GrayscaleImage类public class GrayscaleImage : Control{public static readonly StyledProperty<IImage?> SourceP…...

使用标签Tag控制蒙太奇的触发时机-playmontageAndWait-Send GameplayEvent-WaitGameplayEvent

控制蒙太奇的通知,可以在蒙太奇中的通知中发送标签事件,在GA中接收标签事件 在事件通知蓝图中...

sql事务执行

使用上下文管理器from sqlalchemy import create_engine, text from sqlalchemy.orm import sessionmaker from contextlib import contextmanager import logging# 创建数据库连接 engine = create_engine(mysql+pymysql://username:password@localhost/dbname) SessionLocal …...