第一问-追本溯源求解平方根?
Posted flying_1314
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第一问-追本溯源求解平方根?相关的知识,希望对你有一定的参考价值。
一、迭代法求解平方根
#迭代法求解平方根
def sqrt(num,lr=0.001,epoches=1000):
x = 1
for _ in range(epoches):
x -= lr * (2 * (x**2 -num)*2*x)
if _ % 200 == 0:
print("epoch:\\tx:".format(_,x))
sqrt(4)
epoch:0 x:1.012
epoch:200 x:1.9955188284400334
epoch:400 x:1.9999932706890864
epoch:600 x:1.9999999899296559
epoch:800 x:1.9999999999849296
简单和大家说一下思路哈:
第一步,我们需要确立我的函数是什么?我们这里求的是平方根,所以 y = x*x ,求解的是x,那么就是一个平方的函数。如下:
确立损失函数并(求导):
loss = (y - n) **2 = (x*x-n)**2
d_loss = 2*(x*x-n)*2*x(损失函数对x求导)
迭代更新x:
x = x -delta(x)= x- lr* d_loss
总结:ok,以上就是一个基本的迭代过程,再来尽可能大白话总结一下哈,首先需要确立好函数方程,然后确立损失函数,这里我们用的平方损失函数(其实用什么都可以哈,这里提一嘴,之所以用平方损失函数,是因为平方损失函数就是对x求解的极大似然估计,感兴趣的话换,欢迎评论,我之后可以再除篇文章详细讲解一下数据依据)。对损失函数求导,就可以得到损失了,然后乘以学习率,就是最终需要更新的delta_x了。(也许有网友疑惑,为什么需要学习率,因为学习率用来控制更新的delta_x的幅度,举个例子如果你不设置lr,那么一次性得到的delta_x就可能很大,就会导致在我们的解周围来回震荡,从而无法得到最终解)
二、迭代法求解平方根(优美版)
def sqrt_cool(num,lr=0.001,epoches=1000):
y = lambda x: x**2
loss = lambda x: (y(x) - num) ** 2
dloss = lambda x: 2*(y(x) - num)*2*x
dx = lambda x,lr: -lr*dloss(x)
x = 1
for _ in range(epoches):
x += dx(x,lr)
if _ % 200 == 0:
print("epoch:\\tx:".format(_,x))
sqrt_cool(4)
epoch:0 x:1.012
epoch:200 x:1.9955188284400334
epoch:400 x:1.9999932706890864
epoch:600 x:1.9999999899296559
epoch:800 x:1.9999999999849296
三、tensorflow求解平方根
#定义变量v
v = tf.get_variable('v',(),dtype=tf.float32)
#定义被求解的变量
num = tf.placeholder(tf.float32,(),'num')
#定义损失函数
loss = tf.square(tf.square(v) - num)
#定义学习器:
opt = tf.train.AdagradOptimizer(0.01)
train = opt.minimize(loss)
#初始化
init = tf.global_variables_initializer()
with tf.Session() as sess:
sess.run(init)
for _ in range(2000):
sess.run(train,num:4)
if _ % 200 == 0:
print(sess.run(v))
-1.2111475
-1.464747
-1.571453
-1.6479093
-1.7076421
-1.756049
-1.7960058
-1.8293115
-1.8572127
-1.880638
今天的部分就暂告一段落,大家有什么想法,欢迎随意评论交流哈~
以上是关于第一问-追本溯源求解平方根?的主要内容,如果未能解决你的问题,请参考以下文章