Fisher Score特征选择实战:用Python手写算法解决分类问题(附完整代码)
Fisher Score特征选择实战从零构建Python算法优化你的分类模型如果你在机器学习项目中遇到过“维度灾难”或者发现模型训练时间过长、效果不佳那么这篇文章就是为你准备的。特征选择是机器学习流程中至关重要的一环它不仅能提升模型性能还能增强模型的可解释性。今天我要带你深入探讨一种经典而强大的过滤式特征选择方法——Fisher Score并手把手教你从零开始用Python实现它。我在实际项目中多次使用Fisher Score尤其是在处理高维生物信息学数据和金融风控数据时它帮我快速筛选出了那些真正对分类有区分度的特征。与那些复杂的包装式或嵌入式方法相比Fisher Score的计算效率高原理直观特别适合作为特征选择的“第一道筛选器”。更重要的是理解它的底层实现能让你对特征选择有更本质的认识而不是仅仅停留在调用sklearn库的层面。1. 特征选择的“过滤”之道为什么Fisher Score值得你关注在深入代码之前我们得先搞清楚特征选择到底在解决什么问题。想象一下你手头有1000个特征来描述一个客户但其中可能只有50个真正影响他是否会购买产品。其余950个特征要么是噪声要么与其他特征高度相关提供的是冗余信息。直接把这1000个特征扔进模型不仅计算成本高还容易导致过拟合——模型记住了训练数据中的噪声而在新数据上表现糟糕。特征选择方法大致分为三类过滤式、包裹式和嵌入式。过滤式像筛子一样在训练模型之前根据特征本身的统计特性如与目标变量的相关性、方差等进行筛选。它独立于任何机器学习算法速度快可扩展性好。包裹式将特征选择过程包裹在某个特定的学习算法中通过评估不同特征子集在该算法上的性能如准确率来选择最优子集。效果通常更好但计算成本极高。嵌入式特征选择过程与模型训练过程融为一体最常见的就是L1正则化Lasso它在训练过程中自动将一些不重要的特征系数压缩为零。Fisher Score属于典型的过滤式方法。它的核心思想非常符合直觉一个好的特征应该能让同一类别的样本尽可能“聚拢”同时让不同类别的样本尽可能“分开”。用统计学的语言来说就是最大化类间方差最小化类内方差。注意Fisher Score是一种单变量过滤方法。它独立地评估每个特征与目标变量的关系忽略了特征之间的相互作用。这意味着它可能会选择一些单独看很强但组合起来冗余的特征也可能会漏掉一些单独看弱但组合起来很强的特征。这是其效率带来的一个权衡。为了让你对各类方法有个快速对比我整理了一个简单的特性对照表方法类型代表算法优点缺点计算成本过滤式方差选择、卡方检验、Fisher Score、互信息速度快独立于模型可扩展性强忽略特征间关系可能选择冗余特征低包裹式递归特征消除、前向/后向选择针对特定模型优化通常能获得更好的性能计算开销巨大容易过拟合非常高嵌入式Lasso回归、决策树特征重要性、随机森林在模型训练中完成平衡了效率与效果与特定模型绑定结果依赖于模型选择中等Fisher Score因其计算简单、物理意义明确在文本分类、图像识别、生物信息学等领域有着广泛的应用。接下来我们就从数学原理开始揭开它的神秘面纱。2. 深入原理Fisher Score的数学内核与直观理解Fisher Score的公式是它的灵魂。我们假设有一个数据集包含n个样本每个样本有d个特征样本属于C个不同的类别。第i类有n_i个样本。对于第k个特征我们定义以下关键量m_i^(k): 第i类所有样本在第k个特征上的平均值。m^(k): 所有样本不论类别在第k个特征上的总平均值。x_j^(k): 第j个样本在第k个特征上的取值。类间方差衡量的是不同类别中心之间的离散程度我们希望它越大越好S_B^(k) Σ (i1 to C) (n_i / n) * (m_i^(k) - m^(k))^2类内方差衡量的是同一类别内部样本的离散程度我们希望它越小越好S_W^(k) (1/n) * Σ (i1 to C) Σ (x in ω_i) (x^(k) - m_i^(k))^2最终的Fisher Score就是这两者的比值J_fisher(k) S_B^(k) / S_W^(k)分数越高说明该特征的鉴别能力越强。让我们用一个极简的例子来感受一下。假设我们只有两个特征Feature 1, Feature 2和两个类别Class 0, Class 1数据点分布如下import matplotlib.pyplot as plt import numpy as np # 模拟数据 np.random.seed(42) class0_feat1 np.random.normal(2, 0.5, 30) # 类别0特征1均值2 class0_feat2 np.random.normal(2, 1.5, 30) # 类别0特征2均值2方差更大 class1_feat1 np.random.normal(8, 0.5, 30) # 类别1特征1均值8 class1_feat2 np.random.normal(5, 1.5, 30) # 类别1特征2均值5 plt.figure(figsize(12, 4)) plt.subplot(1, 2, 1) plt.scatter(class0_feat1, np.zeros_like(class0_feat1), alpha0.6, labelClass 0) plt.scatter(class1_feat1, np.zeros_like(class1_feat1), alpha0.6, labelClass 1) plt.axvline(xnp.mean(class0_feat1), colorblue, linestyle--, alpha0.5) plt.axvline(xnp.mean(class1_feat1), colororange, linestyle--, alpha0.5) plt.axvline(xnp.mean(np.concatenate([class0_feat1, class1_feat1])), colorred, linestyle-, alpha0.8) plt.title(Feature 1: Large between-class, small within-class variance) plt.xlabel(Feature 1 Value) plt.legend() plt.subplot(1, 2, 2) plt.scatter(class0_feat2, np.zeros_like(class0_feat2), alpha0.6, labelClass 0) plt.scatter(class1_feat2, np.zeros_like(class1_feat2), alpha0.6, labelClass 1) plt.axvline(xnp.mean(class0_feat2), colorblue, linestyle--, alpha0.5) plt.axvline(xnp.mean(class1_feat2), colororange, linestyle--, alpha0.5) plt.axvline(xnp.mean(np.concatenate([class0_feat2, class1_feat2])), colorred, linestyle-, alpha0.8) plt.title(Feature 2: Smaller between-class, larger within-class variance) plt.xlabel(Feature 2 Value) plt.legend() plt.tight_layout() plt.show()左图特征1两个类别的中心距离很远类间方差大且每个类别内部的数据点很集中类内方差小。计算出的Fisher Score会很高。右图特征2两个类别的中心距离相对较近类间方差小且每个类别内部的数据点比较分散类内方差大。计算出的Fisher Score会较低。显然特征1比特征2能更好地区分这两个类别。Fisher Score完美地量化了这种直观感受。3. 从零手写Python实现Fisher Score核心算法理解了原理实现起来就水到渠成了。我们不依赖任何高级库如scikit-learn中现成的函数只用NumPy和pandas的基础功能从头构建一个健壮的Fisher Score计算器。这将涵盖二分类和多分类场景。首先我们处理最简单的二分类情况。代码的核心是清晰计算类内和类间方差。import numpy as np import pandas as pd def fisher_score_binary(X, y): 计算二分类问题中每个特征的Fisher Score。 参数: X : numpy.ndarray 或 pandas.DataFrame 特征矩阵形状为 (n_samples, n_features) y : numpy.ndarray 或 pandas.Series 标签向量形状为 (n_samples,)取值应为0和1 返回: scores : numpy.ndarray 每个特征的Fisher Score形状为 (n_features,) # 转换为numpy数组以便操作 if isinstance(X, pd.DataFrame): X X.values if isinstance(y, pd.Series): y y.values n_samples, n_features X.shape # 获取两类样本的索引 class0_idx (y 0) class1_idx (y 1) n0 np.sum(class0_idx) n1 np.sum(class1_idx) # 安全检查 if n0 0 or n1 0: raise ValueError(数据中必须同时包含两类样本。) scores np.zeros(n_features) for k in range(n_features): # 提取第k个特征的所有值 feature_k X[:, k] # 计算各类均值及总体均值 m0_k np.mean(feature_k[class0_idx]) m1_k np.mean(feature_k[class1_idx]) m_k np.mean(feature_k) # 计算类间方差 S_B S_B (n0 / n_samples) * ((m0_k - m_k) ** 2) (n1 / n_samples) * ((m1_k - m_k) ** 2) # 计算类内方差 S_W # 类内方差 (类0样本与类0均值的平方差之和 类1样本与类1均值的平方差之和) / 总样本数 S_W (np.sum((feature_k[class0_idx] - m0_k) ** 2) np.sum((feature_k[class1_idx] - m1_k) ** 2)) / n_samples # 避免除零错误如果类内方差为0则赋予一个极大分数或NaN if S_W 0: scores[k] np.inf if S_B 0 else np.nan else: scores[k] S_B / S_W return scores现在让我们用经典的鸢尾花数据集来测试一下我们的二分类版本。我们先只取其中两类Setosa和Versicolor进行测试。from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载数据只取前两类 iris load_iris() X_binary iris.data[:100, :] # 只取前100个样本Setosa和Versicolor y_binary iris.target[:100] # 计算Fisher Score scores_binary fisher_score_binary(X_binary, y_binary) print(二分类 Fisher Scores:) for i, score in enumerate(scores_binary): print(f 特征 {i} ({iris.feature_names[i]}): {score:.4f})现实世界的问题往往是多分类的。将二分类推广到多分类关键在于类间方差的计算需要遍历所有类别。def fisher_score_multiclass(X, y): 计算多分类问题中每个特征的Fisher Score。 参数: X : numpy.ndarray 或 pandas.DataFrame 特征矩阵形状为 (n_samples, n_features) y : numpy.ndarray 或 pandas.Series 标签向量形状为 (n_samples,) 返回: scores : numpy.ndarray 每个特征的Fisher Score形状为 (n_features,) if isinstance(X, pd.DataFrame): X X.values if isinstance(y, pd.Series): y y.values n_samples, n_features X.shape classes np.unique(y) n_classes len(classes) if n_classes 2: raise ValueError(标签中至少需要两个不同的类别。) scores np.zeros(n_features) for k in range(n_features): feature_k X[:, k] m_k np.mean(feature_k) # 总体均值 S_B 0.0 S_W 0.0 for c in classes: class_idx (y c) n_c np.sum(class_idx) if n_c 0: continue m_c_k np.mean(feature_k[class_idx]) # 第c类的均值 # 累加类间方差贡献 S_B (n_c / n_samples) * ((m_c_k - m_k) ** 2) # 累加类内方差 S_W np.sum((feature_k[class_idx] - m_c_k) ** 2) S_W / n_samples # 计算平均类内方差 if S_W 0: scores[k] np.inf if S_B 0 else np.nan else: scores[k] S_B / S_W return scores # 使用完整的鸢尾花数据集三分类进行测试 X_multi iris.data y_multi iris.target scores_multi fisher_score_multiclass(X_multi, y_multi) print(\n多分类 Fisher Scores:) for i, score in enumerate(scores_multi): print(f 特征 {i} ({iris.feature_names[i]}): {score:.4f})为了方便使用我们最后封装一个通用的feature_ranking函数它根据分数对特征进行排序并处理可能的无穷大或NaN值。def feature_ranking(fisher_scores): 根据Fisher Score对特征进行降序排序。 参数: fisher_scores : numpy.ndarray 每个特征的Fisher Score 返回: ranked_idx : numpy.ndarray 按分数从高到低排列的特征索引 ranked_scores : numpy.ndarray 排序后的分数 # 创建一个副本以避免修改原数组 scores fisher_scores.copy() # 将NaN和Inf处理为-1使其排在最后 scores[np.isnan(scores)] -1 scores[np.isinf(scores)] -1 # 获取降序排列的索引 ranked_idx np.argsort(scores)[::-1] ranked_scores scores[ranked_idx] return ranked_idx, ranked_scores # 对多分类结果进行排序 ranked_idx, ranked_scores feature_ranking(scores_multi) print(\n特征重要性排名:) for rank, (idx, score) in enumerate(zip(ranked_idx, ranked_scores)): print(f 第{rank1}名: 特征 {idx} ({iris.feature_names[idx]})分数 {score:.4f})从鸢尾花数据集的输出中你可能会发现花瓣尺寸相关的特征如花瓣长度、花瓣宽度的Fisher Score远高于萼片尺寸相关的特征。这与生物学常识一致花瓣特征对于区分鸢尾花种类更具鉴别力。4. 实战对比手写算法 vs. scikit-learn与真实项目应用自己造轮子不是为了替代优秀的库而是为了更深刻地理解它。现在让我们将手写的Fisher Score与scikit-learn中功能相近的f_classifANOVA F值进行对比。f_classif同样基于方差分析其思想与Fisher Score一脉相承。from sklearn.feature_selection import f_classif # 使用scikit-learn的f_classif计算F值和p值 f_values, p_values f_classif(X_multi, y_multi) print(特征对比手写Fisher Score vs. scikit-learn f_classif (F-value)) print(- * 70) print(f{特征名:20} {Fisher Score:15} {F-value:15} {p-value:15}) print(- * 70) for i in range(X_multi.shape[1]): print(f{iris.feature_names[i]:20} {scores_multi[i]:15.4f} {f_values[i]:15.4f} {p_values[i]:15.4e}) # 使用我们的排序函数对F值也进行排序 ranked_idx_f, ranked_f feature_ranking(f_values) print(\n基于F值的特征排名:) for rank, (idx, f_val) in enumerate(zip(ranked_idx_f, ranked_f)): print(f 第{rank1}名: 特征 {idx} ({iris.feature_names[idx]})F值 {f_val:.4f})你会看到两种方法得出的特征重要性排序高度一致。这验证了我们手写算法的正确性。细微的差异可能源于数值计算的精度或公式的微小变体但核心结论不变。理论结合实践才有生命力。让我们看一个更贴近实际的例子使用UCI的葡萄酒数据集并构建一个完整的特征选择与建模Pipeline。from sklearn.datasets import load_wine from sklearn.preprocessing import StandardScaler from sklearn.linear_model import LogisticRegression from sklearn.model_selection import cross_val_score import matplotlib.pyplot as plt # 加载葡萄酒数据集 wine load_wine() X_wine wine.data y_wine wine.target feature_names_wine wine.feature_names print(f葡萄酒数据集: {X_wine.shape[0]}个样本, {X_wine.shape[1]}个特征) # 1. 计算Fisher Score scores_wine fisher_score_multiclass(X_wine, y_wine) ranked_idx_wine, ranked_scores_wine feature_ranking(scores_wine) # 2. 可视化特征重要性 plt.figure(figsize(10, 6)) bars plt.barh(range(len(feature_names_wine)), ranked_scores_wine, aligncenter) plt.yticks(range(len(feature_names_wine)), [feature_names_wine[i] for i in ranked_idx_wine]) plt.xlabel(Fisher Score) plt.title(葡萄酒数据集特征重要性 (Fisher Score)) # 为条形图添加数值标签 for bar, score in zip(bars, ranked_scores_wine): width bar.get_width() plt.text(width max(ranked_scores_wine)*0.01, bar.get_y() bar.get_height()/2, f{score:.2f}, haleft, vacenter) plt.tight_layout() plt.show() # 3. 构建评估Pipeline比较使用不同数量顶级特征时的模型性能 scaler StandardScaler() X_wine_scaled scaler.fit_transform(X_wine) # 标准化数据 model LogisticRegression(max_iter10000, random_state42) base_score cross_val_score(model, X_wine_scaled, y_wine, cv5, scoringaccuracy).mean() print(f\n基准模型使用全部{len(feature_names_wine)}个特征的5折交叉验证平均准确率: {base_score:.4f}) top_k_performance [] for k in range(1, len(feature_names_wine) 1): # 选择前k个最重要的特征 selected_features_idx ranked_idx_wine[:k] X_selected X_wine_scaled[:, selected_features_idx] cv_score cross_val_score(model, X_selected, y_wine, cv5, scoringaccuracy).mean() top_k_performance.append((k, cv_score, selected_features_idx)) # print(f使用前{k}个特征: 准确率 {cv_score:.4f}) # 找出最佳k值 best_k, best_score, best_features_idx max(top_k_performance, keylambda x: x[1]) print(f\n最佳特征子集: 使用前 {best_k} 个特征) print(f对应的5折交叉验证平均准确率: {best_score:.4f}) print(选中的特征:, [feature_names_wine[i] for i in best_features_idx]) # 4. 绘制性能随特征数量变化的曲线 k_vals [item[0] for item in top_k_performance] scores_vals [item[1] for item in top_k_performance] plt.figure(figsize(10, 6)) plt.plot(k_vals, scores_vals, markero, linestyle-, linewidth2, markersize8) plt.axhline(ybase_score, colorr, linestyle--, alpha0.7, labelf全特征基准 ({base_score:.4f})) plt.axvline(xbest_k, colorg, linestyle--, alpha0.7, labelf最佳k{best_k}) plt.xlabel(选择的特征数量 (k)) plt.ylabel(5折交叉验证平均准确率) plt.title(特征选择对逻辑回归模型性能的影响 (基于Fisher Score)) plt.legend() plt.grid(True, alpha0.3) plt.tight_layout() plt.show()这段代码做了几件关键事情计算并可视化了葡萄酒数据集中所有特征的Fisher Score。构建了一个评估框架从只选最重要的1个特征开始逐步增加特征数量用5折交叉验证评估逻辑回归模型的性能。找到了“最佳点”通常性能会随着特征增加而上升但到达某一点后增加冗余或噪声特征反而可能导致性能下降由于过拟合或噪声。这个曲线能直观地帮你确定要保留多少个特征。在我的多次实验中这个“最佳点”往往远小于原始特征数。这意味着你用更少的数据、更快的训练速度获得了更好或相当的模型性能——这正是特征选择的价值所在。5. 进阶思考Fisher Score的局限与混合策略没有任何方法是银弹。Fisher Score虽然强大但也有其局限性理解这些局限能帮助你在实际应用中做出更明智的决策。主要局限性单变量评估如前所述它独立评估每个特征忽略了特征之间的相关性。可能导致选择高度相关的特征子集浪费计算资源。对数据分布敏感其公式基于均值方差对异常值比较敏感。在数据存在严重偏斜或离群点时评估可能失真。仅适用于分类问题其核心是衡量特征对类别的区分度因此不适用于回归任务目标变量是连续值。那么如何扬长避短一个有效的策略是构建混合特征选择流程。我常用的一个Pipeline是过滤式快速初筛 - 嵌入式模型内选择 - 包裹式精细调优可选。第一层快速过滤。使用Fisher Score、方差阈值等方法快速剔除大量明显无关或方差极低的特征。这一步能极大减少后续步骤的计算负担。第二层嵌入式选择。使用带有L1正则化的模型如Lasso、逻辑回归penaltyl1或基于树模型的特征重要性如随机森林的feature_importances_。这一步能考虑特征间的相互作用并输出一个精简的特征集。第三层包裹式优化针对关键项目。如果项目对性能要求极高且计算资源允许可以在第二层输出的特征子集上使用递归特征消除等包裹式方法进行更精细的搜索。下面是一个结合了方差过滤、Fisher Score和随机森林特征重要性的简单示例from sklearn.feature_selection import VarianceThreshold, SelectKBest from sklearn.ensemble import RandomForestClassifier from sklearn.pipeline import Pipeline # 构建一个组合式特征选择管道 pipe Pipeline([ # 步骤1: 移除低方差特征 (过滤式) (variance_threshold, VarianceThreshold(threshold0.01)), # 移除方差小于0.01的特征 # 步骤2: 基于Fisher Score选择Top K特征 (过滤式) (fisher_select, SelectKBest(score_funcf_classif, k8)), # 假设我们想先保留8个 # 步骤3: 使用随机森林进行训练并利用其内置的特征重要性 (嵌入式) (classifier, RandomForestClassifier(n_estimators100, random_state42)) ]) # 评估这个管道 from sklearn.model_selection import cross_val_score cv_scores cross_val_score(pipe, X_wine_scaled, y_wine, cv5, scoringaccuracy) print(f组合式特征选择管道的平均交叉验证准确率: {cv_scores.mean():.4f} (/- {cv_scores.std()*2:.4f})) # 拟合管道以查看最终被选中的特征 pipe.fit(X_wine_scaled, y_wine) # 注意由于管道中有多个变换步骤获取最终特征索引需要一些步骤 vt_support pipe.named_steps[variance_threshold].get_support() # 经过方差阈值后剩余的特征在原数组中的索引 remaining_after_vt np.where(vt_support)[0] fs_support pipe.named_steps[fisher_select].get_support() # 最终被Fisher Select选中的特征在remaining_after_vt中的索引 selected_from_fs remaining_after_vt[fs_support] print(f\n经过组合选择后最终使用的特征索引: {selected_from_fs}) print(对应的特征名:, [feature_names_wine[i] for i in selected_from_fs])这种分层策略在实践中非常有效。先用过滤法做“粗选”快速去掉大部分无关特征再用嵌入法做“精选”利用模型反馈选出最具预测力的组合。对于大多数项目前两步已经足够。最后记住特征选择不是一次性任务。当你的数据分布发生变化、模型更换、或者业务目标调整时都需要重新审视特征选择的结果。把特征选择作为模型迭代周期中的一个固定环节你的机器学习项目才会更加稳健和高效。

