【量化】从零到LGBM | 6 | LGBM代码实现和调用

LightGBM 代码实现 在上一篇文章中,我们从数学和工程设计的角度拆解了 LightGBM 的四大核心机制。本文主要来记录其代码实现。 本文分两部分回答这个问题。第一部分,我们用几百行伪代码,从零手搓一个"麻雀虽小、五脏俱全"的迷你LightGBM第二部分,我们带着手搓时拧过的每一颗"螺丝",去学习如何正确使用 LightGBM 的 Python 官方接口。 第一部分:手搓 LightGBM 0. 总体设计:先看清整张图纸 在写代码之前,我们先明确这个迷你版本要包含哪些功能,以及它们的组装顺序: EFB 特征捆绑:在数据进入模型之前,把互斥的稀疏特征合并降维(预处理阶段); 离散分箱:把连续特征值映射为整数桶编号(直方图的地基); GOSS 采样:每轮迭代时,保留大梯度样本、采样小梯度样本; 直方图构建与作差:以 $O(N)$ 的代价统计梯度信息,分裂时用减法省一半计算; Leaf-wise 生长:用优先队列实现"谁增益大谁分裂"的精英制,并用正则化参数套上缰绳; 提升主循环:每轮对"当前预测值"求一二阶导数,建一棵树,累加进模型。 这个顺序与 LightGBM 真实源码的数据流向是一致的。下面逐块实现。 1. 目标函数:先明确 $g$ 和 $h$ 从哪来 上一篇我们反复强调:一阶导 $g_i$ 和二阶导 $h_i$ 是对当前模型预测值求导的结果,下标 $i$ 表示第 $i$ 个样本。在代码里,这就是一个极其简单的函数。以平方损失 $L=\frac{1}{2}(\hat{y}_i-y_i)^2$ 为例: 1 2 3 4 5 6 7 import numpy as np def grad_hess(pred, y): """对预测值求导:g 是一阶导(误差推力),h 是二阶导(曲率)""" g = pred - y # dL/d(pred) h = np.ones_like(y) # d2L/d(pred)2,平方损失下恒为 1 return g, h 注意这个接口的通用性:如果换成分类任务,只需要把损失换成对数似然,$g$ 和 $h$ 换成对应的导数即可,后面所有的树构建代码一行都不用改。这正是 GBDT 框架"泛函梯度下降"的优雅之处——树只关心梯度,不关心具体任务。 ...

August 20, 2026 · 8 min · 1506 words · c.w.

【量化】从零到LGBM | 5 | LGBM

LightGBM 解析:更快的工程学 在机器学习的集成学习领域,如果说 GBDT 奠定了“泛函梯度下降”的理论基石,XGBoost 通过二阶泰勒展开和正则化将其推向了精度的巅峰,那么 LightGBM(Light Gradient Boosting Machine) 则是将这一框架在工程实现与计算效率上做到极致的集大成者。 随着量化金融、推荐系统等领域的数据量呈指数级爆炸(如全市场高频 Tick 数据、千万级用户行为日志),传统的树模型在内存和算力上开始捉襟见肘。2017 年,微软亚洲研究院的团队推出了 LightGBM。它的名字直白地揭示了其使命:Light(轻量、极速) + GBM(梯度提升树)。 本文将剥离繁杂的表象,深入 LightGBM 的数学内核与底层数据结构,探讨它是如何通过四大核心“黑科技”,在不损失(甚至提升)模型精度的前提下,实现对传统算法的降维打击。 一、 痛点剖析:XGBoost 在海量数据下的工程瓶颈 要理解 LightGBM 的伟大,首先必须看清 XGBoost 在面对海量数据时暴露出的两块致命短板。尽管 XGBoost 引入了加权分位数素描(Weighted Quantile Sketch)等近似算法,但其底层架构依然存在两个难以逾越的鸿沟: 1. 预排序(Pre-sorted)的内存与时间枷锁 在 XGBoost 中,为了寻找最佳的特征切分点,算法必须在每一棵树开始构建之前,将所有样本按照每一个特征的值进行全局精确排序,并将其存储在特定的内存块(Block)中。 时间代价:对千万级样本的单个特征进行排序,时间复杂度为 $O(N \log N)$。如果有 100 个特征,排序本身的开销就极其庞大。 空间代价:存储排序后的数据结构需要消耗巨大的内存。当数据量达到几十 GB 时,极易导致内存溢出(OOM),且频繁的内存读写会严重破坏 CPU 的缓存命中率。 2. Level-wise(按层生长)的计算浪费 XGBoost 默认采用 Level-wise 的树生长策略,即“大锅饭”模式:第一层分裂 2 个节点,第二层分裂 4 个节点,以此类推。 这种策略的死板之处在于:哪怕当前层中某些节点分裂后带来的增益(Gain)微乎其微,算法也会为了“凑齐这一层”而强行分裂。这不仅产生了大量无效的废节点,浪费了宝贵的计算资源,还增加了模型过拟合的风险。 针对这两个痛点,LightGBM 从数据结构、生长策略、采样机制和特征工程四个维度进行了彻底的重构。 二、 核心突破一:Histogram 直方图算法 —— 彻底抛弃全局排序 这是 LightGBM 提速和节省内存的最核心武器。许多初学者在接触直方图算法时,容易产生概念上的混淆,我们需要从数学本质和算法复杂度上进行深度拆解。 ...

