【经典机器学习算法】谱聚类算法及其实现(python)
🌈 个人主页:十二月的猫-CSDN博客
🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光
目录
1. 前言
2. 前提知识
2.1 邻接矩阵
2.2 度与度矩阵
2.3 矩阵的相似
2.4 连通子图
3. 相似度的衡量方法
3.1 近邻法
3.2 k近邻法
3.3 高斯核函数
4. 图拉普拉斯矩阵(Graph Laplacian Matrix)
4.1 非规范化的图拉普拉斯矩阵
4.2 非规范化的图拉普拉斯矩阵的性质
5. 谱聚类(无向图切割)
5.1 谱聚类切割目标(优化目标-loss)
5.2 谱聚类算法思想
5.2.1 RatioCut切图
5.2.2 Ncut切图
5.2.3 总结
6. 谱聚类算法实现(基于python实现)
7. 总结
1. 前言
在看一篇论文的过程中,遇到一个问题:
“已知数据集,要求将数据集分为几组,要求组间距离最大,组内距离最小”
这是一个无监督问题,在查阅资料后,认为聚类可以帮我解决这个问题
谱聚类的思想来源于图论,它把待聚类的数据集中的每一个样本看做是图中一个顶点,这些顶点连接在一起,连接的这些边上有权重,权重的大小表示这些样本之间的相似程度。同一类的顶点它们的相似程度很高,在图论中体现为同一类的顶点中连接它们的边的权重很大,不在同一类的顶点连接它们的边的权重很小。
于是谱聚类的最终目标就是找到一种切割图的方法,使得切割之后的各个子图内的权重很大,子图之间的权重很小。
可以看出,数据集总共分为2类左右,沿着图中蓝色线切割可以得到结果,这种切割的前提是这两个类之间的顶点,比如顶点i和j之间的权重最小,即Wij最小。
2. 前提知识
假设给定一个数据集X={x1,x2,…,xn},其中每一个样本 xi∈ 。按照图论的思想,我们将这个 n 个数据向量当做 m 维空间中某一幅无向图上的一个个点,因为我们的目的是衡量这些点之间的相似性,所以本文把这幅图叫做相似图,记为 G=(V,E) ,其中 V={v1,v2,…,vn} 表示顶点, E 表示边的集合。连接两个顶点 vi 和 vj 的边的权重记为
,它们的相似性用
表示,该相似性的值越大,说明它们越相似,反之则越不相似。
本文要求边的权重 wij≥0 ,权重等于0表示俩顶点无连接,则 n 个顶点的权重构成一个矩阵 W=(),i,j=1,2,…,n ,这个矩阵将在下文出现。
这里
和
有直接关系
2.1 邻接矩阵
对于一幅无向图G=(V,E),学过图论或者数据结构的同学都知道,他有两个很重要的概念是图的邻接矩阵和顶点的度。所有顶点之间的权重构成一个n×n矩阵,叫做邻接矩阵,也叫权重矩阵,即:
对于无向图,顶点vi与顶点vj之间的权重和顶点vj与顶点vi之间的权重是一样的,因而wij=wji,因此W是对称矩阵,即W=WT。顶点自己到自己的权重是多少呢?这里先按下不表。这个邻接矩阵稍后将作为图的相似矩阵。注意这里的相似矩阵不是矩阵的相似。
相似矩阵:由点之间的相似值sij来组成的矩阵
矩阵的相似:两个矩阵,也就是两个图是否相似的定量衡量
2.2 度与度矩阵
在数据结构中,度定义为与该顶点直接连接的顶点的个数,或者是连接到该顶点的边的个数。不过不采用这个定义。对于某个顶点di,i=1,2,…,n而是将度定义为:
从公式(2)可以看出,顶点vi的度其实就是邻接矩阵第i行的和(第i列的和也可以,因为W是对称矩阵)。
度矩阵定义为n个度构成的对角矩阵,即:
相似矩阵对角线上的值:本行所有wij求和
2.3 矩阵的相似
给定顶点V的一个子集A⊂V,我们定义它的补为。再给定顶点V的一个子集B⊂V,我们定义它的补为
,对于2个子集A和B,我们定义:
公式(4)表示两个子集中顶点之间的权重之和,注意这里不包含子集内顶点之间的权重。
子集的大小有两种定义:
- 子集内顶点的个数,记为|A|。
- 子集内所有顶点的度之和,记为:
。
2.4 连通子图
对于一个非空子集A⊂V,如果A中的任意两个顶点都至少存在一条路径将它们连接起来,并且A中的其它顶点也在这条路径上,则称A是连接的。如果子集A是连接的,并它与它的补A¯不存在任何的连接。则称A是一个连通子图。非空子集A1,A2,…,Ak构成图V的一个分割,用数学公式来写就是A1∪A2,…,∪Ak=V。
3. 相似度的衡量方法
wij:表示vi、vj两个点之间的权重
sij:表示vi、vj两个点之间的相似度
权重就是相似度,相似度越大权重越大
图中各个顶点的相似度衡量主要基于距离的度量,也就是说空间两个点的距离越近,则它们越相似,距离越远,则它们越不相似,即相似度与距离成反比,所以只要你使用的度量空间具有这种性质,都可以作为相似度的衡量方法。下面介绍三种相似度的衡量方法,同时也是相似矩阵的计算方法。
3.1
近邻法
该方法采用欧式距离计算两个顶点的距离,然后设定一个阈值ϵ,使得:
从公式(5)可以看出,由此得到的相似矩阵其元素要么是0要么是ϵ,这种方法获得权重信息量太少了,一般很少使用。
缺陷:相似度不是一个连续的变量,且只有一个固定的值
3.2 k近邻法
该方法取与顶点最近的k个顶点,该顶点与这k个顶点的权重都大于0,但这会导致最后所得的相似矩阵不一定是对称的,因为一个点vi在另外一个点vj的k个近邻中,并不能保证vj也在vi的k个近邻中。有两种可以保证所得的相似矩阵对称:
- 两个顶点vi与vj只要其中一个点在另外一个点的k个近邻中,则令wij=wji,只有这两个顶点同时都不在任何一方的k个近邻中,则令wij=wji=0。综合可得:
方法本质:增加限制条件,保证其一定是对称的
- 两个顶点vi与vj只同时在双方的k个近邻中,则令wij=wji,只要有一方不在另外一方的k个近邻中,则令wij=wji=0。综合:
3.3 高斯核函数
考虑到相似度计算的问题在于:
1、保证对称
2、和距离呈反函数
3、不论什么维度都要能够计算距离,从而计算相似度
到这里不难想到:高斯核函数
该方法将所有的顶点都连接起来。然后通过度量空间中某种对称度量算子来计算顶点之间的相似度。比如使用高斯核函数计算两个顶点之间的相似度:
注意,这里的是一个标量,标量的转置仍然是它自身,所以公式(8)是一个对称的度量算子。为什么要求是对称的度量的算子,因为要保证租后得到的相似矩阵是相似的。
4. 图拉普拉斯矩阵(Graph Laplacian Matrix)
4.1 非规范化的图拉普拉斯矩阵
图拉普拉斯矩阵的定义比较简单,即:
其中D是公式(3)的度矩阵,W是公式(1)的权重矩阵(相似矩阵)
举个例子,给定下面的图:
把此“图”转换为邻接矩阵的形式,记为:W
把的每一列元素加起来得到个数,然后把它们放在对角线上(其它地方都是零),组成一个N × N N \times NN×N对角矩阵,记为度矩阵D DD,如下图所示:
根据拉普拉斯矩阵的定义L = D − W L=D-WL=D−W,可得拉普拉斯矩阵 L LL为:
4.2 非规范化的图拉普拉斯矩阵的性质
(1)对于任意的向量f∈Rn,有:
(2)L是一个对称半正定矩阵。
因为经过相似矩阵W的各种求法可知,其元素wij是非负数,所以由公式(10)可知:
恒成立。从而L是一个对称半正定矩阵。
补充一下正定矩阵的作用:
很多时候,我们在机器学习/深度学习/优化问题中需要计算最优解,要怎么判断我们所求的解就是最优解呢?
这里需要引入:黑塞矩阵(Hessian)
黑塞矩阵(Hessian):
- 如果是正定矩阵,则临界点处是一个局部极小值
- 如果是负定矩阵,则临界点处是一个局部极大值
- 如果是不定矩阵,则临界点处不是极值
(3)L的最小特征值为0,对应的特征向量为全1向量1。
所以,矩阵L的0特征值对应的特征向量为1。
补充定理1:对于一个分块对角矩阵A:
它的特征值等于各个分块矩阵Ai,i=1,2,…,n的特征值。
5. 谱聚类(无向图切割)
一张图,如下:
将其分为几组,可以理解为:1、由单个点去聚合;2、由整张图去切割
回收前面提到的“矩阵的相似”:
这里我们切割的目的就是:要让切割后的子图之间的相似程度最小,子图内的相似程度最大
切割子图之间的相似程度定义如下:
定义 A 和 B是图 G 中两个子图,则定义子图A和 B的切图权重为:
那么对于我们k个子图的集合:A 1 , A 2 , . . . , A k,我们定义切图 cut 为:
5.1 谱聚类切割目标(优化目标-loss)
那么如何切图可以让子图内的点权重和高,子图间的点权重和低呢?一个自然的想法就是最小化c u t ( A 1 , A 2 , . . . , A k ),但是可以发现,这种极小化的切图存在问题,如下图:
问题出现本质:没有考虑算法内聚性,没有让子图内的权重尽量高
容易确保切割数量与cut函数的关系不是单调的,存在极值点:
1、当子图数量增加,则需要增加考虑子图间的cut值
2、当子图数量减少,需要增加考虑子图内部的连接强度
5.2 谱聚类算法思想
为了避免最小切图导致的切图效果不佳,我们需要对每个子图的规模做出限定,一般来说,有两种切图方式,第一种是RatioCut,第二种是Ncut。下面我们分别加以介绍:
5.2.1 RatioCut切图
RatioCut切图为了避免上面出现的最小切图,对每个切图,不光考虑最小化cut( A 1,A 2 , ..,A k )它还同时考虑最大化每个子图点的个数,即:
最小化这个函数即可。
5.2.2 Ncut切图
Ncut切图和RatioCut切图很类似,但是把Ratiocut的分母 ∣ A i ∣换成。由于子图样本的个数多并不一定权重就大,我们切图时基于权重也更合我们的目标,因此一般来说Ncut切图优于RatioCut切图。
5.2.3 总结
引入子图内连接强度:
的本质就可以用这个intra connect(A)来代替
本质上:除上intra connect(A)和|Ai|的目的都是考虑上子图内部的内聚性
6. 谱聚类算法实现(基于python实现)
import numpy as np
from sklearn.cluster import KMeans
import matplotlib.pyplot as pltdef load_data(filename):"""载入数据:param filename: 文件名:return: numpy array 格式的数据"""data = np.loadtxt(filename, delimiter='\t')return datadef distance(x1, x2):"""获得两个样本点之间的欧几里得距离:param x1: 样本点1:param x2: 样本点2:return: 两个样本点之间的距离"""return np.linalg.norm(x1 - x2)def get_dist_matrix(data):"""获取距离矩阵:param data: 样本集合:return: 距离矩阵"""return np.linalg.norm(data[:, np.newaxis] - data[np.newaxis, :], axis=-1)def getW(data, k):"""获得邻接矩阵 W:param data: 样本集合:param k: KNN参数:return: 邻接矩阵 W"""n = len(data)dist_matrix = get_dist_matrix(data)W = np.zeros((n, n))for idx in range(n):# 获取最近k个邻居的索引idx_array = np.argsort(dist_matrix[idx])[1:k+1] # 跳过自己W[idx, idx_array] = 1# 确保邻接矩阵是对称的return (W + W.T) / 2def getD(W):"""获得度矩阵:param W: 邻接矩阵:return: 度矩阵 D"""return np.diag(np.sum(W, axis=1))def getL(D, W):"""获得拉普拉斯矩阵:param D: 度矩阵:param W: 邻接矩阵:return: 拉普拉斯矩阵 L"""return D - Wdef getEigen(L, cluster_num):"""获得拉普拉斯矩阵的特征向量:param L: 拉普拉斯矩阵:param cluster_num: 聚类数目:return: 选定特征值对应的特征向量"""eigval, eigvec = np.linalg.eig(L)ix = np.argsort(eigval)[:cluster_num] # 选择最小的cluster_num个特征值的索引return eigvec[:, ix]def plotRes(data, clusterResult, clusterNum):"""结果可视化:param data: 样本集:param clusterResult: 聚类结果:param clusterNum: 聚类个数"""scatterColors = ['black', 'blue', 'green', 'yellow', 'red', 'purple', 'orange']for i in range(clusterNum):color = scatterColors[i % len(scatterColors)]plt.scatter(data[clusterResult == i, 0], data[clusterResult == i, 1], c=color, marker='+')plt.title(f'Clustering Result with {clusterNum} clusters')plt.xlabel('Feature 1')plt.ylabel('Feature 2')plt.show()def cluster(data, cluster_num, k):"""聚类函数:param data: 输入数据:param cluster_num: 聚类数目:param k: KNN参数:return: 聚类标签"""W = getW(data, k)D = getD(W)L = getL(D, W)eigvec = getEigen(L, cluster_num)# 使用KMeans进行聚类clf = KMeans(n_clusters=cluster_num)label = clf.fit_predict(eigvec) # 直接使用fit_predictreturn labelif __name__ == '__main__':cluster_num = 7knn_k = 5filename = '../data/Aggregation_cluster=7.txt'data = load_data(filename=filename)data = data[:, :-1] # 去除最后一列(假设为标签列)label = cluster(data, cluster_num, knn_k)plotRes(data, label, cluster_num)
运行结果如下:
7. 总结
以上就是整个谱聚类的原理介绍、分析、实现和讨论。其本质呢还是从数据中构造某种相似矩阵(类比协方差矩阵),然后对矩阵进行特征分解,为去掉冗余特征,再做投影(降维),抓住主要成分,注意和PCA的区别,PCA的目的是用最少的特征尽可能地表示最多的信息(对应前几个最大的特征值),而谱聚类是要求切图耗费的能量最少(对应前几个最小特征值)。
最后是谱聚类的一些问题:
(1)和k-means一样都要选择类别数/分组数k。
(2)选择相似性矩阵的度量方式,度量方式不同得到的图拉普拉斯矩阵不同,可能会导致不对称。
(3)可以看到,谱聚类在投影之后还是需要其他聚类方法介入,其实可以这么认为,谱聚类前面的这些工作可以看做是数据预处理的过程,而后再使用经典的聚类方法如k-means等。
(4)谱聚类对于非凸数据聚类很有用(请看前面的几个例子)。
(5)和支持向量机将数据投影到高维空间(kernel trick)相反,谱聚类将数据从高维降到低维空间;尽管这两者都是为了使得投影后的数据线性可分,但是使用的方法却是相反的。
撰写文章不易,如果文章能帮助到大家,大家可以点点赞、收收藏呀~
十二月的猫在这里祝大家学业有成、事业顺利、情到财来
相关文章:

【经典机器学习算法】谱聚类算法及其实现(python)
🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀深度学习_十二月的猫的博客-CSDN博客 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 1. 前言 2. 前…...

【Linux】Linux环境基础开发工具使用
Linux开发工具 Linux编辑器-vim使用 1. vim的基本概念 vim的三种模式,分别是命令模式(command mode)、插入模式(Insert mode)和底行模式(last line mode)。 正常/普通/命令模式: …...

Halcon基础系列1-基础算子
1 窗口介绍 打开Halcon 的主界面主要有图形窗口、算子窗口、变量窗口和程序窗口,可拖动调整位置,关闭后可在窗口下拉选项中找到。 2 显示操作 关闭-dev_close_window() 打开-dev_open_window (0, 0, 712, 512, black, WindowHandle) 显示-dev_display(…...

【AI大模型】深入Transformer架构:编码器部分的实现与解析(上)
目录 🍔 编码器介绍 🍔 掩码张量 2.1 掩码张量介绍 2.2 掩码张量的作用 2.3 生成掩码张量的代码分析 2.4 掩码张量的可视化 2.5 掩码张量总结 🍔 注意力机制 3.1 注意力计算规则的代码分析 3.2 带有mask的输入参数: 3.…...

spring学习日记-day7-整合mybatis
一、学习目标 spring整合MyBatis的原理主要涉及到将MyBatis的Mapper映射文件交由Spring容器管理,并将其注入到MyBatis的SqlSessionFactory中,从而实现两者的整合。 二、整合mybatis 1.写一个mybatis测试案例 项目结构: 1.数据库 CREATE DA…...

【YOLO目标检测行人与车数据集】共5607张、已标注txt格式、有训练好的yolov5的模型
目录 说明图片示例 说明 数据集格式:YOLO格式 图片数量:5607 标注数量(txt文件个数):5607 标注类别数:2 标注类别名称:person、car 数据集下载:行人与车数据集 图片示例 数据集图片: …...
JMeter中线程组、HTTP请求的常见参数解释
在JMeter中,线程组和HTTP请求是进行性能测试的两个核心组件。以下是它们的一些常见相关参数的解释: 线程组参数 线程数 指定模拟的用户数,即并发执行的线程数。 Ramp-Up时间(秒) 指定所有线程启动的时间间隔。在这…...

优化Mysql
目录 Mysql优化就四种:定位慢查询/sql执行计划/索引/Sql优化经验... 2 1Mysql如何定位慢查询?... 2 2Sql语句执行很慢,如何分析呢?... 3 2.1那这个SQL语句执行很慢,如何分析呢?. 3 3.了解过索引吗?(什么是索引)…...

如何使用MethodChannel通信
文章目录 1 概念介绍2 实现方法3 经验总结我们在上一章回中介绍了Visibility组件相关的内容,本章回中将介绍Flutter与原生平台通信相关的内容.闲话休提,让我们一起Talk Flutter吧。 1 概念介绍 在移动开发领域以Android和IOS SDK开发出的应用程序叫原生开发,开发同一个程序…...
【JavaWeb】JavaWeb笔记 HTTP
文章目录 简介HTTP1.0和HTTP1.1的区别 请求和响应报文报文的格式请求报文form表单发送GET请求特点GET请求行,请求头,请求体form表单发送post请求特点post的请求行 请求头 请求体 响应报文响应状态码更多的响应状态码 简介 HTTP 超文本传输协议 (HTTP-Hyper Text transfer proto…...

Java项目实战II基于Java+Spring Boot+MySQL的甘肃非物质文化网站设计与实现(源码+数据库+文档)
目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发,CSDN平台Java领域新星创作者 一、前言 甘肃省作为中国历史文化名省,拥有丰富的非物质文化遗产资源,涵盖表演艺术、手…...

数据结构--包装类简单认识泛型
目录 1 包装类 1.1 基本数据类型和对应的包装类 1.2 装箱和拆箱,自动装箱和自动拆箱 2 什么是泛型 3 引出泛型 3.1 语法 4 泛型类的使用 4.1 语法 4.2 示例 5 泛型的上界 5.1 语法 5.2 示例 5.3 复杂示例 8 泛型方法 8.1 定义语法 8.2 示例 总结 1 …...

c#使用winscp库实现FTP/SFTP/SCP的获取列表、上传和下载功能
网上写c#调用winscp实现的资料很少,且写的不够详细。本人查了下winscp的libraries说明,写了个小工具,供大家参考。 winscp的接口说明地址如下: WinSCP .NET Assembly and COM Library :: WinSCP 一、先展示一下小工具的界面 1、…...

【Android 13源码分析】Activity生命周期之onCreate,onStart,onResume-1
忽然有一天,我想要做一件事:去代码中去验证那些曾经被“灌输”的理论。 – 服装…...

达梦数据库开启归档模式
目录 一、什么是归档模式? 二、开启归档模式的步骤 1、创建归档目录 2、进入dm数据库bin目录 3、登录数据库 4、关闭数据库 5、启动数据库到Mount状态 6、增加本地归档日志文件 7、开启归档 8、启动数据库 9、验证是否开启成功 三、开启归档模式的优…...
C++ 语言特性07 - 静态成员的初始化
一:概述 1. 静态成员变量通常在类定义内部声明,并在类定义外部定义和初始化。 class MyClass { public:static int staticVar; // 声明 };int MyClass::staticVar 42; // 定义和初始化 2. 从C11开始,可以在类内直接初始化静态数据成员&am…...

【数据结构】图论基础
文章目录 图的概念图的基本概念图的类型图的表示方法 图的相关基本概念1. 路径(Path)2. 连通性(Connectivity)3. 图的度(Degree)4. 子图(Subgraph)5. 生成树(Spanning Tr…...

HTML5实现好看的唐朝服饰网站模板源码2
文章目录 1.设计来源1.1 网站首页1.2 唐装演变1.3 唐装配色1.4 唐装花纹1.5 唐装文化 2.效果和源码2.1 动态效果2.2 源代码 源码下载万套模板,程序开发,在线开发,在线沟通 作者:xcLeigh 文章地址:https://blog.csdn.ne…...

golang web笔记-2.请求request
什么是request http消息分为request(请求) 和 response(响应) request:在go中是一个struct,代表了客户段发送的http请求,已可以通过request 的方法访问请求中的cookie、URL、User Agent…...
docker的安装与启动——配置国内Docker源
移除旧版本docker sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine 配置docker yum源。 sudo yum install -y yum-utils sudo yum-config-manager –add-repo ht…...

C++初阶-list的底层
目录 1.std::list实现的所有代码 2.list的简单介绍 2.1实现list的类 2.2_list_iterator的实现 2.2.1_list_iterator实现的原因和好处 2.2.2_list_iterator实现 2.3_list_node的实现 2.3.1. 避免递归的模板依赖 2.3.2. 内存布局一致性 2.3.3. 类型安全的替代方案 2.3.…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
k8s从入门到放弃之Ingress七层负载
k8s从入门到放弃之Ingress七层负载 在Kubernetes(简称K8s)中,Ingress是一个API对象,它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress,你可…...
服务器硬防的应用场景都有哪些?
服务器硬防是指一种通过硬件设备层面的安全措施来防御服务器系统受到网络攻击的方式,避免服务器受到各种恶意攻击和网络威胁,那么,服务器硬防通常都会应用在哪些场景当中呢? 硬防服务器中一般会配备入侵检测系统和预防系统&#x…...
基于数字孪生的水厂可视化平台建设:架构与实践
分享大纲: 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年,数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段,基于数字孪生的水厂可视化平台的…...
Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理
引言 Bitmap(位图)是Android应用内存占用的“头号杀手”。一张1080P(1920x1080)的图片以ARGB_8888格式加载时,内存占用高达8MB(192010804字节)。据统计,超过60%的应用OOM崩溃与Bitm…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

网站指纹识别
网站指纹识别 网站的最基本组成:服务器(操作系统)、中间件(web容器)、脚本语言、数据厍 为什么要了解这些?举个例子:发现了一个文件读取漏洞,我们需要读/etc/passwd,如…...

云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...