相关新闻

逆向工程师必备:用Wireshark解码USB设备描述符的5个关键步骤

逆向工程师必备:用Wireshark解码USB设备描述符的5个关键步骤

逆向工程师必备:用Wireshark解码USB设备描述符的5个关键步骤 当你面对一个未知的USB设备,试图理解它的内部构造和通信协议时,那种感觉就像是在破解一个没有钥匙的密码锁。作为一名硬件逆向工程师或安全测试人员,我们常常需要深入到…

2026/7/3 7:52:22 阅读更多 →
手把手教你用DeepLab-v3+实现图像分割:从原理到代码实战

手把手教你用DeepLab-v3+实现图像分割:从原理到代码实战

从零构建你的图像分割利器:DeepLab-v3 实战全解析 你是否曾面对一张复杂的街景图,想要让计算机自动识别出其中的行人、车辆、道路和建筑?或者,在医疗影像分析中,渴望精准地勾勒出病灶区域的边界?这正是图像…

2026/5/17 12:38:25 阅读更多 →
5分钟搞定!用GPT-SoVITS把你的文字变成自己的声音(Windows保姆级教程)

5分钟搞定!用GPT-SoVITS把你的文字变成自己的声音(Windows保姆级教程)

从零到一:在Windows上亲手打造你的专属AI语音合成器 你是否曾想过,有一天能将自己的声音“复制”出来,让AI替你朗读文稿、播报信息,甚至为你的视频内容配音?这听起来像是科幻电影里的情节,但今天&#xff…

