【机器学习】搜索算法(梯度,随机梯度,次梯度,小批量,坐标下降)

简介: 【机器学习】搜索算法(梯度,随机梯度,次梯度,小批量,坐标下降)

机器学习中的搜索算法


本节知识导图

4f3a83294cbf2258e4b4bc104bf833a3_07ee92cb2ea648d8ae9d609b7872d519.png


预先需要了解:

a9acdc4128fc3289cc13e31da6aaf87c_656717f2b20f431bb62e7b49d67d5337.png


  • 凸函数优化:局部最优解一定是全局最优解

凸函数:由上图来看,凸函数的几何意义在于,定义域中任意两点连线组成的线段都在这两点的函数曲线(面)上方。


c2ed8d679cdedb8674e3bc3789c41209_31a061dffa7e4781bb5e1a1e62fd0a19.png


  • 非凸函数优化:局部最优解不一定是全局最优解

梯度下降算法


算法思想


从线性回归问题了解算法思想:


image.png

3c6086e729ee433a4a31772d18bd7d6c_bb72d27038ef44359e402e2a0a9348e1.png

按照线性回归的解题思路是:

image.png

按照梯度下降的解题思路是:

image.png

总结梯度下降思路:

  1. 梯度下降算法从空间中任一给定初始点开始进行指定轮数的搜索。
  2. 在每一轮搜索中都计算目标函数在当前点的梯度,并沿着与梯度相反的方向按照一定步长移动到下一可行点

8f61e5084995d4fdc230233d34a8199d_92f577c5f64e4734b3dc4f82b3432fae.png

目标函数要求:

  1. 目标函数可微
  2. 目标函数必须是凸函数或者强凸函数

脱离线性回归问题,将梯度下降算法步骤抽象出来就是这样:

c003132abda2956275bbd37a2646c660_76c3e1f1e4c3489e8d511d08d414f347.png


随机梯度下降


按照梯度下降的解题思路是

image.png

特点:

image.png


按照随机梯度下降的解题思路是:

image.png

image.png


脱离线性回归问题,将随机梯度下降算法步骤抽象出来就是这样:

cb5ce21a6dce90dcf6b526aadab8695f_011bc60ea42144979f0925e3292d4007.png

特点:

image.png

对于随机梯度和梯度计算的梯度数据量问题:

简单来说是梯度下降每次循环计算的是这个式子的梯度

a2feed9221ed935cc6d3b5e3350e19cd_16cd073f8f86478cbc6072e6feb2dfcc.png

随机梯度下降是这个式子的梯度

5b76cbec926e08a33adc5e4fb39157cd_437b3c9f91f94f3895b5bc270bc1d181.png


例子:随机梯度下降和梯度下降的比较


例4.7 :

 用Sklearn工具库中的make_regression函数来随机生成一个线性回归问题。

 分别采用梯度下降与随机梯度下降算法求解回归问题。

import matplotlib.pyplot as plt
import numpy as np
from sklearn.datasets import make_regression
class LinearRegressionSGD:
    def __init__(self):
        self.w = None
    def fit(self, X, y, eta_0=10, eta_1=50, N=1000):
        m, n = X.shape
        w = np.zeros((n, 1))
        self.w = w
        W = np.zeros((N, 2))
        for t in range(N):
            W[t][0] = w[0]
            W[t][1] = w[1]
            i = np.random.randint(m)
            x = X[i].reshape(1, -1)  # 这里使用 (1,-1) 表示将数组重塑为1行,第二维的长度自动计算得出。将结果赋值给变量 x
            e = x.dot(w) - y[i]
            gradient = 2 * e * x.T
            w = w - eta_0 * gradient / (t + eta_1)
            self.w += w
        self.w /= N
        plt.figure(0)
        plt.scatter(W[:, 0], W[:, 1], s=15)
        plt.plot(W[:, 0], W[:, 1])
    def predict(self, X):
        return X.dot(self.w)
