牛刀杀鸡:用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
又水一篇,”完美”!!!