
正文
python求梯度函数 python 梯度
提示:扫一扫查出行【扫一扫了解最新限行尾号】
复制提示
2019-03-02
集成学习: 构建并结合多个学习器来完成学习任务。
同质: 集成中只包含同种类型的个体学习器(基学习器);
异质: 集成中的个体学习器(组件学习器)由不同学习算法生成。
个体学习器的“准确性”和“多样性”很重要,且相互冲突。
分类: 个体学习器间存在强依赖关系,必须串行生成的序列化方法,eg,Boosting;个体学习器间不存在强依赖关系,可同时生成的并行化方法,eg,Bagging和随机森林。
工作机制: 先从初始训练集训练出一个基学习器1,根据基学习器误差率表现更新训练样本权重,使弱学习器1学习误差率高的训练样本权重变高,让这些点在弱学习器2中得到更多的重视,然后基于调整权重后的训练集训练学习器2,...重复进行,直至弱学习器数目达到指定的值T,最终将这T个基学习器进行加权结合。
Boosting族算法最著名的代表是AdaBoost,是“Adaptive Boosting(自适应增强)”的缩写。它的自适应在于:前一个基本分类器分错的样本会得到加强,加权后的全体样本再次被用来训练下一个基本分类器。同时,在每一轮中加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数。
算法过程
优点:作为分类器时精度很高;在AdaBoost框架下,可使用各种回归分类模型来构建学习器;不易发生过拟合(会加入正则化项)。
缺点:对异常样本点敏感,异常样本在迭代中可能会获得较高的权重,影响最终的强学习器的预测准确性。
两者均是0/1误差的平滑近似:
梯度提升算法首先给定一个目标损失函数,它的定义域是所有可行的基函数集合,提升算法通过迭代的选择一个负梯度方向上的基函数来逐渐逼近局部最小值。
GB每一次建立模型 是在之前建立模型 损失函数的梯度下降方向。一般认为损失函数越小,性能越好,因此最好是使损失函数沿着梯度方向下降,模型得以不断改进提升性能。
GBDT是GB和DT的结合,是以决策树为基学习器的gb算法,此处的决策树是回归树。GBDT中的决策树深度一般不超过5,叶子结点数不超过10。GBDT核心在于: 每一棵树学得是之前所有树结论和的残差 ,这个残差就是一个加预测值后能得真实值的累加量。比如A的真实年龄是18岁,但第一棵树的预测年龄是12岁,差了6岁,即残差为6岁。那么在第二棵树里我们把A的年龄设为6岁去学习,如果第二棵树真的能把A分到6岁的叶子节点,那累加两棵树的结论就是A的真实年龄;如果第二棵树的结论是5岁,则A仍然存在1岁的残差,第三棵树里A的年龄就变成1岁,继续学习。
xgboost是在GBDT基本思路上改善而来,主要改变有
1) 在损失函数中加入防止过拟合的惩罚函数
T是叶子的个数,w是预测函数的参数,也就是决策树算法下叶子节点的权重值。可以控制γ和λ这两个超参数来调整正则化的惩罚力度。其实这里的惩罚函数也就定义了模型复杂度,比如γ越大,λ越大,复杂度越小越不易过拟合。
2) 用二阶泰勒展式将损失函数展开,同时用到了一阶和二阶导数
第t次的loss:
对上式做二阶泰勒展开:g为一阶导数,h为二阶导数
3)CART回归树中寻找最佳分割点的衡量标准是最小化均方差,xgboost 寻找分割点的标准是最大化 ,lamda,gama与正则化项相关
xgboost算法的步骤和GB基本相同,都是首先初始化为一个常数,gb是根据一阶导数ri,xgboost是根据一阶导数gi和二阶导数hi,迭代生成基学习器,相加更新学习器。
为得到泛化性能强的集成,集成中的个体学习器应尽可能相互独立,考虑使用相互有交叠的采样子集。
并行式集成学习的最著名代表,基于自助采样法,算法流程如下:
优点:训练一个Bagging集成与直接使用基学习算法训练一个学习器的复杂度同阶;与标准AdaBoost只适用于二分类任务不同,Bagging能不经修改的用于多分类、回归任务;初始训练集63.2%用于训练,36.8%用作验证集对泛化性能做“包外估计”。
但从偏差-方差分解角度看,Bagging主要关注降低方差。
随机森林是Bagging的一个扩展变体,在以决策树为基学习器构建Bagging集成的基础上,在决策树训练过程中引入了 随机属性选择 。即对基决策树的每个结点,先从该结点的属性集合中随机选择一个包含k(kd,d为所有属性个数)个属性的子集,然后从中选一个最优属性用于划分。若k=d,则为传统决策树;k=1,则随机选择一个属性划分。一般推荐 。
RF起始性能相对较差,但随着学习器数目的增加,会收敛到更低的泛化误差。另外RF的训练效率常优于Bagging,因为Bagging使用“确定型”决策树,选择划分属性时要对结点所有属性进行考察,而RF使用“随机型”决策树,只需考虑一个属性子集。
学习器结合可能会从三个方面带来好处:
1)统计方面:当多个假设达到同等性能时,可减小因误选单学习器导致泛化性能不佳的风险;
2)计算方面:降低陷入糟糕局部极小点的风险;
3)表示方面:扩大相应假设空间,学习更好的近似。
对数值型输出 ,最常见的结合策略是平均法。
简单平均:
(特殊的加权平均法,宜在个体学习器性能相近时使用)
加权平均法:
其中 是个体学习器 的权重,一般从训练数据中学习而得,通常要求 ,宜在个体学习器相差较大时使用。
对分类任务,学习器从类别标记集合中预测出一个标记,最常见的结合策略是投票法。
绝大多数投票法:
相对多数投票法:
预测为得票最多的标记,若同时有多个标记获得最高票,则从中随机选取一个。
加权投票法:
与加权平均法类似, 是 的权重,通常 。
个体学习器的输出类型:
类标记: 硬投票。 ,若 将样本x预测为类别 则取值为1,否则为0。
类概率: 软投票。 ,相当于对后验概率 的一个估计。
不同类型的 值不能混用;对一些能在预测出类别标记的同时产生分类置信度的学习器,其分类置信度可转化为类概率使用;分类置信度应规范化后使用;基于类概率进行结合优于直接基于类标记进行结合;若基学习器类型不同,不能直接比较类概率值,应先将其转化为类标记输出(eg类概率输出最大的设为1,其他为0)再投票。
当训练数据很多时,常使用通过另一个学习器来进行结合的“学习法”,代表算法Stacking
第一阶段获得各个模型对样本x1的预测标签值;第二阶段将各个模型的预测标签值作为一个新的特征(x1的真实标签值还是标签值),再用某个算法进行训练,获得一个融合模型,用这个融合模型进行测试集的预测。
周志华《机器学习》
相关问答
Q1: Python怎么做最优化
一、概观
scipy中的optimize子包中提供了常用的最优化算法函数实现。我们可以直接调用这些函数完成我们的优化问题。optimize中函数最典型的特点就是能够从函数名称上看出是使用了什么算法。下面optimize包中函数的概览:
1.非线性最优化
fmin -- 简单Nelder-Mead算法
fmin_powell -- 改进型Powell法
fmin_bfgs -- 拟Newton法
fmin_cg -- 非线性共轭梯度法
fmin_ncg -- 线性搜索Newton共轭梯度法
leastsq -- 最小二乘
2.有约束的多元函数问题
fmin_l_bfgs_b ---使用L-BFGS-B算法
fmin_tnc ---梯度信息
fmin_cobyla ---线性逼近
fmin_slsqp ---序列最小二乘法
nnls ---解|| Ax - b ||_2 for x=0
3.全局优化
anneal ---模拟退火算法
brute --强力法
4.标量函数
fminbound
brent
golden
bracket
5.拟合
curve_fit-- 使用非线性最小二乘法拟合
6.标量函数求根
brentq ---classic Brent (1973)
brenth ---A variation on the classic Brent(1980)ridder ---Ridder是提出这个算法的人名
bisect ---二分法
newton ---牛顿法
fixed_point
7.多维函数求根
fsolve ---通用
broyden1 ---Broyden’s first Jacobian approximation.
broyden2 ---Broyden’s second Jacobian approximationnewton_krylov ---Krylov approximation for inverse Jacobiananderson ---extended Anderson mixing
excitingmixing ---tuned diagonal Jacobian approximationlinearmixing ---scalar Jacobian approximationdiagbroyden ---diagonal Broyden Jacobian approximation8.实用函数
line_search ---找到满足强Wolfe的alpha值
check_grad ---通过和前向有限差分逼近比较检查梯度函数的正确性二、实战非线性最优化
fmin完整的调用形式是:
fmin(func, x0, args=(), xtol=0.0001, ftol=0.0001, maxiter=None, maxfun=None, full_output=0, disp=1, retall=0, callback=None)不过我们最常使用的就是前两个参数。一个描述优化问题的函数以及初值。后面的那些参数我们也很容易理解。如果您能用到,请自己研究。下面研究一个最简单的问题,来感受这个函数的使用方法:f(x)=x**2-4*x+8,我们知道,这个函数的最小值是4,在x=2的时候取到。
from scipy.optimize import fmin #引入优化包def myfunc(x):
return x**2-4*x+8 #定义函数
x0 = [1.3] #猜一个初值
xopt = fmin(myfunc, x0) #求解
print xopt #打印结果
运行之后,给出的结果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
程序准确的计算得出了最小值,不过最小值点并不是严格的2,这应该是由二进制机器编码误差造成的。
除了fmin_ncg必须提供梯度信息外,其他几个函数的调用大同小异,完全类似。我们不妨做一个对比:
from scipy.optimize import fmin,fmin_powell,fmin_bfgs,fmin_cgdef myfunc(x):
return x**2-4*x+8
x0 = [1.3]
xopt1 = fmin(myfunc, x0)
print xopt1
xopt2 = fmin_powell(myfunc, x0)
print xopt2
xopt3 = fmin_bfgs(myfunc, x0)
print xopt3
xopt4 = fmin_cg(myfunc,x0)
print xopt4
给出的结果是:
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 16
Function evaluations: 32
[ 2.00001953]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 53
1.99999999997
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 12
Gradient evaluations: 4
[ 2.00000001]
Optimization terminated successfully.
Current function value: 4.000000
Iterations: 2
Function evaluations: 15
Gradient evaluations: 5
[ 2.]
我们可以根据给出的消息直观的判断算法的执行情况。每一种算法数学上的问题,请自己看书学习。个人感觉,如果不是纯研究数学的工作,没必要搞清楚那些推导以及定理云云。不过,必须了解每一种算法的优劣以及能力所及。在使用的时候,不妨多种算法都使用一下,看看效果分别如何,同时,还可以互相印证算法失效的问题。
在from scipy.optimize import fmin之后,就可以使用help(fmin)来查看fmin的帮助信息了。帮助信息中没有例子,但是给出了每一个参数的含义说明,这是调用函数时候的最有价值参考。
有源码研究癖好的,或者当你需要改进这些已经实现的算法的时候,可能需要查看optimize中的每种算法的源代码。在这里:https:/ / github. com/scipy/scipy/blob/master/scipy/optimize/optimize.py聪明的你肯定发现了,顺着这个链接往上一级、再往上一级,你会找到scipy的几乎所有源码!
Q2: python非线性规划用什么模块
python非线性规划用什么模块本文使用SciPy的optimize模块来求解非线性规划问题,结合实际例子,引入非线性规划问题的求解算法及相应函数的调用。
本文提纲一维搜索/单变量优化问题
无约束多元优化问题
非线性最小二乘问题
约束优化问题
非线性规划问题的目标函数或约束条件是非线性的。本文使用SciPy的optimize模块来求解非线性规划问题。
目标函数和约束条件是否连续光滑是非常重要的性质,这是因为如果光滑,则所有决策变量可微,多变量函数的偏导数组成的向量为梯度,梯度是指向目标函数增长最快的方向。将目标函数梯度作为搜索方向,对非线性规划问题的求解具有重要的意义。这些函数或其导数\梯度的不连续性给许多现有的非线性优化问题的求解带来了困难。在下文中,我们假设这些函数是连续且光滑的。
# Importing Modules
from scipy import optimize
import matplotlib.pyplot as plt
import numpy as np
import sympy
1、一维搜索/单变量优化问题(Univariate Optimization)
无约束非线性规划最简单的形式是一维搜索。一维搜索通常作为多维优化问题中的一部分出现,比如梯度下降法中每次最优迭代步长的估计。求解一维搜索常用的两类方法是函数逼近法和区间收缩法。其中函数逼近法是指用较简单的函数近似代替原来的函数,用近似函数的极小点来估计原函数的极小点,比如牛顿法;区间收缩法对于一个单谷函数通过迭代以不断缩小该区间的长度,当区间长度足够小时,可将该区间中的一点作为函数的极小点,比如黄金分割法。
e.g. 最小化一个单位体积的圆柱体的表面积。
r, h = sympy.symbols("r, h")
Area = 2 * sympy.pi * r**2 + 2 * sympy.pi * r * h
Volume = sympy.pi * r**2 * h
Q3: 用python求等腰梯形的面积和周长
# 面积:
# 设等腰梯形的上底为a,下底为b,高为h,则面积S=(a+b)*h/2
# Python代码:
a = float(input("请输入上底:"))
b = float(input("请输入下底:"))
h = float(input("请输入高:"))
S = (a + b) * h / 2
print("等腰梯形的面积为:", S)
# 周长:
# 设等腰梯形的上底为a,下底为b,斜边为c,则周长P=a+b+2*c
# Python代码:
a = float(input("请输入上底:"))
b = float(input("请输入下底:"))
c = float(input("请输入斜边:"))
P = a + b + 2 * c
print("等腰梯形的周长为:", P)
解题思路
Q4: 如何使用python计算常微分方程?
常用形式
odeint(func, y0, t,args,Dfun)
一般这种形式就够用了。
下面是官方的例子,求解的是
D(D(y1))-t*y1=0
为了方便,采取D=d/dt。如果我们令初值
y1(0) = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
D(y1)(0) = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
这个微分方程的解y1=airy(t)。
令D(y1)=y0,就有这个常微分方程组。
D(y0)=t*y1
D(y1)=y0
Python求解该微分方程。
from scipy.integrate import odeint
from scipy.special import gamma, airy
y1_0 = 1.0/3**(2.0/3.0)/gamma(2.0/3.0)
y0_0 = -1.0/3**(1.0/3.0)/gamma(1.0/3.0)
y0 = [y0_0, y1_0]
def func(y, t):
... return [t*y[1],y[0]]
def gradient(y,t):
... return [[0,t],[1,0]]
x = arange(0,4.0, 0.01)
t = x
ychk = airy(x)[0]
y = odeint(func, y0, t)
y2 = odeint(func, y0, t, Dfun=gradient)
print ychk[:36:6]
[ 0.355028 0.339511 0.324068 0.308763 0.293658 0.278806]
print y[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
print y2[:36:6,1]
[ 0.355028 0.339511 0.324067 0.308763 0.293658 0.278806]
得到的解与精确值相比,误差相当小。
=======================================================================================================
args是额外的参数。
用法请参看下面的例子。这是一个洛仑兹曲线的求解,并且用matplotlib绘出空间曲线图。(来自《python科学计算》)
from scipy.integrate import odeint
import numpy as np
def lorenz(w, t, p, r, b):
# 给出位置矢量w,和三个参数p, r, b 计算出
# dx/dt, dy/dt, dz/dt 的值
x, y, z = w
# 直接与lorenz 的计算公式对应
return np.array([p*(y-x), x*(r-z)-y, x*y-b*z])
t = np.arange(0, 30, 0.01) # 创建时间点
# 调用ode 对lorenz 进行求解, 用两个不同的初始值
track1 = odeint(lorenz, (0.0, 1.00, 0.0), t, args=(10.0, 28.0, 3.0))
track2 = odeint(lorenz, (0.0, 1.01, 0.0), t, args=(10.0, 28.0, 3.0))
# 绘图
from mpl_toolkits.mplot3d import Axes3D
import matplotlib.pyplot as plt
fig = plt.figure()
ax = Axes3D(fig)
ax.plot(track1[:,0], track1[:,1], track1[:,2])
ax.plot(track2[:,0], track2[:,1], track2[:,2])
plt.show()
===========================================================================
scipy.integrate.odeint(func, y0, t, args=(), Dfun=None, col_deriv=0, full_output=0, ml=None, mu=None, rtol=None, atol=None, tcrit=None, h0=0.0, hmax=0.0, hmin=0.0, ixpr=0, mxstep=0, mxhnil=0, mxordn=12, mxords=5, printmessg=0)
计算常微分方程(组)
使用 FORTRAN库odepack中的lsoda解常微分方程。这个函数一般求解初值问题。
参数:
func : callable(y, t0, ...) 计算y在t0 处的导数。
y0 : 数组 y的初值条件(可以是矢量)
t : 数组 为求出y,这是一个时间点的序列。初值点应该是这个序列的第一个元素。
args : 元组 func的额外参数
Dfun : callable(y, t0, ...) 函数的梯度(Jacobian)。即雅可比多项式。
col_deriv : boolean. True,Dfun定义列向导数(更快),否则Dfun会定义横排导数
full_output : boolean 可选输出,如果为True 则返回一个字典,作为第二输出。
printmessg : boolean 是否打印convergence 消息。
返回: y : array, shape (len(y0), len(t))
数组,包含y值,每一个对应于时间序列中的t。初值y0 在第一排。
infodict : 字典,只有full_output == True 时,才会返回。
字典包含额为的输出信息。
键值:
‘hu’ vector of step sizes successfully used for each time step.
‘tcur’ vector with the value of t reached for each time step. (will always be at least as large as the input times).
‘tolsf’ vector of tolerance scale factors, greater than 1.0, computed when a request for too much accuracy was detected.
‘tsw’ value of t at the time of the last method switch (given for each time step)
‘nst’ cumulative number of time steps
‘nfe’ cumulative number of function evaluations for each time step
‘nje’ cumulative number of jacobian evaluations for each time step
‘nqu’ a vector of method orders for each successful step.
‘imxer’index of the component of largest magnitude in the weighted local error vector (e / ewt) on an error return, -1 otherwise.
‘lenrw’ the length of the double work array required.
‘leniw’ the length of integer work array required.
‘mused’a vector of method indicators for each successful time step: 1: adams (nonstiff), 2: bdf (stiff)
其他参数,官方网站和文档都没有明确说明。相关的资料,暂时也找不到。
python求梯度函数的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于python 梯度、python求梯度函数的信息别忘了在本站进行查找喔。





