鱼C论坛

 找回密码
 立即注册
查看: 681|回复: 3

[技术交流] 机器学习常用的一些优化算法

[复制链接]
发表于 2024-3-31 19:39:35 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

梯度下降法

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

Screenshot_2024_0331_191700.png

#梯度下降
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
随机梯度下降

  随机梯度下降基本与梯度下降法类似,不同的点在于每次迭代只使用一个样本来计算梯度,以达到随机效果,这样做能够以更快的速度更新参数。

Screenshot_2024_0331_192919.png


#随机梯度下降
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[j].T.dot(X[j].dot(theta)-y[i])
            theta -= rate * gradient
        return theta
动量法

  动量法是在梯度下降法上加的改进,它在梯度下降的基础上引入动量项,这样让参数的下降方向不仅仅取决于当前的梯度,还取决于之前状态下的梯度,或者说取决于历史梯度,这样做的目的是什么呢?当学习率rate较大时,可能出现在极小点附近来回摆动的震荡状态,引入动量项,可以减少这种震荡来加速收敛。

Screenshot_2024_0331_193430.png

#动量法
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




本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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 = [random.randint(0, 1) for _ in range(gene_length)]
        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[crossover_point:]
            mutation_point = random.randint(0, gene_length - 1)
            if child[mutation_point] == 0:
                child[mutation_point] = 1
            else:
                child[mutation_point] = 0
            new_population.append(child)
            new_fitness_values.append(fitness_func(child))
        population = new_population
        fitness_values = new_fitness_values

    best_individual = population[fitness_values.index(max(fitness_values))]
    return best_individual

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-3-31 19:45:50 | 显示全部楼层
好东西~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-3-31 19:48:24 | 显示全部楼层

捉~甲鱼大大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-15 12:49

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表