Fisher线性判别:原理、NumPy实现与Sklearn实战
简介基于Python实现Fisher线性判别的模式识别资源面向机器学习初学者与模式识别课程学生重点演示二分类问题中如何选取投影方向使得类间距离尽可能大、类内样本尽可能聚集并附完整代码与实验数据。压缩包共14个文件大小约1.02MB主要包含两个Python脚本、Iris和Sonar两组经典数据集含data/rocks/mines等辅助文件、PDF报告、Word文档及Markdown说明覆盖算法实现、数据预处理、结果分析等环节。其中Sonar数据区分岩石与水雷两类样本Iris数据则用于经典鸢尾花分类验证代码中详细标注了投影向量与分类阈值的计算过程。已有250人浏览学习。通过参考源码可复现Fisher判别流程利用自带数据验证分类效果结合文档理解分类面确定原理并可根据实际任务替换数据、调整参数适合作为模式识别课程设计或期末大作业的参考资料。1. 从“找方向”到“找分类方向”Fisher 线性判别解决什么问题做过特征工程的人多半都有这种经历手上有 10 个特征PCA 压缩到 2 维后可视化很漂亮可拿去做分类准确率反而掉了。原因不是 PCA 算法错了而是它根本不看标签——它最大化的只是“方差大”方差大不代表类别能分开。模式识别里的 Fisher 线性判别FLD走的是另一条路它监督式地把样本投影到一个方向上让两类在投影后“类间距离尽量大、类内聚集尽量紧”既可以直接用于分类也可以当作有监督降维的预处理。下面我会先用 Python 的 NumPy 把 Fisher 完整算一遍再到 scikit-learn 验证把原理、参数、避坑一条线讲完。适合正在做模式识别课程实验、或者想把分类特征“压缩但不丢判别信息”的工程师。2. Fisher 线性判别的数学原理为什么“类间大、类内小”就是最优投影2.1 把高维样本压到一维再看分类Fisher 线性判别最早是为了解决二分类问题提出的把 d 维样本 x 通过线性投影 y w^T x 变成一维标量然后在 y 上找阈值做分类。为什么不是直接在原始空间里画分隔超平面高维空间里样本分布复杂而投影到一维后所有信息被压缩到一个方向上只要这个方向选得好分类就变成“在一根数轴上找分界点”简单、计算量小也直观。选方向的标准就是 Fisher 在 1936 年提出的判据两类投影后的均值之差尽量大类内方差尽量小。写成数学式就是最大化J(w) (w^T (m1-m2)(m1-m2)^T w) / (w^T (S_w1S_w2) w)这里的 m1、m2 是两类样本的均值向量S_w1、S_w2 是两类各自的“类内散度矩阵”对每一类样本减去均值后的外积求和和协方差矩阵只差一个常数分母。分子刻画“两类中心拉开的程度”分母刻画“每个类里样本分散的程度”。Fisher 的直觉被后人总结成一句话类间散度要大、类内散度要小两者比值最大时投影后的数据最好分。这个式子本质上是一个广义瑞利商。如果你学过 PCA会看到两者形式很像但 PCA 的分子是整体样本方差没有任何标签信息Fisher 的分子和分母都依赖类别划分所以它是“有监督的”。这也是为什么在实际项目里PCA 压缩后分类效果未必变好而 Fisher 压缩后的特征往往能保持甚至提升分类边界清晰度——它从一开始就在找“能区分类别”的方向。2.2 两类情况的闭式解w S_w^{-1}(m1 - m2)对 J(w) 求导并令导数为零可以得到一个非常干净的结果最优投影方向 w 满足S_w w m1 - m2也就是 w S_w^{-1}(m1 - m2)其中 S_w S_w1 S_w2 是总的类内散度矩阵。推导过程不复杂把 J(w) 写成瑞利商形式后最优解就是广义特征值问题的最大特征向量对两类情况S_b (m1-m2)(m1-m2)^T 的秩是 1这个特征向量恰好就是 S_w^{-1}(m1-m2)连特征值都不用解。所以严格说Fisher 判别并不需要像神经网络那样迭代训练。你要做的事情就是三步算各类均值、累加组内散度矩阵、解一个线性方程组。这也是这个算法在几十年前计算资源极度匮乏时就能被用起来的原因。对于工程师来说这同时意味着一个很现实的提醒Fisher 判别能落地的前提是 S_w 可逆。一旦特征数超过样本数或者两个特征高度线性相关S_w 就变成奇异矩阵后面求逆那一步会直接报错这个坑我放在第 5 章单独讲。2.3 多分类推广为什么最多只能降到 C-1 维二分类 Fisher 判别很好理解多分类时怎么办LDALinear Discriminant Analysis就是 Fisher 判别的多类推广。对于 C 个类别Fisher 不再找一条直线而是找一组投影方向让所有类投影后“整体分离度”最大最终得到的是一个 d 行、C-1 列的投影矩阵 W。为什么最多只有 C-1 个方向因为类间散度矩阵 S_b 在多类情况下是由 C 个类的均值和全局均值构造的它的秩最大等于 C-1。线性代数的结论是秩有多少非零特征向量最多就有多少。所以你在用 sklearn 的 LinearDiscriminantAnalysis 做降维时n_components 的上限是 C-1。三分类最多降到 2 维五分类最多降到 4 维。这个上限不是算法偷懒它反映了 Fisher 判别的本质它只关心“类中心之间”的差异类中心的自由度就是 C-1。如果你想保留类内部的细节结构比如在高维点云里区分同一类中的子簇Fisher 就不合适那应该考虑无监督的 PCA 或者非线性降维。模型没有好坏只有用对没用对。3. 从零实现 Fisher 线性判别用 NumPy 算投影方向的完整代码3.1 造一批二维数据先看到分布再谈判别实验先从造数据开始。我们生成两类高斯分布样本每类 80 个二维特征均值选在 [2, 3] 和 [6, 5]协方差矩阵带有正相关0.8这样两类会有重叠Fisher 不会得到 100% 准确率但能看出投影的作用。数据生成用 np.random.default_rng 固定随机种子保证可复现画散点图时把类别颜色区分开。import numpy as np import matplotlib.pyplot as plt rng np.random.default_rng(42) m1 np.array([2.0, 3.0]) m2 np.array([6.0, 5.0]) cov np.array([[1.2, 0.8], [0.8, 1.1]]) X1 rng.multivariate_normal(m1, cov, size80) # 类别1 X2 rng.multivariate_normal(m2, cov, size80) # 类别2 y1 np.zeros(80, dtypeint) # 类别标签 0 y2 np.ones(80, dtypeint) # 类别标签 1 plt.figure(figsize(6, 5)) plt.scatter(X1[:, 0], X1[:, 1], csteelblue, labelclass 1, alpha0.7) plt.scatter(X2[:, 0], X2[:, 1], ctomato, labelclass 2, alpha0.7) plt.xticks(np.arange(0, 10, 2)) plt.yticks(np.arange(0, 10, 2)) plt.xlabel(feature 1) plt.ylabel(feature 2) plt.legend() plt.title(Two gaussian classes with overlap) plt.show()这里用 rng.multivariate_normal 而不是老式的 np.random.multivariate_normal是为了不污染全局随机状态方便你换种子复现。散点图的刻度我用 np.arange 手动设置避免 matplotlib 自动刻度在样本重叠区域显示得太密这是这类可视化经验里很常见的一个小点——横坐标刻度密集的时候先想到 xticks 而不是改画布大小。3.2 计算类内散度矩阵与投影方向 w数据处理的核心代码在这段。先把每个类别的样本中心化样本减去本类均值然后累加每个类的散度矩阵 S_w1、S_w2用矩阵乘法 X.T X 实现外积求和类间散度 S_b 用两个均值向量之差的外积 np.outer 构造最后解线性方程组 np.linalg.solve(S_w, d) 得到 w。代码里我特意用 solve 而不是 inv 求逆后再点乘原因后面说。def fisher_w(X1, X2): # 类均值向量 m1 np.mean(X1, axis0) m2 np.mean(X2, axis0) # 类内散度矩阵中心化样本的外积之和即每个类的散布矩阵 X1_centered X1 - m1 X2_centered X2 - m2 Sw1 X1_centered.T X1_centered Sw2 X2_centered.T X2_centered Sw Sw1 Sw2 # 类间散度矩阵两类情况下秩为1 d m1 - m2 Sb np.outer(d, d) # 最优投影方向w Sw^{-1} (m1 - m2) w np.linalg.solve(Sw, d) # 按需归一化长度只影响投影值的尺度不影响方向 w w / np.linalg.norm(w) m1_proj m1 w m2_proj m2 w return w, m1_proj, m2_proj w, m1_proj, m2_proj fisher_w(X1, X2) print(w:, w) # 投影方向 print(投影类均值:, m1_proj, m2_proj)S_w 是 2x2 的矩阵np.linalg.solve 直接解 Sw w d数值上比先算 inv(Sw) 再乘 d 更稳定。你会发现代码里没有显式构造 S_b 参与求解——两类时 S_b 信息完全包含在 d 里所以简化掉了但这个变量保留在代码中能提醒你它与公式的对应关系。输出的 w 我做了向量归一化归一化只改变投影值的尺度不改变方向也不影响后续分类阈值的位置阈值是相对值。投影方向画出来是二维平面上的一条线。把 w 的两个分量当作方向向量从原点画到 (w[0], w[1])再画一条经过两个类中心的直线就能看出数据在哪个方向分离程度最大。很多教程在这一步就停下来只给了一个方向向量——但这对工程师来说不够我们还要用它完成分类。3.3 投影、定阈值、算准确率一个完整分类器有了 w分类流程就变成纯一维操作每个样本 x 投影成标量 y x w两类投影分布各自的均值记为 m1_proj、m2_proj简单的分类阈值取两个投影均值的中点 (m1_proj m2_proj) / 2。预测时 y 大于阈值判给类 2否则判给类 1。X_all np.vstack([X1, X2]) y_all np.concatenate([y1, y2]) proj X_all w # 所有样本投影到 w 方向 thr (m1_proj m2_proj) / 2 # 阈值取两个投影类均值的中点 pred (proj thr).astype(int) # 大于阈值判为类2否则为类1 acc np.mean(pred y_all) print(Fisher 判别准确率:, acc) # 用两个原始特征直接按最近类中心分类做个基准对比 dist1 np.linalg.norm(X_all - m1, axis1) dist2 np.linalg.norm(X_all - m2, axis1) pred_raw (dist2 dist1).astype(int) acc_raw np.mean(pred_raw y_all) print(原始特征最近中心分类准确率:, acc_raw)这里的分类等价于在原空间里找一个垂直于 w 的超平面作为决策边界决策边界过两个类投影均值的中点。Fisher 的意义在于它把二维甚至更高维的分类问题化简为一维阈值问题在这个人工数据上准确率通常会稳定在 85%-90% 区间如果生成的两类均值离得更远准确率接近 100%但你能清楚看到投影后的判别边界在哪里。有个细节值得注意acc 的计算直接用了全部样本没有区分训练集和测试集。这种“在训练数据上评估自己”的做法在 Fisher 这种无超参数模型上还算能看但真实项目中我强烈建议至少做一次留一法交叉验证——第 6 章会给完整代码。因为 Fisher 的 w 会被少数极端样本明显拉动单次划分评估很容易给你的论文或实验报告一个过度乐观的数。4. 用 scikit-learn 复现 Fisher 判别LDA 分类与降维两种用法4.1 LinearDiscriminantAnalysis 就是 Fisher 判别的工程实现手写版本帮你建立了完整的计算图均值 → 类内散度 → 求解 w → 投影 → 阈值。scikit-learn 的 sklearn.discriminant_analysis.LinearDiscriminantAnalysis 就是这套思路的多类、工程化版本。它的默认 solver 是 svd不做矩阵求逆而用奇异值分解来求解广义特征问题因此即使 S_w 秩亏默认参数下通常也不会像手写版那样直接报 LinAlgError对小样本高维数据友好得多。这也意味着如果你只是想快速得到一个 Fisher 判别分类器不必重复造轮子但如果你要写课程报告或者调试一个“为什么 LDA 结果和 PPT 上不一样”的问题手写版能帮你把中间量一个个打出来。工程上我推荐两条腿走路手写版验证理论sklearn 版跑数据和上线。# 确认环境里已安装所需的库缺哪个就 pip install 哪个 # pip install numpy scikit-learn matplotlib from sklearn.discriminant_analysis import LinearDiscriminantAnalysis lda LinearDiscriminantAnalysis(solversvd) # 默认就是 svd这里显式写出 lda.fit(X_all, y_all) print(投影方向 w两类, lda.coef_ / np.linalg.norm(lda.coef_)) print(准确率, lda.score(X_all, y_all))4.2 鸢尾花数据集上的完整分类流程真实数据集更说明问题。鸢尾花是最常用的多类判别例子150 个样本、4 个特征、3 个类别。先用两个特征花萼长宽做可视化跑通 fit / predict / score再用全部特征看准确率提升顺便看一眼混淆矩阵判断错误主要发生在哪两类之间山鸢尾和杂色鸢尾其实线性可分但杂色和维吉尼亚花在部分特征上重叠。from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split from sklearn.metrics import confusion_matrix, accuracy_score from sklearn.discriminant_analysis import LinearDiscriminantAnalysis iris load_iris() X_all4 iris.data # 全部4个特征 X_2f iris.data[:, :2] # 前两个特征便于二维可视化 y iris.target # 统一划分stratify 保证每个类在训练/测试里的比例一致 X_train, X_test, y_train, y_test train_test_split( X_2f, y, test_size0.3, stratifyy, random_state1) lda2 LinearDiscriminantAnalysis() lda2.fit(X_train, y_train) pred2 lda2.predict(X_test) print(两特征准确率:, accuracy_score(y_test, pred2)) print(confusion_matrix(y_test, pred2)) X_train4, X_test4, _, _ train_test_split( X_all4, y, test_size0.3, stratifyy, random_state1) lda4 LinearDiscriminantAnalysis() lda4.fit(X_train4, y_train) pred4 lda4.predict(X_test4) print(四特征准确率:, accuracy_score(y_test, pred4)) print(confusion_matrix(y_test, pred4))这段代码能直接看到两个信息一是 LDA 输出的是类别而不是降维坐标默认情况下 fit 之后 predict 给出类别二是 sklearn 在多类情况下会自动找齐 C-1 个方向你不用手动管。coef_是每个特征的权重在二分类时它的方向就对应手写版的 w。参数说明值得单独列一下solversvd 不需要求逆是稳健默认项solverlsqr 或 eigen 可以配合 shrinkage 使用用于高维小样本的收缩正则shrinkageauto 会自动估计收缩强度在特征数接近样本数时很有用priors 默认为 None按训练集类频率推断如果你的上线场景类别比例和训练集差异很大要手动传 priors。注意 shrinkage 只有 lsqr 和 eigen 两个 solver 支持svd 不支持。4.3 把 LDA 当作有监督降维n_components 的用法分类只是 LDA 的一半用途。另一个常见需求是有监督降维把原始 4 维特征压缩到 2 维然后喂给其他分类器比如 kNN或者直接画散点图做探索性分析。三分类对应 C-12n_components 设为 2正好降到二维可画。lda_embed LinearDiscriminantAnalysis(n_components2) X_lda lda_embed.fit_transform(X_all4, y) # 返回降维后的坐标 plt.figure(figsize(6, 5)) for label, color, marker in zip([0, 1, 2], [steelblue, tomato, seagreen], [o, s, ^]): mask y label plt.scatter(X_lda[mask, 0], X_lda[mask, 1], ccolor, markermarker, labeliris.target_names[label], alpha0.8) plt.xlabel(LD1) # 第1线性判别方向 plt.ylabel(LD2) # 第2线性判别方向 plt.legend() plt.tight_layout() plt.show()降维后的散点图你会发现三个类明显分开山鸢尾聚成一小团杂色和维吉尼亚在两个方向上拉开。这就是 Fisher 判别的价值体现它把原始特征里与分类无关的冗余方向扔掉只保留最能区分类别的 2 个方向。对比 PCA 的降维图LDA 的图上类别边界更清晰因为它计算时就用了类别标签。如果你要在生产代码里把数据路径和参数做成命令行可配置我一般会在入口加 argparse把数据路径、solver、n_components 都串起来这样换数据集时不用改脚本也方便同事复用你的实验配置。5. Fisher 判别实战避坑五个最容易翻车的地方先说总体感受Fisher 判别公式简单代码量少但在真实数据上翻车的点几乎都集中在“矩阵求逆、数据预处理、类别不均衡”这三类问题上。下面五条是我自己踩过、也看别人踩过的典型坑按现象到解决一条条过。5.1 Sw 奇异求逆报错的最典型场景现象手写版本里 np.linalg.solve(Sw, d) 抛 LinAlgError: Singular matrix或者 sklearn 模型在加 shrinkage 之前准确率诡异得低。原因Fisher 判别需要求 S_w 的逆而 S_w 是 d×d 的矩阵。当特征维度 d 大于样本数或者两个特征近似线性相关比如图像像素邻近点几乎完全一样时S_w 不满秩。也就是说方程 S_w w d 有无穷多解或没有解。解决按优先级试试这三招先加样本或者做特征筛选把高度相关的特征去掉手写版把 np.linalg.solve 换成 np.linalg.pinv 求伪逆能得到一个最小范数解分类效果通常仍然可用工程上更推荐直接用 sklearn 的 LinearDiscriminantAnalysis(solversvd)它绕开了求逆天然免疫这个问题。如果坚持用 eigen 求解就把 shrinkage 打开。5.2 特征量纲不一致让判别方向“偏科”现象准确率不差但你画出 w 后发现某个特征分量极大其他特征几乎被忽略换一批测试数据后准确率抖动很厉害。原因Fisher 的散度矩阵是基于欧氏距离构造的特征量纲天然占优的那个会主导类间差异。比如一个特征取值范围 0-100另一个只有 0-1前者对散度矩阵的贡献是后者的上万倍投影方向基本就被它带跑了。解决训练前用 StandardScaler 把每个特征标准化到零均值、单位方差再算 Fisher。这是手写版和 sklearn 版都要养成的前提动作。注意用 fit 在训练集上算均值和方差再用同一组参数 transform 验证集防止数据泄露。提示如果你做的是图像像素这类天然同量纲数据标准化不是必需的但对混合量纲特征不标准化翻车概率极高。5.3 多分类只降到一维白白丢信息现象三分类数据用 sklearn 的 LinearDiscriminantAnalysis() 默认分类和 PCA 降到 1 维再分类比准确率低有人为了画一维分布图把 n_components 设成 1结果三类重叠严重。原因多分类时 Fisher 的最大有效投影方向数是 C-1。三分类最多两维强行压到一维等于扔掉了一半以上的类间信息相当于用一条线去分三个团自然分不开。解决明确你是在做“分类”还是“降维”。做分类时不要设 n_components让 LDA 在 C-1 维判别空间里决策做降维可视化时按 C-1 设上界三分类设 2五分类设 4。如果只是想看一维分布建议先降到 2 维再观察而不是直接设 1。5.4 两类样本不均衡时中点阈值会偏向多数类现象训练数据类 1 有 2000 条、类 2 有 100 条Fisher 分类器在训练集上准确率 92%但上线后新样本全都判成类 1。原因手写版里的阈值取的是两个投影均值的中点 (m1_proj m2_proj)/2这个公式隐含假设两类先验概率相等。样本不均衡时类 2 的均值估计被少量样本拉得不准中点也离多数类更近边界明显偏向少数类一侧于是多数类被大面积误判。解决用 sklearn 版时显式传 priors比如 [0.5, 0.5] 告诉模型“业务上两类同等重要”或者先过采样/欠采样把训练集调均衡再训练。手写版也可以自行把阈值从均值中点改成两个投影分布的似然分界点在等协方差高斯假设下等价于把先验比的对数加到阈值上但这套推导对新手不友好不如直接换 sklearn。5.5 投影分布图横坐标太密集判别边界看不清楚现象把投影值画直方图或散点图时横坐标刻度挤成一堆小数类内点叠成一坨阈值位置和重叠区域完全看不出来。原因Fisher 算出的投影值通常落在原始特征的量纲区间内如果原始特征单位很大比如像素值 0-255 或经纬度投影标度也很大matplotlib 自动刻度会生成大量刻度标签再加上两类重叠区的点本来就密集看不出分布形态。解决可视化前把投影值缩放到 [0, 1] 区间min-max或者干脆画直方图而不是散点图用 bins40 观察两峰的位置刻度密集时用 plt.xticks(range(0, plot_max, step)) 或 plt.locator_params(axisx, nbins12) 控制数量。这一步不改变模型本身但能帮你在写报告时一眼发现“两类其实重叠得很厉害”这个真相。6. 让 Fisher 判别更可靠的验证技巧留一法 收缩正则我在实际项目中把小样本、高维度的特征喂给 Fisher 时最常用的验证方式不是单次 train_test_split而是留一法LOOCV样本量小于 50 时尤其如此。理由很简单Fisher 的 w 完全来自均值和散度矩阵对单个极端样本非常敏感如果单次划分碰巧把几个边界样本都放进测试集score 会忽高忽低看起来像“参数在飘”。from sklearn.model_selection import LeaveOneOut, cross_val_score loo LeaveOneOut() scores cross_val_score(lda4, X_all4, y, cvloo) print(留一法平均准确率:, scores.mean())对小数据集留一法的结果比 7:3 划分稳定得多代价是计算量线性增加但 LDA 本身很快150 个样本完全无所谓。另一个实用习惯是发现 S_w 可能病态时打开收缩正则LinearDiscriminantAnalysis(solvereigen, shrinkageauto)。它会给散度矩阵对角线加一个很小的值让求逆稳定代价是引入轻微偏差。一般来说样本量低于特征维度 3 倍时我默认开启。我自己的一个血泪经验是手写版和 sklearn 版的准确率对不上时先查标准化有没有对训练集和验证集分别做再查 priors 是否一致——这两处最容易翻车。查完这两个百分之八十的偏差都能解释。你可以把留一法这段代码存成模板以后每个实验都先跑一遍看稳定性再决定要不要深入调参。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Dify插件PluginInvokeError报错排查:容器DNS配置全攻略

