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

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

机器学习中的搜索算法


本节知识导图

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


相关文章
|
1天前
|
机器学习/深度学习 分布式计算 并行计算
【机器学习】怎样在非常大的数据集上执行K-means算法?
【5月更文挑战第13天】【机器学习】怎样在非常大的数据集上执行K-means算法?
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】列举几种情况,在这些情况下K-means算法难以取得较好效果
【5月更文挑战第13天】【机器学习】列举几种情况,在这些情况下K-means算法难以取得较好效果
|
1天前
|
机器学习/深度学习 传感器 算法
【机器学习】在聚类算法中,使用曼哈顿距离和使用欧式距离有什么区别?
【5月更文挑战第12天】【机器学习】在聚类算法中,使用曼哈顿距离和使用欧式距离有什么区别?
|
1天前
|
数据采集 机器学习/深度学习 人工智能
【机器学习】在使用K-means算法之前,如何预处理数据?
【5月更文挑战第12天】【机器学习】在使用K-means算法之前,如何预处理数据?
|
1天前
|
机器学习/深度学习 算法 数据可视化
【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
【5月更文挑战第12天】【机器学习】比较分层聚类(Hierarchical Clustering)和K-means聚类算法
|
1天前
|
机器学习/深度学习 数据采集 算法
深入理解并应用机器学习算法:支持向量机(SVM)
【5月更文挑战第13天】支持向量机(SVM)是监督学习中的强分类算法,用于文本分类、图像识别等领域。它寻找超平面最大化间隔,支持向量是离超平面最近的样本点。SVM通过核函数处理非线性数据,软间隔和正则化避免过拟合。应用步骤包括数据预处理、选择核函数、训练模型、评估性能及应用预测。优点是高效、鲁棒和泛化能力强,但对参数敏感、不适合大规模数据集且对缺失数据敏感。理解SVM原理有助于优化实际问题的解决方案。
|
1天前
|
机器学习/深度学习 算法
理解并应用机器学习算法:决策树
【5月更文挑战第12天】决策树是直观的分类与回归机器学习算法,通过树状结构模拟决策过程。每个内部节点代表特征属性,分支代表属性取值,叶子节点代表类别。构建过程包括特征选择(如信息增益、基尼指数等)、决策树生成和剪枝(预剪枝和后剪枝)以防止过拟合。广泛应用在信贷风险评估、医疗诊断等领域。理解并掌握决策树有助于解决实际问题。
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】在使用K-means聚类算法时,如何选择K的值?
【5月更文挑战第11天】【机器学习】在使用K-means聚类算法时,如何选择K的值?
|
1天前
|
机器学习/深度学习 算法 数据挖掘
【机器学习】为什么K-means算法使用欧式距离度量?
【5月更文挑战第11天】【机器学习】为什么K-means算法使用欧式距离度量?
|
1天前
|
机器学习/深度学习 算法 数据可视化
【机器学习】描述K-means算法的步骤
【5月更文挑战第11天】【机器学习】描述K-means算法的步骤