August 20, 2026 · 2 min · 328 words · c.w.

【量化】从零到LGBM | 4 | XGBoost

XGBoost :把 GBDT 做到更优 在机器学习的集成学习领域,GBDT(Gradient Boosting Decision Tree)以其"泛函梯度下降"的本质,奠定了基于树的模型的理论基石。然而,将理论推向工程巅峰、在 2015 年前后横扫几乎所有结构化数据竞赛和量化私募 Baseline 的,是陈天奇博士提出的 XGBoost(eXtreme Gradient Boosting)。 XGBoost 并非推翻 GBDT,而是在其框架下,对**目标函数(如何计算梯度)和树的生长方式(如何寻找分裂点)**进行了极其精妙的改造。本文将深入 XGBoost 的数学内核与工程细节,带你理解这个"一代霸主"的真正精髓。 一、从一阶到二阶:泰勒展开带来的精度飞跃 1.1 GBDT 的局限:只看"坡度" 在前序课程中,我们了解到 GBDT 利用**一阶梯度(负梯度)**来决定树的生长方向。这就好比下山时,你只用脚试探哪边是下坡(一阶导数),然后朝那个方向走。这种方式虽然有效,但过于粗糙,你无法判断前方是平缓的斜坡还是陡峭的悬崖。 1.2 XGBoost 的改进:同时看"坡度"和"曲率" XGBoost 引入了二阶泰勒展开,这正是牛顿法的思想。假设当前模型为 $F_{t-1}(x)$,我们要添加一棵新树 $f_t(x)$,新的目标函数可以近似展开为: $$Obj \approx \sum_{i=1}^N \left[ L(y_i, F_{t-1}(x_i)) + g_i f_t(x_i) + \frac{1}{2} h_i f_t^2(x_i) \right]$$ 其中: $g_i$:损失函数对当前预测值的一阶导数(梯度),代表"误差有多大" $h_i$:损失函数对当前预测值的二阶导数(海塞矩阵),代表"误差变化的剧烈程度(曲率)" 直观理解:如果将优化过程比作开车下山,一阶导数相当于方向盘和油门,告诉你该往哪边走;二阶导数则相当于路况感知系统,告诉你前方是平缓斜坡(可以踩大油门)还是急转弯(必须减速)。有了二阶信息,模型能够更精准地预测下一步该迈多大,从而更快、更稳地到达最优解。 1.3 为什么止步于二阶? 一个自然的疑问是:既然二阶比一阶好,为什么不继续引入三阶导数甚至更高阶? 答案在于边际收益递减与工程成本的权衡。从数学角度看,二阶导数(牛顿法)已经能够找到非常精确的局部最优解,更高阶导数对找到"谷底"的帮助微乎其微。从工程角度看,计算、存储和聚合三阶导数的开销会呈指数级上升。 更重要的是,在金融等信噪比极低的场景中,用三阶导数去追求那 0.01% 的精度提升,大概率只是将市场噪音拟合得更准,实盘表现反而更差。二阶导数恰好在"拟合能力"和"抗噪鲁棒性"之间达到了完美的平衡。 二、正则化项:给模型戴上"紧箍咒" 2.1 目标函数的完整形式 这是 XGBoost 被称为"X-treme(极致)“的最重要原因。传统 GBDT 的目标函数只有损失项,而 XGBoost 的目标函数为: $$Obj = \sum_{i=1}^N L(y_i, \hat{y}i) + \sum{t=1}^T \Omega(f_t)$$ ...