Dify插件PluginInvokeError报错排查:容器DNS配置全攻略

最近在社群里被问得最多的一个报错,就是 Dify 里的 PluginInvokeError 。不同用户贴出来的日志五花八门:有人做知识库流水线时插件调用失败,有人在工作流里挂了一个 HTTP 请求节点直接红字,有人在把 Dify 接到本地大模型&#x…

2026/10/9 12:43:10 阅读更多 →
模拟电路学习指南:从理论到实战的电路手感培养

模拟电路学习指南:从理论到实战的电路手感培养

1. 模拟电路到底在学什么:从“玄学”到“手感”的认知重构很多人第一次翻开模拟电路教材,翻不了几页就开始犯困。运放、反馈、频率响应、噪声、失真,每个字都认识,连在一起就不知道在说什么。更让人崩溃的是,明明照着公…

2026/10/9 12:43:10 阅读更多 →
高精度减法详解:从竖式原理到C++实现与避坑指南

高精度减法详解:从竖式原理到C++实现与避坑指南

高精度减法这个东西,说难真不难,本质就是把你小学学过的竖式减法搬到程序里;但说简单也绝不简单,我见过不少写高精度加法挺顺的人,一到减法就各种翻车。翻车的原因很集中:加法只要盯住进位,减法…

2026/10/9 12:43:10 阅读更多 →

