机器学习回顾(二)——KNN算法 - 教程
什么是KNN算法?
全称是k-nearest neighbors,通过寻找k个距离最近的数据,来确定当前数据值的大小或类别。是机器学习中最为简单和经典的一个算法。
假设你有一个数据集,其中每个数据点都有若干个特征,并且已知它的类别(如果是分类问题)或者数值(如果是回归问题)。
当来了一个新的未知样本,KNN算法会这样做:
- 计算新样本与数据集中所有样本的距离(比如欧几里得距离);
- 选出距离最近的 K 个样本(K 是你自己设定的一个正整数,比如 K=3、K=5);
- 根据这 K 个邻居的信息进行预测:
- 如果是分类问题:采用投票制,哪个类别的邻居最多,新样本就属于哪个类别;
- 如果是回归问题:采用平均值,取这 K 个邻居输出值的平均作为预测值。
假设我们有以下二维平面上的几个点(2个类别:红色○ 和 蓝色×):
红色○:(1, 2), (2, 3), (3, 1) 蓝色×:(6, 5), (7, 7), (8, 6) 现在有一个新点:(5, 4),我们想知道它属于红色还是蓝色。
如果我们设定 K=3,那么:
- 计算 (5,4) 与所有点的距离;
- 找出距离最近的 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 …...