梯度下降求立方根。

求解立方根

http://www.nowcoder.com/questionTerminal/caf35ae421194a1090c22fe223357dca

写一个梯度下降的解法。
给定n,求x^3=n的根x。
使用平方误差作为损失函数,损失函数l=(x^3-n)^2
l对x求导数:
图片说明
因为x小于0时,损失函数不是凸函数,所以特殊处理一下n<0的情况,统一计算n>0的情况。
根据梯度下降很容易写出AC代码。
图片说明

n=float(input())
op=-1 if n<0 else 1
n=op*n
lr=0.0001
x=0.1
for i in range(1000000):
    delta=6*(x**2)*(x**3-n)
    x=x-lr*delta
print(op*round(x,1))
全部评论
退出条件可以改成loss小于0.001,
点赞 回复 分享
发布于 2021-08-26 22:11
因为函数x^3单调递增,容易证明损失函数(x^3-n)^2有全局唯一最小值,该函数值对应x即为n的立方根。这就使得梯度下降收敛到立方根无需考虑x的初始值位置,因为不会陷入局部最优,同时也就使得1楼的退出条件可行,不至于陷入死循环。
点赞 回复 分享
发布于 2021-09-01 17:44
我尝试了一下一楼大神说的,加了退出条件,但是程序会保错,出现内存溢出异常,请问下有没有后续呀,这个方法得到的结果是近似值,如果没有这个退出条件结果就没办法更精确了
点赞 回复 分享
发布于 2021-10-03 20:05
很秀,但时间复杂度上天。
点赞 回复 分享
发布于 2022-07-09 20:25

相关推荐

9 1 评论
分享
牛客网
牛客企业服务