最新新闻

Access 2007 免费版 zip 靠不靠谱?一张图看懂 accdb 与正规获取法

Access 2007 免费版 zip 靠不靠谱?一张图看懂 accdb 与正规获取法

简介:Access 2007 免费精简版安装包,是面向办公软件场景的 Access 2007 SP3 独立精简版本,适合需要快速部署数据库环境、不愿安装完整 Office 套件的办公人员、数据库初学者或教学场景使用。该包基于官方 SP3 深度定制,重点解决了…

2026/10/9 13:20:05 阅读更多 →
AWS EventBridge实战:事件驱动架构设计、路由规则与踩坑指南

AWS EventBridge实战:事件驱动架构设计、路由规则与踩坑指南

事件驱动这个话题,近几年被聊得很多,但真正落到工程实施上,能讲清楚“为什么用它、怎么配、踩了哪些坑”的实战内容其实不多。我最近帮一个团队重构了一套订单通知链路,顺手深浅不一地把 AWS EventBridge 摸了个遍,从最…

2026/10/9 13:20:05 阅读更多 →
python中的闭包函数

python中的闭包函数

前言 上一类把「闭包是什么」讲清楚的问题,落到代码里往往会卡在一个具体写法上:内层函数里想改外层的变量,为什么一赋值就报 UnboundLocalError?两个闭包为什么互相串了状态?什么时候该写闭包、什么时候该写类&#x…