2026/5/17 12:38:25 阅读更多 →

最新新闻

ASM330LHH与PIC18F25K80的工业级运动跟踪系统设计

ASM330LHH与PIC18F25K80的工业级运动跟踪系统设计

1. 从传感器到系统:ASM330LHH与PIC18F25K80的硬件搭档当我在工业自动化项目中第一次接触到ASM330LHH这颗6DoF惯性测量单元(IMU)时,立刻被它的性能参数所震撼。作为意法半导体MEMS传感器家族的重要成员,它在一个3x2.5x0.83mm的封装内集成了三轴…

2026/7/5 0:35:54 阅读更多 →
Python3与Java Hutool实现SM2国密算法跨语言加解密互通方案

Python3与Java Hutool实现SM2国密算法跨语言加解密互通方案

1. 项目概述与核心价值最近在做一个需要跨语言数据交换的项目,后端是Java,用到了Hutool这个“瑞士军刀”库来处理SM2国密算法的加解密,而另一个数据处理服务是用Python3写的。这就引出了一个很实际的问题:Java这边用Hutool加密的数…

2026/7/5 0:33:53 阅读更多 →
电商App签名逆向实战:从x-sign/x-miniwua看移动端安全防线

电商App签名逆向实战:从x-sign/x-miniwua看移动端安全防线