August 20, 2026 · 2 min · 373 words · c.w.

【量化】从零到LGBM | 3 | GBDT

GBDT:梯度提升树与函数空间中的梯度下降 在集成学习的两大流派中,Boosting 的核心思想是串行训练多个弱学习器,让每一棵新树都集中纠正前面所有树留下的误差。上一篇文章我们提到,这个过程可以直观地理解为“拟合残差”。但这背后有一个容易被忽视的数学前提:只有当损失函数选用均方误差(MSE)时,“拟合残差”才严格成立。在更一般的场景下,我们需要一个更普适的框架,这就是梯度提升(Gradient Boosting)的出发点。 本文将系统梳理 GBDT(Gradient Boosting Decision Tree,梯度提升决策树)的数学原理、训练流程、在量化交易中的优势与局限,并深入解释一个初学者经常困惑的问题:模型更新时所说的“加到旧模型上”到底是什么意思。 1. 从残差到负梯度 Boosting 的原始思路可以概括为:每棵新树的目标不是直接预测原始标签,而是预测当前模型输出与真实值之间的差距,也就是残差。用公式表示: $$r_i = y_i - F_{m-1}(x_i)$$ 其中 $F_{m-1}$ 表示前 $m-1$ 棵树组合后的模型,$y_i$ 是样本 $i$ 的真实值。 这个思路在平方损失(MSE)下是完全自洽的。如果损失函数定义为: $$L = \frac{1}{2}\sum_i (y_i - F(x_i))^2$$ 那么对当前模型 $F$ 求导,可以得到: $$\frac{\partial L}{\partial F(x_i)} = F(x_i) - y_i$$ 负梯度方向就是: $$-\frac{\partial L}{\partial F(x_i)} = y_i - F(x_i)$$ 恰好等于残差。因此,在 MSE 下,“拟合残差”等价于“沿着负梯度方向更新模型”。 问题在于,量化交易中经常使用其他损失函数。例如分类任务使用对数损失(logistic loss),或者为了稳健性使用绝对误差损失(MAE)。在这些情况下,残差不再直接等于负梯度,原来的 Boosting 框架就需要扩展。 Jerome Friedman 在 2001 年提出的 GBDT 解决了这个问题:每一棵新树不再固定拟合残差,而是拟合当前损失函数关于模型输出的负梯度。负梯度指向损失函数下降最快的方向,因此无论损失函数是什么,只要可导,GBDT 都能工作。 一个直观的类比是“蒙眼下山”。假设你站在一座山的某个位置,目标是走到山谷的最低点。你看不到全局地形,只能通过脚底感知坡度。梯度指向坡面上升最快的方向,而负梯度指向下降最快的方向。每走一步,你都沿着当前最陡的下坡方向前进。GBDT 的每一棵新树,就相当于在当前模型所在的位置计算负梯度方向,然后沿着这个方向“迈出一步”。 2. GBDT 的训练流程 GBDT 的训练过程可以拆解为五个步骤,这也是 XGBoost 和 LightGBM 的共同基础。 ...

August 20, 2026 · 2 min · 287 words · c.w.

【量化】从零到LGBM | 2 | 集成学习

