KMeans vs DBSCAN:如何根据数据特征选择最佳聚类算法(附Python实战代码)
KMeans vs DBSCAN如何根据数据特征选择最佳聚类算法附Python实战代码在数据探索的旅程中我们常常面对一堆看似杂乱无章的点内心却渴望发现其中隐藏的规律与结构。聚类分析正是这样一把钥匙它能帮助我们在无标签的数据海洋中识别出内在的群体模式。对于刚踏入机器学习领域的数据分析师和算法爱好者而言面对琳琅满目的聚类算法一个最实际的问题往往摆在面前我手头这份数据究竟该用KMeans还是DBSCAN这绝不是一个可以随意回答的问题。选择错误轻则得到似是而非、难以解释的结果重则完全错过数据中真正有价值的模式。KMeans以其简洁高效闻名而DBSCAN则因其发现任意形状簇的能力备受推崇。但它们的“性格”迥异适用场景也大相径庭。本文将带你跳出单纯的理论对比从数据本身的“脾气秉性”出发结合生动的Python实战案例手把手教你如何像一位经验丰富的数据侦探根据数据特征精准地选用最合适的聚类工具。我们会深入探讨当数据呈球形分布、月牙形交织或是混杂着大量噪声时这两种算法的表现究竟有何不同以及如何通过代码直观地验证你的判断。1. 理解核心差异从“划分”到“发现”的思维跃迁在深入代码之前我们必须先厘清KMeans和DBSCAN最根本的哲学差异。这不仅仅是算法步骤的不同更是两种看待数据世界的方式。KMeans的本质是一种“划分式”算法。它假设世界可以被清晰地划分为K个区域每个区域有一个中心质心区域内的成员都离自己的中心最近。这就像管理者要将员工分成K个小组并指定每个小组的组长要求所有组员都围绕着自己的组长坐。它的目标是让组内成员距离组长尽可能近组间距离尽可能远。因此KMeans对数据的核心假设是簇是凸形的、各向同性的并且大小相对均匀。注意这里的“各向同性”意味着数据点在各个方向上的方差相似形成的簇更接近球形。如果数据被拉得很长各向异性KMeans的表现就会大打折扣。相比之下DBSCAN则是一位“探险家”。它不预设簇的数量而是基于一个朴素的观察一个簇是数据空间中密度相连的点的最大集合。它定义了“核心点”周围邻居足够多的点、“边界点”在核心点附近但自身邻居不多的点和“噪声点”孤立的点。算法从一个核心点出发像滚雪球一样将所有密度可达的点吸纳进来形成一个簇。这个过程会一直持续直到所有点都被访问。DBSCAN的强大之处在于它能发现任意形状的簇并且对噪声点具有天然的鲁棒性。为了更直观地把握两者的区别我们可以从以下几个维度进行对比特性维度KMeansDBSCAN核心思想基于距离的划分基于密度的发现簇形状假设凸形近似球形任意形状是否需要预设簇数(K)是关键超参数否关键超参数K簇数eps邻域半径 min_samples最小样本数对噪声的处理敏感噪声会影响质心计算鲁棒能识别并分离噪声点对初始值的敏感性高不同初始质心可能导致不同结果低结果由数据密度决定具有确定性聚类结果每个点必属于某一簇可能将点标记为噪声-1典型适用场景簇大小均匀、分离度好的球形数据簇密度不均、形状不规则、含噪声的数据理解这张表格是做出正确选择的第一步。接下来我们将通过具体的代码看看这些理论差异在真实数据上如何体现。2. 实战场景一当数据是“标准好学生”时我们首先生成一个最符合KMeans“理想学生”形象的数据集——由多个高斯分布球形簇生成的数据。使用sklearn的make_blobs函数可以轻松做到这一点。import numpy as np import matplotlib.pyplot as plt from sklearn.datasets import make_blobs from sklearn.cluster import KMeans, DBSCAN from sklearn.preprocessing import StandardScaler # 生成3个分离良好的球形簇 X_blob, y_blob_true make_blobs(n_samples300, centers3, cluster_std0.6, random_state42) # 可视化原始数据 plt.figure(figsize(12, 4)) plt.subplot(1, 3, 1) plt.scatter(X_blob[:, 0], X_blob[:, 1], cy_blob_true, s50, cmapviridis, edgecolork) plt.title(原始数据 (Ground Truth)) plt.xlabel(Feature 1) plt.ylabel(Feature 2) # 应用KMeans kmeans KMeans(n_clusters3, random_state42, n_init10) y_blob_kmeans kmeans.fit_predict(X_blob) centers kmeans.cluster_centers_ plt.subplot(1, 3, 2) plt.scatter(X_blob[:, 0], X_blob[:, 1], cy_blob_kmeans, s50, cmapviridis, edgecolork) plt.scatter(centers[:, 0], centers[:, 1], cred, s200, markerX, labelCentroids) plt.title(KMeans 聚类结果) plt.xlabel(Feature 1) plt.ylabel(Feature 2) plt.legend() # 应用DBSCAN # 对数据进行标准化因为DBSCAN对尺度敏感 X_blob_scaled StandardScaler().fit_transform(X_blob) dbscan DBSCAN(eps0.3, min_samples5) y_blob_dbscan dbscan.fit_predict(X_blob_scaled) plt.subplot(1, 3, 3) # DBSCAN可能将点标记为噪声标签为-1我们用不同颜色区分 unique_labels np.unique(y_blob_dbscan) colors plt.cm.viridis(np.linspace(0, 1, len(unique_labels))) for k, col in zip(unique_labels, colors): if k -1: col gray # 噪声点用灰色表示 class_member_mask (y_blob_dbscan k) xy X_blob[class_member_mask] plt.scatter(xy[:, 0], xy[:, 1], c[col], s50, edgecolork, labelfCluster {k} if k ! -1 else Noise) plt.title(DBSCAN 聚类结果 (标准化后)) plt.xlabel(Feature 1) plt.ylabel(Feature 2) plt.legend() plt.tight_layout() plt.show()运行这段代码你会看到三张并排的图。第一张是数据的真实分布第二张和第三张分别是KMeans和DBSCAN的聚类结果。在这个“理想”场景下两者通常都能完美地恢复出三个簇。但仔细观察DBSCAN的结果你可能会发现它也可能完美工作但这依赖于我们恰当地设置了eps和min_samples参数。如果eps设得太小可能会把一个大簇拆成多个小簇和噪声设得太大则可能把多个簇合并成一个。提示对于球形、分离度好的数据KMeans通常是更直接、更高效的选择。它无需数据标准化因为基于欧氏距离且结果易于解释每个簇有一个明确的中心。DBSCAN虽然也能做但需要额外调整参数有点“杀鸡用牛刀”的感觉。3. 实战场景二当数据是“抽象艺术家”时现实世界的数据很少乖乖地长成球形。更常见的是复杂、交织、非凸的形状。make_moons和make_circles生成的数据集就是经典的挑战。让我们看看两位“选手”的表现。from sklearn.datasets import make_moons, make_circles # 生成月牙形数据 X_moon, y_moon_true make_moons(n_samples300, noise0.05, random_state42) # 生成环形数据 X_circle, y_circle_true make_circles(n_samples300, factor0.5, noise0.05, random_state42) datasets [(X_moon, y_moon_true, Moons), (X_circle, y_circle_true, Circles)] fig, axes plt.subplots(2, 3, figsize(15, 10)) axes axes.ravel() plot_idx 0 for X, y_true, name in datasets: # 绘制真实分布 axes[plot_idx].scatter(X[:, 0], X[:, 1], cy_true, s50, cmapviridis, edgecolork) axes[plot_idx].set_title(f{name} - 真实分布) plot_idx 1 # KMeans 聚类 (强制分为2类) kmeans KMeans(n_clusters2, random_state42, n_init10) y_kmeans kmeans.fit_predict(X) axes[plot_idx].scatter(X[:, 0], X[:, 1], cy_kmeans, s50, cmapviridis, edgecolork) axes[plot_idx].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s200, markerX, cred) axes[plot_idx].set_title(f{name} - KMeans 结果) plot_idx 1 # DBSCAN 聚类 (同样标准化很重要) X_scaled StandardScaler().fit_transform(X) # 对于这种结构需要尝试不同的eps。这里是一个经验值。 dbscan DBSCAN(eps0.2 if name Moons else 0.2, min_samples5) y_dbscan dbscan.fit_predict(X_scaled) unique_labels np.unique(y_dbscan) for k in unique_labels: col gray if k -1 else plt.cm.viridis(k / max(1, len(unique_labels)-1)) class_mask (y_dbscan k) xy X[class_mask] label Noise if k -1 else fCluster {k} axes[plot_idx].scatter(xy[:, 0], xy[:, 1], c[col], s50, edgecolork, labellabel) axes[plot_idx].set_title(f{name} - DBSCAN 结果) axes[plot_idx].legend() plot_idx 1 # 隐藏多余的子图 for idx in range(plot_idx, len(axes)): axes[idx].set_visible(False) plt.tight_layout() plt.show()这个对比结果会非常鲜明。对于月牙形和环形数据KMeans会固执地试图用一条直线在更高维是超平面去划分两个簇结果就是把本属于一个自然簇的数据硬生生切成两半或者将两个交织的簇错误地按空间位置划分。它的“球形假设”在此完全失效。DBSCAN则能游刃有余地沿着数据的密度脉络勾勒出月牙和圆环的真实形状正确地将两个交织但密度分离的簇识别出来。这正是基于密度方法的威力所在。关键启示如果你的数据可视化后呈现出明显的非球形、流形或交织结构KMeans的基本假设已被打破DBSCAN或其变体如HDBSCAN应该是你的首选。4. 实战场景三当数据世界充满“干扰项”时真实数据几乎总是包含噪声、异常点或无关的干扰项。我们来看看两种算法在噪声面前的韧性。我们将在球形数据中加入一些随机分布的噪声点。# 生成带噪声的球形数据 X_blob_noisy, y_blob_noisy_true make_blobs(n_samples250, centers3, cluster_std0.7, random_state42) # 添加随机均匀分布的噪声点 np.random.seed(42) noise np.random.uniform(low-10, high10, size(50, 2)) X_combined np.vstack([X_blob_noisy, noise]) y_combined_true np.hstack([y_blob_noisy_true, np.full(50, -1)]) # 噪声点标签为-1 fig, axes plt.subplots(1, 3, figsize(15, 4)) # 绘制带噪声的原始数据 axes[0].scatter(X_combined[:, 0], X_combined[:, 1], cy_combined_true, s50, cmapviridis, edgecolork) axes[0].set_title(原始数据 (含噪声)) axes[0].set_xlabel(Feature 1) axes[0].set_ylabel(Feature 2) # KMeans 处理 (仍然尝试找3个簇) kmeans KMeans(n_clusters3, random_state42, n_init10) y_kmeans_noisy kmeans.fit_predict(X_combined) axes[1].scatter(X_combined[:, 0], X_combined[:, 1], cy_kmeans_noisy, s50, cmapviridis, edgecolork) axes[1].scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s200, markerX, cred) axes[1].set_title(KMeans 结果) axes[1].set_xlabel(Feature 1) # DBSCAN 处理 X_combined_scaled StandardScaler().fit_transform(X_combined) dbscan DBSCAN(eps0.5, min_samples10) # 增大min_samples使其对噪声更鲁棒 y_dbscan_noisy dbscan.fit_predict(X_combined_scaled) unique_labels np.unique(y_dbscan_noisy) for k in unique_labels: col gray if k -1 else plt.cm.viridis(k / max(1, len(unique_labels)-1)) class_mask (y_dbscan_noisy k) xy X_combined[class_mask] label Noise if k -1 else fCluster {k} axes[2].scatter(xy[:, 0], xy[:, 1], c[col], s50, edgecolork, labellabel) axes[2].set_title(DBSCAN 结果) axes[2].set_xlabel(Feature 1) axes[2].legend() plt.tight_layout() plt.show() # 打印噪声点识别情况 print(真实噪声点数量, (y_combined_true -1).sum()) print(DBSCAN识别出的噪声点数量, (y_dbscan_noisy -1).sum())观察结果你会发现KMeans会强行将噪声点也分配到三个簇中。这些远离核心的噪声点会像“引力异常”一样将簇的质心拉离其真实位置导致整个聚类结构发生扭曲核心的球形簇可能因此变得不够紧凑或位置偏移。DBSCAN则能清晰地将这些散布的、密度不足的点标记为噪声标签-1从而保护了核心簇结构的“纯洁性”。核心簇的形态和位置几乎不受影响。注意DBSCAN识别噪声的能力是一把双刃剑。min_samples参数是关键设置过小可能将稀疏区域的正常点误判为噪声设置过大则可能将小簇或边界点全部归为噪声。这需要结合业务理解进行调整。5. 决策指南与参数调优实战经过以上三个场景的洗礼我们可以总结出一个更细致的决策流程。但在实际应用中数据不会自己贴上“我是月牙形”或“我噪声很多”的标签。因此我们需要一套可操作的诊断和选择方法。第一步数据可视化与直觉判断无论如何先做散点图或更高维度的降维可视化如PCA、t-SNE。这是最直观的方式。观察点群是成团的球吗它们是否拉得很长、交织在一起背景中是否有大量离散的、孤立的点第二步基于观察的初步选择如果看到大致球形、分离良好的团块优先尝试KMeans。如果看到复杂形状、密度不均、明显噪声优先尝试DBSCAN。第三步关键参数调优实战选择了算法真正的挑战在于调参。这里提供一些实用的调优思路和代码片段。对于KMeans确定最佳K值KMeans最大的痛点是不知道K该设多少。肘部法则和轮廓系数是两种常用方法。from sklearn.metrics import silhouette_score # 生成测试数据 X, _ make_blobs(n_samples500, centers4, cluster_std1.0, random_state42) # 方法一肘部法则 - 绘制不同K值下的惯性簇内平方和 inertias [] K_range range(1, 11) for k in K_range: kmeans KMeans(n_clustersk, random_state42, n_init10) kmeans.fit(X) inertias.append(kmeans.inertia_) # inertia_ 即簇内平方和 plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.plot(K_range, inertias, bo-) plt.xlabel(Number of clusters (K)) plt.ylabel(Inertia) plt.title(Elbow Method For Optimal K) # 通常寻找“肘点”即惯性下降速度突然变缓的点。 # 方法二轮廓系数 - 衡量簇内紧密度和簇间分离度 silhouette_scores [] for k in K_range[1:]: # 轮廓系数要求至少2个簇 kmeans KMeans(n_clustersk, random_state42, n_init10) cluster_labels kmeans.fit_predict(X) silhouette_avg silhouette_score(X, cluster_labels) silhouette_scores.append(silhouette_avg) plt.subplot(1, 2, 2) plt.plot(list(K_range)[1:], silhouette_scores, ro-) plt.xlabel(Number of clusters (K)) plt.ylabel(Silhouette Score) plt.title(Silhouette Analysis For Optimal K) # 轮廓系数越接近1越好。 plt.tight_layout() plt.show()对于DBSCAN确定eps和min_samplesDBSCAN的参数更依赖于数据本身的尺度。一个常用的辅助工具是k-距离图。from sklearn.neighbors import NearestNeighbors # 使用标准化后的数据 X_scaled StandardScaler().fit_transform(X) # 计算每个点到其第k个最近邻的距离这里kmin_samples-1 min_samples 5 neighbors NearestNeighbors(n_neighborsmin_samples) neighbors_fit neighbors.fit(X_scaled) distances, indices neighbors_fit.kneighbors(X_scaled) # 取出每个点到其第min_samples个最近邻的距离并排序 k_distances np.sort(distances[:, min_samples-1]) plt.figure(figsize(8, 5)) plt.plot(np.arange(len(k_distances)), k_distances) plt.xlabel(Points sorted by distance) plt.ylabel(f{min_samples}-th nearest neighbor distance) plt.title(K-Distance Graph for DBSCAN eps selection) plt.grid(True) plt.show()在这张图上寻找一个“拐点”或“膝盖点”即曲线从陡峭变为平缓的位置。这个位置对应的y轴距离值通常可以作为eps的一个良好初始估计。min_samples一般从较小的值开始尝试如数据维度的2倍并根据对噪声的容忍度进行调整。第四步结果评估与业务验证内部评估使用轮廓系数、戴维森堡丁指数等指标但需谨慎这些指标本身有偏好。外部评估如果有部分真实标签可以使用调整兰德指数、互信息等。最重要的是业务验证聚类结果是否符合业务逻辑是否具有可解释性能否为后续决策提供洞察这才是终极的评判标准。6. 超越二元选择其他考量与混合策略KMeans和DBSCAN并非聚类世界的全部。在实际项目中你的工具箱里还应该有其他选项甚至可以考虑混合策略。当数据尺度差异巨大时无论是KMeans还是DBSCAN基于欧氏距离的算法都对特征尺度敏感。一个身高米和体重公斤的数据集体重的数值波动会完全主导距离计算。务必进行特征标准化如StandardScaler。这是实践中最容易忽略却至关重要的一步。当KMeans的假设部分成立时比如数据大致呈球形但含有噪声。你可以考虑先用DBSCAN去除噪声。再用KMeans对剩下的“干净”核心点进行聚类。# 混合策略示例DBSCAN去噪 KMeans聚类 X, _ make_blobs(n_samples300, centers3, cluster_std0.8, random_state42) noise np.random.uniform(low-8, high8, size(30, 2)) X_noisy np.vstack([X, noise]) # 第一步DBSCAN去噪 X_scaled StandardScaler().fit_transform(X_noisy) dbscan DBSCAN(eps0.5, min_samples10).fit(X_scaled) core_sample_mask np.zeros_like(dbscan.labels_, dtypebool) core_sample_mask[dbscan.core_sample_indices_] True # 获取非噪声点的索引 non_noise_mask dbscan.labels_ ! -1 X_clean X_noisy[non_noise_mask] print(f原始数据点{X_noisy.shape[0]}, 去噪后数据点{X_clean.shape[0]}) # 第二步对干净数据使用KMeans kmeans_clean KMeans(n_clusters3, random_state42).fit(X_clean)当需要更先进的密度聚类时DBSCAN对全局密度参数eps敏感难以处理密度差异大的簇。可以探索其升级版HDBSCAN它能自动确定簇的数量并对变化的密度更鲁棒。当数据量极大时KMeans有高效的变种Mini-Batch KMeans。对于超大规模数据可能需要考虑基于采样的方法或分布式聚类算法。最终选择聚类算法不是一个机械的流程而是一个结合数据洞察、算法理解和业务目标的综合决策过程。从可视化开始用KMeans和DBSCAN作为你的“探路石”观察它们在你数据上的表现理解其失败的原因你就能越来越准确地感知到数据的“脉搏”从而选出甚至设计出最适合的聚类方案。记住没有最好的算法只有最合适的算法。