2026/10/9 13:20:05 阅读更多 →
Python中的面向接口编程示例详解

Python中的面向接口编程示例详解

前言 "面向接口编程"(programming to an interface)的核心主张是:调用方应该依赖"能做什么",而不是依赖"是谁"。这样换实现时不必改调用方,测试时也容易塞进一个假的实现。 在 Java 里&…

2026/10/9 13:20:05 阅读更多 →
GEV-26B-Decide 部署指南:3步为 Gemma-4 的 tied lm_head 打 LoRA 补丁,快速起决策服务

GEV-26B-Decide 部署指南:3步为 Gemma-4 的 tied lm_head 打 LoRA 补丁,快速起决策服务

GEV-26B-Decide 部署指南:3步为 Gemma-4 的 tied lm_head 打 LoRA 补丁,快速起决策服务 【免费下载链接】GEV-26B-Decide 项目地址: https://ai.gitcode.com/hf_mirrors/autotrust/GEV-26B-Decide GEV-26B-Decide 是基于 google/gemma-4-26B-A4B…

2026/10/9 13:20:05 阅读更多 →
微信小程序物业管理系统毕业设计:技术选型、数据库设计与论文写作全指南

微信小程序物业管理系统毕业设计:技术选型、数据库设计与论文写作全指南

简介:这份资源是面向高校计算机相关专业学生的微信小程序物业管理系统毕业设计完整项目,适合作为课程设计、毕业论文或小程序开发练手参考。项目围绕真实小区场景展开,涵盖用户认证与登录、二维码模拟开门、车牌预约审核、物业服务提交、物业…