集成学习 在上一篇文章中,我们讨论了决策树的基本原理和它在量化场景下的致命缺陷:过拟合。单棵决策树很容易把市场噪声当成规律,导致回测优秀、实盘失效。一个自然的改进思路是:既然单棵树不可靠,那么能否训练多棵树,让它们共同做决定? 这就是集成学习(Ensemble Learning)的核心思想。 1. 什么是集成学习? 集成学习的思路并不复杂:训练多个基础模型,再按某种方式将它们的预测结果组合起来,从而获得比单个模型更稳定、更准确的输出。这些基础模型通常被称为弱学习器(weak learner),而组合后的整体模型被称为强学习器(strong learner)。 在决策树场景下,集成学习通常表现为训练多棵决策树,然后通过投票或平均的方式得到最终预测。根据训练方式和组合逻辑的不同,集成学习主要分为两大流派:Bagging 和 Boosting。 2. Bagging:并行的民主投票 代表模型:随机森林(Random Forest) Bagging 是 Bootstrap Aggregating 的缩写,它的工作机制可以概括为三步: Bootstrap 采样:从原始训练集中有放回地随机抽取多个样本子集。每个子集的大小通常与原始训练集相同,但由于是有放回抽样,某些样本可能出现多次,某些样本可能一次都不出现。这样,每个子集都略有不同。 独立训练:对每个 Bootstrap 子集分别训练一棵决策树。每棵树在训练时还可以进一步引入随机性:在每个分裂节点,不比较全部特征,而是随机选取一个特征子集来寻找最佳切分。这就是随机森林中“随机”的另一个来源。 投票或平均:所有树并行训练完成后,对于分类问题,最终预测由多数投票决定;对于回归问题,最终预测取所有树输出的平均值。 Bagging 的核心目标是降低方差(variance)。单棵决策树的预测结果容易受到训练数据中微小变化的影响,方差较大。通过训练多棵在不同数据子集和特征子集上得到的树,并将它们的预测结果平均,可以显著降低最终模型对特定数据扰动的敏感程度。形象地说,多个专家独立判断后取平均,个别专家的极端错误会被其他专家中和,这就是群体平均效应在这里的体现。 3. Boosting:串行的错题本式迭代 代表模型:AdaBoost、GBDT、XGBoost、LightGBM Boosting 的思路与 Bagging 完全不同。它不追求并行训练、独立投票,而是让树按顺序逐个生成,每一棵新树都重点纠正前面所有树留下的错误。 具体来说: 串行训练:模型按顺序逐个添加。第一棵树先对原始目标进行拟合。 聚焦残差:第二棵树的目标不再是直接预测原始目标,而是预测“第一棵树预测值与真实值之间的差距”,也就是残差(residual)。第三棵树继续拟合前两棵树之后仍未解释的部分。这个过程可以不断重复。 加权累加:最终预测结果是所有树的输出按一定权重累加。每棵树不再是平等投票,而是根据其对整体损失下降的贡献程度来决定权重。 Boosting 的核心目标是降低偏差(bias)。它允许模型不断修正错误,逐步逼近训练数据中那些复杂、微弱的规律。如果 Bagging 是“多个学生独立作答,最后取平均分”,那么 Boosting 更像是“一个学生反复看错题本,不断弥补自己的短板”。 从数学上看,Boosting 可以理解为一个加法模型: $$F_m(x) = F_{m-1}(x) + \eta \cdot h_m(x)$$ 其中 $F_{m-1}$ 是前 $m-1$ 棵树累加后的模型,$h_m$ 是第 $m$ 棵树,$\eta$ 是学习率。每一棵新树 $h_m$ 的拟合目标不再是原始标签 $y$,而是当前模型的负梯度方向,在平方损失下就是残差 $y - F_{m-1}(x)$。这也是“梯度提升”(Gradient Boosting)名称的由来。 ...

August 20, 2026 · 1 min · 126 words · c.w.

【量化】从零到LGBM | 1 | 决策树

