机器学习常用的一些优化算法
本帖最后由 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
牛顿法
牛顿法是一种迭代求解非线性方程的方法,也可以用于优化问题。它利用函数的一阶导数和二阶导数信息来逼近函数的局部极小值点。具体思想是,在当前点处,用函数的一阶导数和二阶导数构造一个二次函数,然后找到这个二次函数的极小值点作为下一个迭代点,如此循环迭代,直到收敛到局部极小值。
以下是一个简单的牛顿法实现:
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 小助理,如未能正确解答您的问题,请继续追问。 {:5_106:} 好东西~ 小甲鱼 发表于 2024-3-31 19:45
好东西~
捉~甲鱼大大
页:
[1]