0%

使用公式求解根号2

使用公式求解根号2

梯度下降求解$\sqrt{2}$.不能调用math库的sqrt函数。

解析

初拿到这个题目,第一印象是使用牛顿迭代法求解,和面试官确认之后不是他想要的方案。他想要的方案是通过设计一个loss函数,通过最小户loss函数求解.

得到这个提示,我第一时间想到的是mean squred error 损失函数:

$$ l=(y-\sqrt{2})^2 $$

损失函数的导数:

$$ \frac{\partial l}{ \partial y}=2(y-2) $$

这个函数依然需要调用库函数求. 在面试过程中,我把这个题目想的复杂了,始终没想到如何设计损失函数。最后,在面试官的提示下做个简单的变换,$y=\sqrt{x}$等价变换为$y^2=x$, 恍然大悟 :

$$ l=(y^2-2)^2 $$
然后:
$$ \frac{\partial l}{\partial y}=2(y^2-2)2y=4y^3-8y $$
更新公式:
$$ y=y-\eta \cdot \frac{\partial l}{\partial y} $$

$\cdot$是学习了率。

下面是python实现:

def compute_sqrt_2():
    learning_rate = 0.01
    epsilon = 0.0001

    # Initialize the parameters
    y = 0.1
    grad = 1
    # Loop through the epochs
        # the loop will stop when the gradient is close to 0

    while abs(grad) > epsilon:         
                grad = 4*(y**3) - 8*y
        y = y - learning_rate * grad
    return y # 1.4142090068907436

牛顿法

牛顿法是一种求解函数零点的算法,也可以用来求解优化问题中的最小值。其迭代公式是:

$$ x_{new}=x_{old}-\frac{f'(x_{old})}{f(x_{old})} $$
针对求解函数可以设计成如下:
$$ f(x)=x^2-2 $$
求解该函数零点的代码如下:

def object_func(x):
    return x**2 -2

def grad(x):
    return 2*x

def compute_sqrt_2():
    epsilon = 0.0001
    x = 1.0
    while abs(object_func(x)) > epsilon:
        x = x - grad(x)/object_func(x)
    return x 

原文博主: 热衷开源的宝藏Boy
原文链接: http://www.fangzengye.com/article/11848698c6162f6f429cf1b1d468172a
版权声明: 自由转载-非商用-禁止演绎-保持署名| CC BY-NC-ND 3.0

微信扫码加入我的星球联系我

评论区