QIAN数据:正负开方术 vs Newton-Raphson——逐位试商与导数迭代,两种求解风控参数的数学哲学
2026年07月01日
先验直觉: 你以为逻辑回归的参数求解是现代统计学的产物?1247年秦九韶在《数书九章》里发明了正负开方术——逐位试商确定多项式方程的解,每次只定一位数字,然后试下一位。四百年后,Newton-Raphson用导数迭代三步走完秦九韶九步的路。但当你把两个算法并排放,会发现它们解的方程组和风控建模师每天做的事,数学结构一模一样。快有快的优势,慢有慢的道理——古代人选的"笨办法"在某些场景下反而更稳健。
关键词: 正负开方术,秦九韶,Newton-Raphson,逐位试商,逻辑回归,数值求解
01 正负开方术:秦九韶的逐位试商法
正负开方术是秦九韶在《数书九章》(1247年)中系统阐述的多项式方程数值求解方法。它的核心思想极其朴素:既然方程的解是一个实数,那就一位一位地把它试出来——先定整数位,再定十分位,再定百分位,逐次推进。
正负开方术与天元术的关系
需要先澄清一个容易混淆的史实:
| 天元术(李冶,1248) | 正负开方术(秦九韶,1247) | |
|---|---|---|
| 角色 | 建模框架 | 求解算法 |
| 核心 | 立天元一→列方程→消元 | 逐位试商逼近真根 |
| 类比 | 相当于定义变量+列目标函数 | 相当于优化算法求解参数 |
简单说:天元术负责"把问题变成方程",正负开方术负责"解这个方程"。天元术用Horner格式排列系数,正负开方术用逐次试商求解。两者合在一起,构成了完整的"建模→求解"闭环。
正负开方术的核心步骤
以最简单的一元二次方程为例:
已知根
- 试整数位:试
(正), (零)→ 整数根 ,求解完成。
当然,更一般的情况根不是整数。以
- 试整数位:
(负), (正)→ 根在1和2之间,整数位取1 - 试十分位:
(负), (正)→ 十分位取4 - 试百分位:
(负), (正)→ 百分位取1 - 继续:逐位试下去 →
每往下一小格,就多一位精确数字。秦九韶把这套规则系统地写进了《数书九章》,并给出了"实常为负、方常为正、廉常为负、隅常为正"的符号判定法则。
这里有一个非常关键的细节:正负开方术不用导数,不依赖函数图像,只需要在每位数上做一次多项式求值(用Horner规则)。这意味着你只需要会做加减乘除,就能解任意高次方程。这正是它作为"通用算法"的伟大之处。
02 正负开方术 vs Newton-Raphson:三组方程的对决
Newton-Raphson方法是现代数值分析中最经典的方程求根算法:
它利用了函数的局部线性近似,每步从当前点出发,沿着导数方向"跳"到更接近根的位置。
把这两个算法放在三组方程上对比:
| 方程 | 正负开方术 | Newton-Raphson | 对比 |
|---|---|---|---|
| 2步精确 | 4步收敛 | 整数根正中正负开方术下怀 | |
| 8步到 | 4步到 | 步数差2倍 | |
| 9步到 | 3步到 | 步数差3倍 |
python
import numpy as np
np.random.seed(42)
# === 正负开方术:逐位试商 ===
def horners_eval(coeffs, x):
"""Horner规则:多项式求值,O(n)"""
result = coeffs[0]
for c in coeffs[1:]:
result = result * x + c
return result
def zhengfu_kaifang(coeffs, precision=6):
"""正负开方术:逐位试商确定多项式根"""
# 第1步:找整数位(正负变化区间)
steps = []
for trial in range(0, 21):
f_val = horners_eval(coeffs, trial)
steps.append((trial, abs(f_val)))
if f_val >= 0: # 找到第一个非负值
current = trial - 1 if trial > 0 else 0
break
# 逐位确定小数位
for pos in range(1, precision + 3):
step_size = 10 ** (-pos)
found_digit = 0
f_curr = horners_eval(coeffs, current)
for digit in range(1, 10):
trial = current + digit * step_size
f_trial = horners_eval(coeffs, trial)
# 余数变号→找到该位数字
if f_curr * f_trial < 0:
found_digit = digit - 1
break
if digit == 9:
found_digit = 9
f_curr = f_trial
current = round(current + found_digit * step_size, pos + 1)
steps.append((current, abs(horners_eval(coeffs, current))))
return steps
# === Newton-Raphson ===
def newton_raphson(coeffs, x0):
for _ in range(20):
f_val = horners_eval(coeffs, x0)
# 用差分近似导数
df = (horners_eval(coeffs, x0 + 1e-8) - f_val) / 1e-8
if abs(f_val) < 1e-10:
break
x0 = x0 - f_val / df
return x0
# 测试三个方程
eqs = [
([1, -5, 6], 'x² - 5x + 6 = 0', [1.5], '根 x=2'),
([1, 0, -2], 'x² - 2 = 0 (√2)', [2.0], '根 √2≈1.4142'),
([1, 0, 0, -2, -5], 'x³ - 2x - 5 = 0', [2.0], '根 ≈2.0946'),
]
for c, label, x0s, root_label in eqs:
zk = zhengfu_kaifang(c)
nr = newton_raphson(c, x0s[0])
print(f'{label}: ZK={zk[-1][0]:.6f} ({len(zk)}步) NR={nr:.6f}')python
np.random.seed(42)
# 预期输出:
# x² - 5x + 6 = 0: ZK=2.000000 (2步) NR=2.000000
# x² - 2 = 0 (√2): ZK=1.414214 (8步) NR=1.414214
# x³ - 2x - 5 = 0: ZK=2.094551 (9步) NR=2.094551图1解读: 三条横轴是迭代步数,纵轴是
03 正负开方术的逐位试商过程可视化
正负开方术最独特的地方在于它的"逐位数字推进"。以
左图展示了残差
右图展示了每一位数字被确定时增加的增量:+1(个位),+0.4(十分位),+0.01(百分位)……每一轮试商的"步长"正好是当前数位的位权。
有意思的是,正负开方术的收敛速度完全由十进制位数决定——每增加一位小数,残差大约下降为原来的1/10。要精确到小数点后
位,需要大约 个试商轮次。而Newton-Raphson的收敛速度是二次的——有效数字每步翻倍。
| 精度 | 正负开方术 | Newton-Raphson |
|---|---|---|
| 1位小数 | 2步 | 1步 |
| 3位小数 | 4步 | 2步 |
| 6位小数 | 8步 | 3步 |
| 12位小数 | 14步 | 4步 |
这就是为什么对于大多数实际应用(只需要4-6位有效数字),Newton-Raphson只需要3-4步,而正负开方术需要8-9步。但反过来,如果只需要2-3位有效数字,两者的差距并不大。
04 天元术+正负开方术 vs 现代风控建模四步对
把天元术(建模框架)和正负开方术(求解算法)合在一起,就构成了完整的"建模→求解"方法论。它与现代风控建模的四步完全对应:
从对照表可以看到:天元术承担了前三步(符号化、建模、转化),正负开方术承担了第四步(求解)。现代风控建模中,前三步对应"选变量→设模型→建目标函数",第四步对应"用Newton-Raphson求参数"。
而正负开方术与Newton-Raphson的数学共性在于——它们都是"试→评→调→再试"的迭代逼近:
正负开方术:试一个数字 → 算误差 → 决定是否前进 → 试下一位
Newton-Raphson:从当前点出发 → 算f和f' → 跳到更优点 → 重复
两种方法共享的骨架:
试(Guess) → 评估(Evaluate) → 调整(Adjust) → 再试...05 正负开方术在现代风控中的启示
正负开方术虽然计算效率不如Newton-Raphson,但它有一个独特的优势:不需要导数。
这在风控场景中的直接映射是——当你的数据不支持计算"梯度"时,你仍然可以用"试商"的方式找到最优参数。
举三个例子:
① 评分卡分箱的单调性约束: 当用决策树分箱时,WOE需要保持单调性。这不是一个可微问题,不能用梯度下降。这时候"试商"的思路——每个分箱边界试几种切法,选单调性最好的——就是正负开方术的现代投影。
② 策略规则的阈值搜索: 风控策略中经常需要在某个特征上设阈值(如"收入>5000")。最优阈值没有闭式解,也不容易求导,但可以用类似正负开方的方法:从大到小试不同的阈值,看哪个通过率-逾期率组合最优。
③ 模型超参数调优: 网格搜索(Grid Search)本质上就是正负开方术——在参数空间中的每个维度上"试商",只不过正负开方术聪明一些,从高位到低位逐位逼近(类似于粗搜索→细搜索的两阶段策略)。
06 正负开方术 vs Newton-Raphson:优劣总评
| 维度 | 正负开方术 | Newton-Raphson |
|---|---|---|
| 收敛速度 | 线性(每步1位小数) | 二次(有效数字每步翻倍) |
| 每步成本 | 1次多项式求值(Horner规则, | 求值+求导( |
| 需不需要导数 | ❌ 不需要 | ✅ 需要 |
| 稳定区间 | 只要根区间有正负变化就保证收敛 | 初始值需足够接近真根 |
| 对整数根 | 一步到位(试到即停) | 需要迭代到误差消失 |
| 工程复杂度 | 极低(只会加减乘除就行) | 略高(需要导数或差分) |
| 适用于 | 所有多项式方程 | 所有可微函数(不限于多项式) |
| 风控映射 | 网格搜索、分箱试切、策略调优 | 逻辑回归、神经网络参数求解 |
07 数学文化:从秦九韶到Newton-Raphson
秦九韶(1208-1268)的《数书九章》于1247年成书,其中的正负开方术比欧洲同类成果早约四百年。同一本书还包含了大衍总数术——即现代数学中的中国剩余定理。
Newton-Raphson方法的演变脉络:
- 1690年:Joseph Raphson在《Analysis Aequationum Universalis》中首次发表该算法
- Newton在更早的手稿中已经使用了类似方法(但未正式发表)
- 1740年:Thomas Simpson将算法推广到多元情形
- 此后该方法成为数值计算的基础工具之一
有趣的是,Newton-Raphson方法与秦九韶的正负开方术有一个本质区别:秦九韶逐位试商,算的是"这个数字是多少";Newton迭代计算的是"从当前位置往哪个方向走"。前者是离散的、确定性的数字搜索;后者是连续的、方向性的梯度下降。
但在更抽象的层次上,它们共享完全相同的数学结构——"试→评→调→再试"。当代逻辑回归的 sklearn.linear_model.LogisticRegression 底层调用的正是Newton-Raphson家族的L-BFGS或拟牛顿算法。而秦九韶的逐位试商,在某些非凸、非可微的约束优化问题中,反而因为不需要梯度而更为稳健。
08 关键要点
- 正负开方术不是天元术——天元术负责建模(列方程),正负开方术负责求解(试商逼近),两者合在一起才是完整的"建模→求解"方法论
- 正负开方术不依赖导数,只需要多项式求值,这意味着它可以用在任何"能试就能算"的场景中
- Newton-Raphson胜在速度(二次收敛),正负开方术胜在稳定(不需要导数,也不怕初始值远离真根)
- 收敛步数的本质差异:正负开方术每步确定一位十进制数字,Newton-Raphson每步使有效数字翻倍——所以6位精度,一个需8步,一个只需3步
- 正负开方术的风控现代价值在于"非可微优化":分箱策略、阈值搜索、网格粗调优等场景不需要梯度,正负开方术的逐位推进思路恰好适用
- 两种算法的共同本质都是"试→评→调→再试"的迭代逼近——这是数学求解的终极骨架,从1247年秦九韶到今天的逻辑回归一秒求解,从未改变
完整内容请关注公众号「QIAN数据」