class LinearRegression:
    def __init__(self):
        self.w = None
    def fit(self, X, y, eta, N=1000):
        m, n = X.shape
        w = np.zeros((n, 1))
        W = np.zeros((N, 2))
        for t in range(N):
            W[t][0] = w[0]
            W[t][1] = w[1]
            e = X.dot(w) - y
            g = 2 * X.T.dot(e) / m
            w = w - eta * g
        self.w = w
        plt.scatter(W[:, 0], W[:, 1], s=15)
        plt.plot(W[:, 0], W[:, 1])
    def predict(self, X):
        return X.dot(self.w)
X, y = make_regression(n_samples=100, n_features=2, noise=0.1, bias=0, random_state=0)
y = y.reshape(-1, 1)
model = LinearRegression()
model.fit(X, y, eta=0.01, N=1000)
print(model.w)
model = LinearRegressionSGD()
model.fit(X, y, eta_0=10, eta_1=50, N=1000)
print(model.w)
plt.show()

f84314fcdae7ed2ef7838daab1dcd47a_04087b24b1c947d28f5df7513875e44a.png

b41616596e631bd43849d2e4a9a595a0_3a3edfef46304cbfb3005d9e7bca79dc.png


次梯度下降算法


  • 当目标函数不可微的时候,需要将梯度的概念推广到次梯度

次梯度(subgradient)是凸优化中的一个概念。在凸优化中,次梯度是对于非光滑凸函数的梯度的一种泛化。对于一个非光滑且凸的函数f(x),如果 x 是f(x) 的极小值点,那么就必须满足0∈∂f(x)。其中∂f(x) 为f(x) 在点 x 处的次梯度集合,它可以被定义为一个包含所有可能的子梯度的集合。

 对于一个可微的函数,其梯度就是唯一的,但是对于一个非光滑的凸函数,其梯度并不唯一,因为它在某些点上可能是不可导的。在这种情况下,次梯度的概念就派上用场了。次梯度可以被看作是梯度的一个推广,它允许我们在非光滑凸函数上进行优化。


次梯度的概念


次梯度定义:

image.png


定理:

image.png


f385a9fc57fbc7b69049b1525990b29c_1f8ae6cd55a84896add455cf68f8b743.png

b2b110ecc76624f0618ed387ebb22ba1_04dbe96b44d448628d3497eebe516d3e.png


举例: Lasso回归优化算法


定义(Lasso回归):

image.png

那么,从目标函数可以看出:

4c6ace93b8eb9404fe83e8969d97c5c5_b8eebf9f090e4e11bb87c8f35e826c2b.png

次梯度下降算法是适合于求解Lasso回归的优化算法

28dd8c678d2e3ea53ea307e78aa85268_7ff07ca9aa414557b21b8aeca363da07.png


8dcc4a0ea59ba3411a355001c8e05d15_940cc6c3e261490a919b4cb40b4cfa6c.png

# Lasso回归优化算法
import numpy as np
 class Lasso:
  def __init__(self, Lambda=1): #L1正则化系数λ
    self.Lambda = Lambda
  def fit(self, X, y, eta=0.1, N=1000):
    m,n = X.shape
    w = np.zeros((n,1))
    self.w = w
    for t in range(N):
      e = X.dot(w) - y
      v = 2 * X.T.dot(e) / m + self.Lambda * np.sign(w) # λ|w|的次梯度
      w = w - eta * v
      self.w += w
    self.w /= N #w取平均值
  def predict(self, X):
    return X.dot(self.w)


小梯度下降算法


 小批量梯度下降(Mini-batch Gradient Descent)是介于批量梯度下降和随机梯度下降之间的一种优化算法。它的思想是将训练数据划分成若干个小的批次,每个批次包含m个样本,然后对每个批次进行梯度下降更新参数。相比于批量梯度下降,小批量梯度下降可以减少计算量,加速收敛,并且相对于随机梯度下降,可以更好地利用GPU的并行计算能力。

 因此,小批量梯度下降是两者之间的一种平衡方案,具有较快的收敛速度和更好的收敛性能。


抽象出来,解题过程:

31d8f75ff2ab9a6ff3d6f17191183dca_26607c63ce6248d48e643a983dd2f40a.png


### 示例:线性回归的小批量梯度下降算法

import numpy as np
 class LinearRegression:
  def fit(self, X, y, eta_0=10, eta_1=50, N=3000, B=10):
    m, n = X.shape
    w = np.zeros((n,1))
    self.w = w
    for t in range(N):
      batch = np.random.randint(low=0, high=m, size=B)
      X_batch = X[batch].reshape(B,-1)
      y_batch = y[batch].reshape(B,-1)
      e = X_batch.dot(w) - y_batch
      g = 2 * X_batch.T.dot(e) / B
      w = w - eta_0 * g / (t + eta_1)
      self.w += w
    self.w /= N
def predict(self, X):
  return X.dot(self.w


坐标下降算法


坐标下降算法优于梯度下降算法的两个场合:


梯度不存在或梯度函数较为复杂难以计算;

需要求解带约束的优化问题


坐标下降算法的搜索过程:


每一步选取一个要调整的坐标分量,且固定参数的其它各分量的值。然着

沿着选取分量的坐标轴方向移动,到达该方向上目标函数值最小的那个点。

如此循环,使用不同的坐标方向,直至沿任何一个坐标移动都无法降低目标函数值为止。


一般情况:

image.png

抽象出来,解题过程:

74cbf79fcdcb4b64cceb67f3b62fe1e2_75c462a8279743e28aa730a668591e4e.png



例题:考察二元函数


9e6476e13841b1dbc554c87e6d6b6e7c_dfb57c6610db4b3f9add016e28ea9709.png

53ed92ee18fb4e7c659e068b74295ff5_c56330555e194fd9897ad198f7f90ef5.png


相关文章
|
27天前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
85 4
|
27天前
|
机器学习/深度学习 Python
机器学习中模型选择和优化的关键技术——交叉验证与网格搜索
本文深入探讨了机器学习中模型选择和优化的关键技术——交叉验证与网格搜索。介绍了K折交叉验证、留一交叉验证等方法,以及网格搜索的原理和步骤,展示了如何结合两者在Python中实现模型参数的优化,并强调了使用时需注意的计算成本、过拟合风险等问题。
47 6
|
23天前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
39 1
|
1月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
1月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
89 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
1月前
|
算法 搜索推荐 数据库
二分搜索:高效的查找算法
【10月更文挑战第29天】通过对二分搜索的深入研究和应用,我们可以不断挖掘其潜力,为各种复杂问题提供高效的解决方案。相信在未来的科技发展中,二分搜索将继续发挥着重要的作用,为我们的生活和工作带来更多的便利和创新。
50 1
|
1月前
|
机器学习/深度学习 算法
深入探索机器学习中的决策树算法
深入探索机器学习中的决策树算法
37 0
|
1月前
|
机器学习/深度学习 算法 Python
机器学习入门:理解并实现K-近邻算法
机器学习入门:理解并实现K-近邻算法
36 0
|
18天前
|
算法
基于WOA算法的SVDD参数寻优matlab仿真
该程序利用鲸鱼优化算法(WOA)对支持向量数据描述(SVDD)模型的参数进行优化,以提高数据分类的准确性。通过MATLAB2022A实现,展示了不同信噪比(SNR)下模型的分类误差。WOA通过模拟鲸鱼捕食行为,动态调整SVDD参数,如惩罚因子C和核函数参数γ,以寻找最优参数组合,增强模型的鲁棒性和泛化能力。
|
4天前
|
供应链 算法 调度
排队算法的matlab仿真,带GUI界面
该程序使用MATLAB 2022A版本实现排队算法的仿真,并带有GUI界面。程序支持单队列单服务台、单队列多服务台和多队列多服务台三种排队方式。核心函数`func_mms2`通过模拟到达时间和服务时间,计算阻塞率和利用率。排队论研究系统中顾客和服务台的交互行为,广泛应用于通信网络、生产调度和服务行业等领域,旨在优化系统性能,减少等待时间,提高资源利用率。