2026/10/9 13:19:03 阅读更多 →

日新闻

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API实战:LocalDate、Date与ZonedDateTime的转换与避坑指南

Java时间API这个话题,隔三差五就会在群里被翻出来讨论一次。上周还有个同事线上处理一个订单超时问题,排查到最后发现是ZonedDateTime序列化后时区丢了,用户在下单当天晚上看到的时间整整差了8个小时。这类问题几乎每个做Java开发的人都遇到过…

2026/10/9 0:00:49 阅读更多 →
EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

EasyTier实践:从NAT穿透到子网代理的异地组网部署与排错

前几个月我手头有好几台机器需要互相访问:办公室台式机、家里 NAS、还有一台云主机。如果只是偶尔传个文件倒还好,问题是工作场景经常要在几处环境之间来回切换,每次都先登录跳板机再层层代理,实在折腾。我先后试过端口映射、自建…

2026/10/9 0:00:49 阅读更多 →
AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent工程实战:从七要素到七个决策点的系统设计指南

AI Agent 这个词在过去一年里被反复提及,但真正动手搭过一套能跑起来的 Agent 系统的人都知道,从"知道它是什么"到"让它稳定干活"之间隔着一整套工程决策。我前后参与过几个 Agent 项目的落地,从最初用现成框架拼装&…

2026/10/9 0:01:50 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:40 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →