彩笔运维勇闯机器学习--KNN算法

news/2025/10/13 10:55:33/文章来源:https://www.cnblogs.com/MrVolleyball/p/19137972

前言

彩笔运维勇闯机器学习:KNN算法,它也是分类中的一种

开始探索

scikit-learn

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrixnp.random.seed(0)x0 = np.random.randn(60, 2) * 0.6 + np.array([1, 2])
x1 = np.random.randn(30, 2) * 0.6 + np.array([3, 4])
x2 = np.random.randn(10, 2) * 0.6 + np.array([1, 5])X = np.vstack((x0, x1, x2))
y = np.array([0]*60 + [1]*30 + [2]*10)X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)
X_test_std = scaler.transform(X_test)k = 5
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_std, y_train)
y_pred = knn.predict(X_test_std)def plot_knn_decision(X, y, model):h = 0.02x_min, x_max = X[:, 0].min()-1, X[:, 0].max()+1y_min, y_max = X[:, 1].min()-1, X[:, 1].max()+1xx, yy = np.meshgrid(np.arange(x_min, x_max, h),np.arange(y_min, y_max, h))Z = model.predict(np.c_[xx.ravel(), yy.ravel()])Z = Z.reshape(xx.shape)plt.figure(figsize=(8,6))plt.contourf(xx, yy, Z, cmap=plt.cm.Pastel2)plt.scatter(X[:, 0], X[:, 1], c=y, edgecolors='k', cmap=plt.cm.Set1)plt.grid(True)plt.show()plot_knn_decision(X_train_std, y_train, knn)

这是一个三分类的数据,分类0有60个,分类1有30个,分类2有10个

脚本!启动:

watermarked-knn_1_1

深入理解KNN

KNN算法属于惰性学习,没有所谓的数据训练的过程。它把训练数据暂时保存,当有新的数据需要进行分类时,再使用训练数据进行对应的计算,而这个计算算法常见的是欧氏距离

\[d(A, B) = \sqrt{(x_1 - x_2)^2 + (y_1 - y_2)^2} \]

下面用一个例子来加深一下算法的过程

举例说明

假设有以下训练数据

x1 x2 类别
A 1 2 0
B 2 3 0
C 3 3 1
D 6 5 1
E 7 2 1

1)由于是惰性学习,训练数据就先放着备用

2)假设有一个测试数据,T(3,4),需要对他进行分类

对每一个点分别计算:

  • A点,(1,2),\(D_A=\sqrt{(3-1)^2+(4-2)^2} \approx 2.83\)
  • B点,(2,3),\(D_A=\sqrt{(3-2)^2+(4-3)^2} \approx 1.41\)
  • C点,(3,3),\(D_A=\sqrt{(3-3)^2+(4-3)^2} = 1\)
  • D点,(6,5),\(D_A=\sqrt{(3-6)^2+(4-5)^2} \approx 3.16\)
  • E点,(7,8),\(D_A=\sqrt{(3-7)^2+(4-8)^2} \approx 5.66\)

3)设置超参数K=3,选择3个距离最小作为邻居

邻居 距离 类别
C 1 1
B 1.41 0
A 2.83 0

4)投票,少数服从多数,T(3,4)的类别是0

小结

KNN算法的优点是简单直接,非常容易理解。缺点也很明显,由于是惰性计算,面对高维的、数据量非常大的数据,往往需要大量的计算才能进行分类,并且对于每一个测试数据都需要“遍历所有训练数据”来计算距离,这在大规模 数据集上会变得非常慢。

异常检测

在之前讨论分类问题的时候,遇到了所谓的“类别不平衡”问题,就是多数类占据样本的大量,而少数类只占用非常少的样本,导致分类算法对于少数类不能正确分类,需要做额外的处理

在实际工作中,“类别不平衡”问题有着非常重要的实践,比如有100w的日志,怎么精准识别出10条异常日志,除了10条日常,其余999990条日志都属于正常日志。对于这种问题又叫做“异常检测”,对于“异常检测”问题,有一些算法是比较擅长处理的,比如KNN算法

举例说明

在下列数据中,找出异常点

x1 x2
A 1 2
B 2 3
C 3 3
D 6 5
E 7 2

1)算法没变,还是使用欧式距离公式

A(1,2) B(2,3) C(3,3) D(6,5) E(7,8)
A(1,2) - 1.41 2.83 5.83 8.49
B(2,3) 1.41 - 1 4.24 6.71
C(3,3) 2.83 1 - 3.61 5.83
D(6,5) 5.83 4.24 3.61 - 3.16
E(7,8) 8.49 6.71 5.83 3.16 -

2)设置超参数K=2,找到最近的2个邻居计算平均距离

  • A最近的邻居:(1.41 2.83),\(D_A=2.12\)
  • B最近的邻居:(1 1.41),\(D_B=1.21\)
  • C最近的邻居:(1 2.83),\(D_C=1.91\)
  • D最近的邻居:(3.16 3.61),\(D_D=3.39\)
  • E最近的邻居:(3.16 5.83),\(D_E=4.5\)

