yinda_peng 发表于 2024-3-31 19:39:35

机器学习常用的一些优化算法

本帖最后由 yinda_peng 于 2024-3-31 19:40 编辑

梯度下降法
梯度下降法可以说是非常常用的基础算法,是通过求参数的梯度,沿着负梯度方向(最速下降方向)去更新,来使得cost function取得极小。需要提醒的是,梯度下降法在目标函数是convex function时取到全局极小点,也就是最小,而当目标函数unconvex时,就可能出现陷入局部极小的情况,这时可以考虑一些其他手段,或是采用模拟退火算法、遗传算法等。

#梯度下降
import numpy as np
import pandas as pd
def gradient_descent(X,y,theta,rate,iter):
    m = len(y)
    for i in range(iter):
      gradient = (1/m) * X.T.dot(X.dot(theta)-y)
      theta -= rate * gradient
    return theta随机梯度下降
随机梯度下降基本与梯度下降法类似,不同的点在于每次迭代只使用一个样本来计算梯度,以达到随机效果,这样做能够以更快的速度更新参数。


#随机梯度下降
import numpy as np
import pandas as pd
def stochastic_gradient_descent(X,y,theta,rate,iter):
    m = len(y)
    for i in range(iter):
      for j in range(m):
            gradient = X.T.dot(X.dot(theta)-y)
            theta -= rate * gradient
      return theta
动量法
动量法是在梯度下降法上加的改进,它在梯度下降的基础上引入动量项,这样让参数的下降方向不仅仅取决于当前的梯度,还取决于之前状态下的梯度,或者说取决于历史梯度,这样做的目的是什么呢?当学习率rate较大时,可能出现在极小点附近来回摆动的震荡状态,引入动量项,可以减少这种震荡来加速收敛。

#动量法
def momentum_gradient_descent(X,y,theta,beta,rate,iter):
    m = len(y)
    k = np.zeros_like(theta)
    for i in range(iter):
      gradient = (1/m) * X.T.dot(X.dot(theta) - y)
      k = beta * k + (1 - beta)*gradient
      theta -= rate * k
    return theta




FishC 发表于 2024-3-31 19:40:01

牛顿法
牛顿法是一种迭代求解非线性方程的方法,也可以用于优化问题。它利用函数的一阶导数和二阶导数信息来逼近函数的局部极小值点。具体思想是,在当前点处,用函数的一阶导数和二阶导数构造一个二次函数,然后找到这个二次函数的极小值点作为下一个迭代点,如此循环迭代,直到收敛到局部极小值。
以下是一个简单的牛顿法实现:

def newtons_method(X, y, theta, iter):
    m = len(y)
    for i in range(iter):
      gradient = (1/m) * X.T.dot(X.dot(theta) - y)
      hessian = (1/m) * X.T.dot(X)
      theta -= np.linalg.inv(hessian).dot(gradient)
    return theta

遗传算法
遗传算法是受到生物进化中“适者生存,优胜劣汰”原理启发的一种优化算法。在遗传算法中,使用一个种群来表示可能的解,通过模拟自然界中的选择、交叉和变异等操作,不断进化优秀的解。遗传算法从种群中选择出适应度高的个体,并采用交叉、变异等操作产生新的个体,经过多次迭代,逐渐找到问题的较优解。
以下是一个简单的遗传算法实现:

import random

def genetic_algorithm(population_size, gene_length, fitness_func, iter):
    population = []
    fitness_values = []
    for _ in range(population_size):
      individual =
      population.append(individual)
      fitness_values.append(fitness_func(individual))

    for _ in range(iter):
      new_population = []
      new_fitness_values = []
      for _ in range(population_size):
            ind1, ind2 = random.choices(population, k=2)
            crossover_point = random.randint(1, gene_length - 1)
            child = ind1[:crossover_point] + ind2
            mutation_point = random.randint(0, gene_length - 1)
            if child == 0:
                child = 1
            else:
                child = 0
            new_population.append(child)
            new_fitness_values.append(fitness_func(child))
      population = new_population
      fitness_values = new_fitness_values

    best_individual = population
    return best_individual

这些优化算法都是机器学习中常用的方法,根据具体问题和数据集的特点,选择合适的优化算法可以提高模型的学习效果。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

小甲鱼 发表于 2024-3-31 19:45:50

{:5_106:} 好东西~

yinda_peng 发表于 2024-3-31 19:48:24

小甲鱼 发表于 2024-3-31 19:45
好东西~

捉~甲鱼大大
页: [1]
查看完整版本: 机器学习常用的一些优化算法