决策树与“查字典”模型。 0. 量化为什么要算法 这里的底层逻辑和LLM是相同的,都是将现实世界的某些东西视作一个多元函数,然后采用某种方式去逼近这个函数。 在量化中,我们可以把过往的市场行情甚至新闻量化为函数的自变量,我们希望函数的输出是未来的行情预测。如果预测的好,那我们就赚钱。但是很明显,数学上不存在一个显式表达式来描述这个函数,我们就需要用一定的计算机算法去拟合这些函数,最简单的拟合就是我们高中学过的最小二乘法,LLM采用Transformer作为核心去拟合人们“说话”这个函数过程,而量化里面较为经典的就是使用LGBM去拟合“市场”这个函数过程。这就是量化算法的本质。 1. 什么是决策树 想象一下,你现在是基金经理,要在 A 股 5000 多只股票中,挑出一只明天大概率上涨的股票。你的大脑里可能会浮现出一套层层递进的筛选规则: 第一层判断:它是沪深300成分股吗? 否 -> 淘汰(风险太大) 是 -> 进入下一层 第二层判断:过去 5 天成交量是否明显放大? 否 -> 淘汰(没有资金关注) 是 -> 进入下一层 第三层判断:当前市盈率(PE)是否小于 30? 是 -> 买入信号 否 -> 观望信号 你刚刚在脑海里构建了一棵决策树(Decision Tree)。 它也很像“查字典”。查字典时,我们不是从第一页逐页翻,而是先看首字母,再逐步缩小范围,最后定位到一个词条。决策树也是这样:通过一系列“是/否”或“大于/小于”的判断,把复杂的数据一步步划分到不同的“叶子节点”上,最终给出一个预测结果,比如“涨”“跌”或某个收益率。 在计算机科学中,可以把它理解为一个多层嵌套的 if-else 规则系统。更严格地说,决策树是一个树形结构:每个内部节点对某个特征做一次判断,每条分支对应一个判断结果,最终的叶子节点给出预测值。 2. 机器是怎么“学会”这棵树的?(核心原理) 人类可以凭经验“拍脑袋”定规则,那机器是怎么自动长出一棵树的呢? 机器学习的核心思想是:优先寻找那个“最能区分好坏”的问题,优先提问。 在数学上,这通常通过最大化**信息增益(Information Gain)或最小化基尼不纯度(Gini Impurity)**来实现。两者的直觉一致:都希望切分后的数据子集变得更“纯”,也就是同一组里的结果尽可能一致。 举个例子: 假设机器手里有 1000 只股票的历史数据,其中 500 只第二天上涨,500 只下跌。整体上是一团乱麻,纯度很低。 机器会尝试用各种因子去切分这 1000 只股票。 如果用“股票代码尾数是奇数还是偶数”来切分,发现切完后两边仍然涨跌各半。这说明这个特征几乎没有区分能力,信息增益接近 0。 如果用“过去 20 天是否连续上涨”来切分,发现:在“连续上涨”的股票中,80% 第二天出现回调;“未连续上涨”的股票中,涨跌大致各半。 因此,对机器来说,“过去 20 天是否连续上涨”这个特征能把数据切分得更“纯”:一边大概率下跌,另一边不确定。所以,算法会优先选择这个特征作为树的根节点。 实际训练时,算法会在每个节点遍历所有候选特征和可能的切分点,计算每一次切分带来的“纯度提升”,然后选择提升最大的那一个。这个过程不断重复,直到满足停止条件,比如达到最大深度、节点里的样本数量太少,或者继续切分不再带来明显提升。 如果不加任何限制,决策树会一直分裂下去。这正是下一节要说的核心问题。 ...

August 20, 2026 · 1 min · 106 words · c.w.

大一下学期微积分笔记

上半学期:多元函数微分学 1. 二重极限与累次极限 二重极限:$\displaystyle \lim_{(x,y)\to(x_0,y_0)} f(x,y)$ 累次极限:$\displaystyle \lim_{x\to x_0}\lim_{y\to y_0} f(x,y)$ 2. 无穷小的阶 设$\rho = | \boldsymbol{x} - \boldsymbol{x_0} |$为两点间的距离(二元函数中即$\sqrt{(x-x_0)^2+(y-y_0)^2}$),若$f(\boldsymbol{x}) = O(\rho^k)$,则称$f$是$k$阶无穷小。 3. 多元函数微分与偏导数 对$n$元函数$u = f(x_1,x_2,\dots,x_n)$,全微分公式: $$du = \frac{\partial u}{\partial x_1} dx_1 + \frac{\partial u}{\partial x_2} dx_2 + \dots + \frac{\partial u}{\partial x_n} dx_n$$ 4. 方向导数 设$\vec{l} = (\cos\alpha_1, \cos\alpha_2, \dots, \cos\alpha_n)$为单位方向向量($\alpha_i$是$\vec{l}$与第$i$个坐标轴的夹角),则$f(x_1,\dots,x_n)$在$\boldsymbol{x_0}$处沿$\vec{l}$的方向导数为: $$\frac{\partial f}{\partial \vec{l}}(\boldsymbol{x_0}) = \frac{\partial f}{\partial x_1}(\boldsymbol{x_0})\cos\alpha_1 + \frac{\partial f}{\partial x_2}(\boldsymbol{x_0})\cos\alpha_2 + \dots + \frac{\partial f}{\partial x_n}(\boldsymbol{x_0})\cos\alpha_n$$ ...

June 3, 2026 · 8 min · 1628 words · c.w.

大一下学期微积分笔记

1. 各种分解 1.1 LU 与 LDU 分解 定义:某矩阵 $A=LU$,则 $U$ 是对 $A$ 作行简化后得到的上三角矩阵。 例子: $$ A = \begin{pmatrix} 1 & 2 & 3 \\ 4 & 4 & 6 \\ 2 & 2 & 6 \end{pmatrix} \sim \begin{pmatrix} 1 & 2 & 3 \\ 0 & -4 & -6 \\ 0 & -2 & 0 \end{pmatrix} \sim \begin{pmatrix} 1 & 2 & 3 \\ 0 & -4 & -6 \\ 0 & 0 & 3 \end{pmatrix} \leftarrow \text{这个是 } U $$ ...

