牛刀杀鸡:用pytorch实现牛顿迭代

搞这个博客本来是打算写点机器学习文章啥的。但是没办法撒,市面上机器学习的文章实在太多了。 要写点有价值的东西又实在得下一番时间啊,然后没事干就开始水,然后这博客就彻底被我变成水桶了。

既然都已经这样了,那就继续水吧,啊哈哈哈哈。

这年头,谁隔三岔五不需要解个方程什么的呢。解方程,除非需要精确值,像我这种懒人,肯定首选二分法啊。方便简洁可靠,是吧,哈哈哈。但你说人吧,总有无聊的时候是吧,例如我现在。。。

撸牛顿迭代大部分时候其实就是为了求值,当然也有时候是为了观察牛顿迭代的收敛。每次撸牛顿迭代唯一烦的地方就是求导。这个时候祭出pytorch的auto grad简直是爽歪歪啊。

牛顿迭代公式:

代码:

import torch

def newtons_method(fn, init):
    x = torch.tensor(init * 1.0, requires_grad=True)    # 把初始值转为一个tensor,并指定追踪梯度
    for i in range(100):
        y = fn(x)
        y.backward()                                    # 反向传播
        if (y / x.grad / x).abs().item() < 0.0000001:   # 终止条件,看要多少精度了
            break
        x.data.sub_(y / x.grad)                         # 在python中x.grad保存的是dy/dx,也就是f'(x)
        x.grad.zero_()                                  # 清空梯度,避免干扰后续计算
    return x.item()

print(newtons_method(lambda x: x*x - 2, 1))             # 算个跟号2玩玩。。。
1.4142135381698608

又水一篇,”完美”!!!

本文遵守 CC-BY-NC-4.0 许可协议。

Creative Commons License

欢迎转载,转载需注明出处,且禁止用于商业目的。

上篇如何设计一个平衡树结构
下篇lowerBound和upperBound