利用梯度下降法和牛顿法求开方

假如现在要求的是根号2
x 2 = 2 x^2 = 2 x2=2的解

使用梯度下降法

梯度下降主要通过求梯度为0的点,得到凸函数的全局最小值。
首先构建损失函数为凸函数的目标函数, 使得目标函数的最小值对应的是我们要求的值
x 2 = 2 x^2 = 2 x2=2
我们可以构建一个损失函数
L = ( x 2 − 2 ) 2 L = (x^2 - 2) ^2 L=(x22)2
这里为什么不直接用 x 2 − 2 x^2 - 2 x22是因为其最小值对应的x不是我们要求的x.
构建了损失函数以后,就可以用梯度下降法来求全局最优的x的值,即为我们要求的根号2的值。
g ( x ) = d L / d x = 4 x 3 − 8 x = 4 x ( x 2 − 2 ) g(x)=d L / d x=4 x^{3}-8x =4 x\left(x^{2}-2\right) g(x)=dL/dx=4x38x=4x(x22)
x n + 1 = x n − a g ( x n ) ( 1 ) x_{n+1}=x_{n}-a g\left(x_{n}\right) (1) xn+1=xnag(xn)1
给x一个初始值,然后不断通过1式来更新x就可以逐渐逼近最优的x

python 实现
def gradient_descent(n):
    x = float(random.randint(1, 100))
    array = []
    while (abs(x ** 2 - n) > 0.0001):
        x = x - 0.00001 * 4 * x * (x ** 2 - n)
        array.append(x)
    return array

n=10
array = gradient_descent(n)
x = range(len(array))
plt.plot(x, array, color='b')
plt.show()
import math
print(math.sqrt(n), array[-1])

使用牛顿法

牛顿法的一大用处就是求方程的根。
对于方程
f ( x ) = x 2 − 2 f(x) = x^2 - 2 f(x)=x22
f ( x ) f(x) f(x)进行一阶泰勒展开后得
f ( x ) = f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) f(x) = f(x_{0}) + f'(x_{0})(x-x_{0}) f(x)=f(x0)+f(x0)(xx0)
f ( x ) f(x) f(x)等于0得
f ( x 0 ) + f ′ ( x 0 ) ( x − x 0 ) = 0 f(x_{0}) + f'(x_{0})(x-x_{0}) = 0 f(x0)+f(x0)(xx0)=0
可推出
x n + 1 = x n − f ( x n ) f ′ ( x n ) x_{n+1}=x_{n}-\frac{f\left(x_{n}\right)}{f^{\prime}\left(x_{n}\right)} xn+1=xnf(xn)f(xn)
这样就得到的x的迭代式

import random
import matplotlib.pyplot as plt
import math
def Newton(n):
    array = []
    x = float(random.randint(1, 100))
    while(abs(x**2 - n) > 0.000000001):
        x = x - (x**2 - n ) / (2*x)
        array.append(x)
    return array

n=10
array = Newton(n)
x = range(len(array))
plt.plot(x, array, color='b')
plt.show()
print(math.sqrt(n), array[-1])

你可能感兴趣的:(机器学习)