June 3, 2026 · 6 min · 1106 words · c.w.

离散数学(1) | 8 | 谓词逻辑的推理

本文及其系列文章用于离散数学(1)科目的期末考试复习 基本的推理公式 $(\forall x)P(x)\lor(\forall x)Q(x)\Rightarrow(\forall x)(P(x)\lor Q(x))$⭐️ $(\exists x)(P(x)\land Q(x))\Rightarrow (\exists x)P(x)\land (\exists x)Q(x)$⭐️ $(\forall x)(P(x)\rightarrow Q(x))\Rightarrow (\forall x)P(x)\rightarrow (\forall x)Q(x)$ $(\forall x)(P(x)\rightarrow Q(x))\Rightarrow (\exists x)P(x)\rightarrow (\exists x)Q(x)$ $(\forall x)(P(x)\leftrightarrow Q(x))\Rightarrow (\forall x)P(x)\leftrightarrow (\forall x)Q(x)$ $(\forall x)(P(x)\leftrightarrow Q(x))\Rightarrow (\exists x)P(x)\leftrightarrow (\exists x)Q(x)$ $(\forall x)(P(x)\rightarrow Q(x))\land (\forall x)(Q(x)\rightarrow R(x))\Rightarrow (\forall x)(P(x)\rightarrow R(x))$⭐ $(\forall x)(P(x)\rightarrow Q(x))\land P(a)\Rightarrow Q(a)$⭐ $(\forall x)(\forall y)P(x,y)\Rightarrow (\exists x)(\forall y)P(x,y)$ $(\exists x)(\forall y)P(x,y)\Rightarrow (\forall y)(\exists x)P(x,y)$ 这些推理公式的逆一般是不成立的,所以记住和理解顺序很重要。 推理演算 注意,本节按照老师上课讲义的符号和规则来描述,不同的规定和不同的讲述方式可能导致本节内容在一定程度上不是普适性的。本节适配内容为T大软件学院离散数学(1)的课程及考试内容。 ...

January 6, 2026 · 2 min · 282 words · c.w.

离散数学(1) | 7 | 谓词逻辑的等值和范式

本文及其系列文章用于离散数学(1)科目的期末考试复习 由命题公式得来的等值公式 这部分我们把谓词逻辑看做命题逻辑中的命题变元,命题逻辑中正确的公式也是谓词逻辑中正确的公式。 例如,命题逻辑中,$\neg\neg p=p$是重言式,那么对于谓词逻辑$\neg\neg (\forall x)P(x)=(\forall x)P(x)$是一个有效式。 这部分是谓词逻辑的一个重要基石,因为谓词逻辑中很多细节性的、不涉及量词变换的等值公式都是由此得来的。 否定型等值式⭐⭐ 这部分是最最重要的基础。 $\neg(\forall x)P(x)=(\exists x)\neg P(x)$ $\neg(\exists x)P(x)=(\forall x)\neg P(x)$ 可以这样直观的理解和解释: 并不是对于所有的$x,P(x)$都成立,那么肯定存在一个$x,P(x)$不成立,即$\neg P(x)$成立。 不存在一个$x$让$P(x)$成立,那么对于所有的$x,P(x)$都不成立,即$\neg P(x)$成立。 谓词公式和命题变项的分配律 有关$\land$和$\lor$的分配律⭐ $(\forall x)(P(x)\land q)=(\forall x)P(x)\land q$ $(\forall x)(P(x)\lor q)=(\forall x)P(x)\lor q$ $(\exists x)(P(x)\land q)=(\exists x)P(x)\land q$ $(\exists x)(P(x)\lor q)=(\exists x)P(x)\lor q$ 这部分是比较好理解的,也是非常基础性的定律。 有关$\rightarrow$的分配律 $(\forall x)(P(x)\rightarrow q)=(\exists x)P(x)\rightarrow q$ $(\exists x)(P(x)\rightarrow q)=(\forall x)P(x)\rightarrow q$ $(\forall x)(q\rightarrow P(x))=q \rightarrow (\forall x)P(x)$ $(\exists x)(q\rightarrow P(x))=q \rightarrow (\exists x)P(x)$ ...

January 6, 2026 · 2 min · 251 words · c.w.