1. 项目概述:为什么我们要研究x-sign/x-miniwua? 如果你做过电商数据相关的爬虫或者自动化工具,那么“签名”这个词对你来说一定不陌生。它就像一道门禁,横亘在你和服务器数据之间。而某宝的 x-sign 和 x-miniwua &#xff0c…

2026/7/5 0:27:49 阅读更多 →
AI绘画提示词编写与优化全指南

AI绘画提示词编写与优化全指南

1. AI绘画提示词(Prompt)编写核心逻辑解析AI绘画的核心在于将自然语言描述转化为视觉元素,这个过程本质上是一种跨模态的信息转换。理解这个转换机制是编写优质Prompt的基础。现代AI绘画模型如Stable Diffusion、MidJourney都建立在扩散模型(Diffusion Model)架构上…

2026/7/5 0:25:48 阅读更多 →
如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版)

如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版)

如何在Windows家庭版上启用专业级远程桌面:RDP Wrapper Library终极指南(2024版) 【免费下载链接】rdpwrap RDP Wrapper Library 项目地址: https://gitcode.com/gh_mirrors/rd/rdpwrap 你是否曾经因为Windows家庭版无法使用远程桌面功…

2026/7/5 0:21:46 阅读更多 →
2025年Nmap渗透测试实战指南:从基础扫描到高级规避技术

2025年Nmap渗透测试实战指南:从基础扫描到高级规避技术

1. 项目概述:为什么Nmap依然是渗透测试的基石如果你在网络安全这个行当里待过一阵子,或者哪怕只是刚入门,大概率都听过Nmap这个名字。它就像木匠手里的锤子,厨师手里的刀,是那种你明知道它“古老”,但每次开…

2026/7/5 0:17:44 阅读更多 →

日新闻

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 阅读更多 →

月新闻