3)找出异常点

  • 如果要找出最异常的,那就是E点
  • 如果要找出2个的异常点,那就是D与E

scikit-learn

import numpy as np
from sklearn.neighbors import NearestNeighborsnp.random.seed(42)
X_normal = np.random.randn(100, 2)
X_outliers = np.array([[5, 5], [-5, -5], [6, -6]])
X = np.vstack((X_normal, X_outliers))k = 3
nbrs = NearestNeighbors(n_neighbors=k)
nbrs.fit(X)
distances, _ = nbrs.kneighbors(X)
k_dist = distances[:, -1]n_outliers = 3
threshold = np.partition(k_dist, -n_outliers)[-n_outliers]
outlier_mask = k_dist >= thresholdoutliers = X[outlier_mask]
print("异常点坐标:")
print(outliers)

脚本!启动:

watermarked-knn_1_2

画图分析

import matplotlib.pyplot as pltplt.figure(figsize=(8,6))
plt.scatter(X[:, 0], X[:, 1], c='blue')
plt.scatter(outliers[:, 0], outliers[:, 1], c='red', edgecolors='black', s=100)
plt.legend()
plt.grid(True)
plt.show()

watermarked-knn_1_3

KNN增强版本LOF

局部离群因子(LOF)算法,专门用于异常检测

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import LocalOutlierFactorX = np.array([[1, 2],[2, 3],[3, 3],[6, 5],[7, 9],[20, 20],
])k = 2
lof = LocalOutlierFactor(n_neighbors=k, contamination=0.3)
y_pred = lof.fit_predict(X)anomaly_scores = lof.negative_outlier_factor_
for i, (point, label, score) in enumerate(zip(X, y_pred, anomaly_scores)):status = "异常" if label == -1 else "正常"print(f"点 {i}: 坐标={point}, 状态={status}, LOF分数={score:.3f}")
  • n_neighbors=2,就是超参数k,用来选择邻居数
  • contamination=0.3,表示有30%的数据为异常

脚本!启动:

watermarked-knn_1_4

两种算法的对比

KNN LOF
功能 查找最近邻居 检测局部异常
输出 每个点最近的 k 个邻居及其距离 每个点的异常标签(1 或 -1)和 LOF 分数
适用任务 查找最近的用户/商品/样本 检测数据中的异常点
是否计算异常 是(negative_outlier_factor_)
参数 n_neighbors 只是最近邻个数 n_neighbors, contamination 控制邻居数和异常比例

小结

  • 联系我,做深入的交流

至此,本文结束
在下才疏学浅,有撒汤漏水的,请各位不吝赐教...

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

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

相关文章

FastReport文本框根据高度缩小字体

我尝试使用报表自带的设置,AutoShrink = FontSize​​ 并设置 AutoShrinkMinSize=10避免字体过小。 但这种方法只会在文本行超出文本框宽度时才会触发字体缩小,无法满足在不触及宽度时,多次换行导致高度不够的情况下…

JAVA工具包

1、JSON数据结构处理 FastJSON、Gson、Jackson工具包 2、在线API接口文档生成 (1)knife4j在线文档 (2)Swagger生成API文档 3、参数校验 (1)Hibernate Validator (2)javax.validation 注解式参数校验 (3)Apac…

2025 年蝶阀厂家最新推荐:全金属 / 高压 / 美标 / 双偏心 / 三偏心等各类蝶阀优质厂家榜单及选择指南

在工业流体控制体系中,蝶阀作为关键的截断与调节设备,其品质直接决定着生产系统的安全与效率。当前蝶阀市场品牌繁杂,部分产品存在密封性能差、抗恶劣工况能力弱等问题,导致企业维修成本攀升、生产频繁中断,甚至引…

基于MATLAB的一维大地电磁反演程序实现

1. 核心方法概述 一维大地电磁反演通过建立地下电性结构与电磁响应的数学关系,从观测数据反演地下电阻率分布。常用方法包括:Bostick反演:基于频域解析解的快速反演方法 Occam反演:以最小模型复杂度为目标的最优化…

DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(一)

DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(一)DevExpress WPF拥有120+个控件和库,将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程…

Java并发机制的底层实现原理:从CPU到JVM的全面解析

深入理解volatile、synchronized和原子操作的实现机制,掌握高并发编程的核心原理引言:为什么需要了解底层原理? 在日常开发中,我们经常使用volatile、synchronized和原子类来解决并发问题。但仅仅会使用这些工具是…

2025年10月储罐源头厂家最新权威榜单:技术实力与市场口碑深度解析

