机器学习算法------梯度下降法

本文详细介绍了梯度下降法,包括算法的基本原理、一元二次方程最小值的模拟、批量梯度下降在简单线性回归中的应用、梯度下降的向量化与标准化、随机梯度下降的实现及其优缺点。还提供了使用scikit-learn库的SGD实现,并给出了梯度计算的调试方法。
摘要由CSDN通过智能技术生成

优秀的讲解博客

刘建平的博客

算法简述

梯度下降通常是通过迭代的方式来搜索某个函数的极大/小值,他对目标函数每个变量求偏导得出梯度,也就是沿着梯度方向函数值会增加的最快,那么要求最小值就要沿着梯度值的反方向,梯度下降分为随机梯度下降与批量梯度下降,以及小批量梯度下降,随机梯度相比批量梯度耗时少,但精度不如批量高,批量每一步都沿着下降最快的方向下降,但是样本很多的话 耗时很多,还有就是随机梯度具有随机的特性,可能会跳出局部最优解从而到达全局最优解,而批量梯度则会一步步的走向局部最优解

模拟梯度下降法

梯度下降搜索一元二次方程最小值

通过梯度下降 求解 y = (x-2.5) ^ 2 - 1的 最小值

import numpy as np
import matplotlib.pyplot as plt

plot_x = np.linspace(-1., 6., 141)# 造一个数据
plot_y = (plot_x-2.5) ** 2 - 1.
#plt.plot(plot_x, plot_y)
#plt.show()

epsilon = 1e-8 #误差
eta = 0.1 # 学习率

def J(theta):# 要求解的函数
    return (theta - 2.5) ** 2 - 1.
def dJ(theta): # 对函数求导之后的式子
    return 2*(theta-2.5)
theta = 0.0 # theta初始值赋值0
theta_history = [theta] #用来记录theta曾经的取值,来获取theta的变化趋势
while True:
    gradient = dJ(theta) #求出梯度
    last_theta = theta #记录下之前的theta
    theta = theta - eta * gradient #沿着梯度求出新的theta
    theta_history.append(theta)
    if(abs(J(last_theta)-J(theta)) < epsilon): # 如果变得够小了就默认到达了极值点 
        break

print(theta)  # 最小值的theta
print(J(theta)) #最小值是多少
plt.plot(plot_x, plot_y)
plt.plot(np.array(theta_history), J(np.array(theta_history)), color = 'r', marker = '+' )
plt.show()
# 此算法如果eta取值过大会死循环,因此也可以直接限制他的次数
def gradient_descent(initial_theta, eta, n_iters = 1e4, epsilon=1e-8):

    theta = initial_theta
    i_iter = 0
    theta_history.append(initial_theta)

    while i_iter < n_iters:
        gradient = dJ(theta)
        last_theta = theta
        theta = theta - eta * gradient
        theta_history.append(theta)

        if(abs(J(theta) - J(last_theta)) < epsilon):
            break

        i_iter += 1

    return
2.499891109642585
-0.99999998814289

这里写图片描述

利用批量梯度下降法求解简单线性回归模型

用批量梯度下降来搜寻一个一元线性回归模型,所以其根本就是搜索损失函数最小值所对应的系数,对于一般的平方损失函数,求它的梯度,会导致梯度的大小与样本的数量有关,所以我们就在损失函数前面除以一个m,然后分别求偏导得出梯度,其推到如下图

这里写图片描述
这里写图片描述

import numpy as np
import matplotlib.pyplot as plt
#构造一个线性回归数组
np.random.seed(<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>