相关新闻

AI原生应用:语义搜索技术的10大核心原理与实战指南

AI原生应用:语义搜索技术的10大核心原理与实战指南

AI原生应用:语义搜索技术的10大核心原理与实战指南 关键词:语义搜索、AI原生应用、自然语言处理、向量表示、上下文理解、意图识别、多模态融合、知识图谱、动态适应、可解释性 摘要:在“关键词搜索”统治互联网20年后,用户需求已从“找文字”升级为“懂意图”。本文深度拆…

2026/7/5 7:24:44 阅读更多 →
若依框架实战:如何快速适配达梦数据库(附完整配置步骤)

若依框架实战:如何快速适配达梦数据库(附完整配置步骤)

若依框架实战:快速适配达梦数据库的完整指南 最近在几个国产化项目中,都遇到了将现有Spring Boot应用迁移到达梦数据库的需求。若依(RuoYi)作为国内广泛使用的快速开发平台,其架构清晰、模块化程度高,是很多…

2026/5/17 8:58:11 阅读更多 →
SFC系统实战:如何用生产车间管理系统优化离散制造业的11个关键流程

SFC系统实战:如何用生产车间管理系统优化离散制造业的11个关键流程

SFC系统实战:如何用生产车间管理系统优化离散制造业的11个关键流程 在离散制造业的车间里,每天上演的是一场关于效率、精度与协同的无声战役。从一张订单下达到最终产品下线,中间横亘着无数个可能产生浪费、延误和混乱的环节。对于生产主管和…