2025年10月储罐源头厂家最新权威榜单:技术实力与市场口碑深度解析随着工业和化工行业的快速发展,储罐作为关键的储存设备,其质量和性能直接影响到企业的生产效率和安全。为了帮助筛选储罐品牌,特此发布权威推荐榜单…

学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视

学习unigui【38】重新认识UUNIGUI--为什么这样快? 站在“架构与性能”层面重新审视为什么 UniGUI 这么快、甚至感觉比原生 HTML + JS 框架还灵敏? 答案在于:✅ UniGUI 把「前端交互」和「后端状态」紧密绑定到一个持…

2025 年国内发电机厂家最新推荐排行榜:汽油 / 柴油 / 10KW-200KW 多功率机型精选,全方位解读品牌实力助力精准选购

在 2025 年工业生产、基础设施建设、应急保障等领域对电力供应的依赖度持续攀升的背景下,汽油发电机、柴油发电机及不同功率规格的发电机需求日益增长。然而,当前发电机市场品牌数量繁杂,不同品牌在产品质量、技术水…

wqs二分学习笔记

一般解决问题 你有一个 \(k\),表示最后要变成 \(k\) 个,或者说是选 \(k\)。 形式化地讲,设 \(f(i)\) 表示最后变成 \(i\) 个,或者是选 \(i\) 个的方案。 你一般要求的是 \(f(k)\) 的最大值或者最小值。 问题特征 你…

Android系统中使用initrc脚本在开机时禁用selinux

正常情况下设置selinux为宽容模式时,需要在adb shell 中执行setenforce 0的操作临时禁用selinux。 (当然,手机上有专门的magisk模块/app可以禁用,此处只是对userdebug/eng版本的系统提供的禁用方法) 为了避免每次…

2025年10月氧化镁厂家最新推荐排行榜,轻烧氧化镁,重烧氧化镁,高纯氧化镁,活性氧化镁公司推荐!

2025年10月氧化镁厂家最新推荐排行榜:轻烧氧化镁、重烧氧化镁、高纯氧化镁、活性氧化镁公司推荐随着工业技术的不断发展,氧化镁在多个领域中的应用越来越广泛。无论是轻烧氧化镁、重烧氧化镁、高纯氧化镁还是活性氧化…

Vector向量数据库对比

Vector向量数据库对比简介 向量数据库已成为存储和索引非结构化与结构化数据表征的首选工具。这些表征被称为向量嵌入(vector embeddings),由嵌入模型生成。向量存储在使用深度学习模型(尤其是大语言模型)开…

2025 年最新推荐集装箱拖车供应厂家权威榜单:全方位解析优质企业实力,助力精准选择箱式 / 冷藏等拖车服务

在集装箱运输行业快速发展的过程中,市场乱象逐渐凸显,给企业和货主的运输需求带来诸多困扰。众多集装箱拖车供应厂家资质良莠不齐,部分厂家缺乏规范管理,服务质量难以保障;运输安全隐患频发,不少厂家未配备完善的…

2025 年试验箱厂家最新推荐排行榜:聚焦高低温 / 恒温恒湿 / 冷热冲击等设备研发实力与 ISO 质量管控的标杆企业精选

当前工业制造、航空航天、电子通讯等领域对环境试验设备需求激增,试验箱作为检测产品性能稳定性的核心设备,其质量与技术水平直接影响下游企业研发效率与产品质量。然而市场上试验箱企业数量繁杂,部分企业存在技术创…

完整教程:PyTorch深度学习实战【12】之基于RNN的自然语言处理入门

完整教程:PyTorch深度学习实战【12】之基于RNN的自然语言处理入门pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "…

IDA9.0中文版与相关插件安装详细教程

一、安装IDA9.0中文版前提是需要安装插件中的 python包:python-3.11.9-amd64.exe然后再安装IDA Professional 9.0中文版二、IDA插件安装1.IDA Feeds插件安装进入idalib目录,然后使用以下命令进行安装:pip install …

深入解析:用AI重塑电商,京东零售发布电商创新AI架构体系Oxygen

深入解析:用AI重塑电商,京东零售发布电商创新AI架构体系Oxygenpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "C…

2025 北京宽带安装公司最新推荐榜:专业口碑双优服务商汇总,企业家庭装机必看指南北京企业/北京无线/北京商务/北京商业/北京店铺宽带安装公司推荐

随着北京数字经济加速发展,企业云办公、家庭高清娱乐等需求对宽带服务的稳定性、响应速度提出更高要求。但当前市场仍存诸多痛点:部分服务商安装响应滞后,老旧小区与远郊区域服务覆盖不足;隐性收费、技术能力参差不…

2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!

2025年10月苹果仓源头厂家最新推荐榜单:专业仓储与高效配送的优质选择!随着电子商务和供应链管理的不断发展,高效的仓储和配送解决方案成为企业成功的关键因素之一。苹果仓作为一种先进的仓储解决方案,不仅能够提升…