Skip to content

QIAN数据:正负开方术 vs Newton-Raphson——逐位试商与导数迭代,两种求解风控参数的数学哲学

2026年07月01日

先验直觉: 你以为逻辑回归的参数求解是现代统计学的产物?1247年秦九韶在《数书九章》里发明了正负开方术——逐位试商确定多项式方程的解,每次只定一位数字,然后试下一位。四百年后,Newton-Raphson用导数迭代三步走完秦九韶九步的路。但当你把两个算法并排放,会发现它们解的方程组和风控建模师每天做的事,数学结构一模一样。快有快的优势,慢有慢的道理——古代人选的"笨办法"在某些场景下反而更稳健。

关键词: 正负开方术,秦九韶,Newton-Raphson,逐位试商,逻辑回归,数值求解


01 正负开方术:秦九韶的逐位试商法

正负开方术是秦九韶在《数书九章》(1247年)中系统阐述的多项式方程数值求解方法。它的核心思想极其朴素:既然方程的解是一个实数,那就一位一位地把它试出来——先定整数位,再定十分位,再定百分位,逐次推进。

正负开方术与天元术的关系

需要先澄清一个容易混淆的史实:

天元术(李冶,1248)正负开方术(秦九韶,1247)
角色建模框架求解算法
核心立天元一→列方程→消元逐位试商逼近真根
类比相当于定义变量+列目标函数相当于优化算法求解参数

简单说:天元术负责"把问题变成方程",正负开方术负责"解这个方程"。天元术用Horner格式排列系数,正负开方术用逐次试商求解。两者合在一起,构成了完整的"建模→求解"闭环。

正负开方术的核心步骤

以最简单的一元二次方程为例:

f(x)=x25x+6=0

已知根 x=2,但我们要模拟秦九韶如何"试"出这个根:

  1. 试整数位:试 x=1f(1)=2(正),x=2f(2)=0(零)→ 整数根 x=2,求解完成。

当然,更一般的情况根不是整数。以 2(方程 x22=0)为例:

  1. 试整数位f(1)=1(负),f(2)=2(正)→ 根在1和2之间,整数位取1
  2. 试十分位f(1.4)=0.04(负),f(1.5)=0.25(正)→ 十分位取4
  3. 试百分位f(1.41)=0.0119(负),f(1.42)=0.0164(正)→ 百分位取1
  4. 继续:逐位试下去 → 1.41421356

每往下一小格,就多一位精确数字。秦九韶把这套规则系统地写进了《数书九章》,并给出了"实常为负、方常为正、廉常为负、隅常为正"的符号判定法则。

这里有一个非常关键的细节:正负开方术不用导数,不依赖函数图像,只需要在每位数上做一次多项式求值(用Horner规则)。这意味着你只需要会做加减乘除,就能解任意高次方程。这正是它作为"通用算法"的伟大之处。

02 正负开方术 vs Newton-Raphson:三组方程的对决

Newton-Raphson方法是现代数值分析中最经典的方程求根算法:

xn+1=xnf(xn)f(xn)

它利用了函数的局部线性近似,每步从当前点出发,沿着导数方向"跳"到更接近根的位置。

把这两个算法放在三组方程上对比:

方程正负开方术Newton-Raphson对比
x25x+6=0(整数根 x=22步精确4步收敛整数根正中正负开方术下怀
x22=028步到 1.414213504步1.41421356步数差2倍
x32x5=09步到 2.094551403步2.09455148步数差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解读: 三条横轴是迭代步数,纵轴是|f(x)|残差(对数尺度)。蓝色是Newton-Raphson的二次收敛(斜率越来越陡),红色是正负开方术的逐位收敛(每步稳定下降一个量级)。Newton-Raphson显然更快——但代价是需要导数信息。

03 正负开方术的逐位试商过程可视化

正负开方术最独特的地方在于它的"逐位数字推进"。以 2 为例,每一步确定一位数字:

左图展示了残差 |x22| 的逐位下降过程。可以清晰地看到每确定一位数字,残差就跳跃式下降一个量级——从 100101102109。这是线性收敛的特征。

右图展示了每一位数字被确定时增加的增量:+1(个位),+0.4(十分位),+0.01(百分位)……每一轮试商的"步长"正好是当前数位的位权。

有意思的是,正负开方术的收敛速度完全由十进制位数决定——每增加一位小数,残差大约下降为原来的1/10。要精确到小数点后 d 位,需要大约 d 个试商轮次。而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规则,O(n)求值+求导(O(n),常数略大)
需不需要导数❌ 不需要✅ 需要 f(x)
稳定区间只要根区间有正负变化就保证收敛初始值需足够接近真根
对整数根一步到位(试到即停)需要迭代到误差消失
工程复杂度极低(只会加减乘除就行)略高(需要导数或差分)
适用于所有多项式方程所有可微函数(不限于多项式)
风控映射网格搜索、分箱试切、策略调优逻辑回归、神经网络参数求解

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数据」

Last updated:

关注公众号:Qian数据