2026/7/4 2:10:27 阅读更多 →

最新新闻

基于YOLOv10的红外目标检测实战指南

基于YOLOv10的红外目标检测实战指南

1. 项目背景与核心价值去年夏天,我在参与一个山区救援项目时,亲眼目睹了传统无人机监控系统的局限性。在浓烟和夜间环境下,普通摄像头完全失效,而热成像设备虽然能捕捉到热源,却无法准确识别是人、动物还是车辆。正是这…

2026/7/5 12:51:58 阅读更多 →
AIAgent之工具调用:Function Call 与 Tool Use

AIAgent之工具调用:Function Call 与 Tool Use

工具调用:Function Call 与 Tool Use工具调用是 Agent 的「手」,让大模型能操作外部世界。这篇讲 Function Calling 的原理、工具怎么定义、模型怎么选工具、参数怎么传、常见的工具类型,以及开发中的最佳实践。大家好,我是黒漂技…

2026/7/5 12:49:55 阅读更多 →
ICM-42688-P与STM32F746ZG在工业自动化中的应用

ICM-42688-P与STM32F746ZG在工业自动化中的应用

1. ICM-42688-P与STM32F746ZG的黄金组合解析 在工业自动化和机器人控制领域,传感器与微控制器的协同设计直接决定了系统的性能上限。ICM-42688-P作为TDK InvenSense推出的6轴MEMS运动传感器,与STMicroelectronics的STM32F746ZG Cortex-M7微控制器形成的硬…

2026/7/5 12:47:54 阅读更多 →
混合整数二次规划在模型预测控制中的应用与求解器对比

混合整数二次规划在模型预测控制中的应用与求解器对比

1. 混合整数二次规划在模型预测控制中的核心作用 混合整数二次规划(MIQP)作为模型预测控制(MPC)中处理离散决策变量的关键技术,其核心价值在于平衡计算复杂度和控制性能。在车辆动力系统控制这类典型应用中,变速箱档位选择、发动机启停等离散决策变量与连…

2026/7/5 12:47:54 阅读更多 →
YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

YOLO实战避坑指南:从环境配置到部署落地的完整工程化流程

如果你在 2024 年或 2025 年才开始接触 YOLO,可能会觉得它已经是一个“古老”且“成熟”的技术栈,网上教程遍地都是,随便找个代码跑起来似乎并不难。但当你真正想把它用起来,无论是做一个毕业设计、一个内部工具,还是想…

2026/7/5 12:45:54 阅读更多 →
RT-DETR实战:从原理到部署,掌握实时目标检测新范式

RT-DETR实战:从原理到部署,掌握实时目标检测新范式

如果你正在为毕业设计、学术论文或者项目选型而纠结,面对目标检测领域两大主流技术路线——YOLO系列和DETR系列——不知道该如何选择,那么这篇文章就是为你准备的。这不仅仅是“YOLO vs DETR”的简单对比,更是一个关于技术范式、工程实践和未…

2026/7/5 12:45:54 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