逻辑回归的代价函数
imageimage
上图是之前线性回归问题时的代价函数,现将上图公式进行改写:
在线性回归问题中,代价函数会被定义为以上形式,但在逻辑回归里,这个代价函数会变成参数 θ 的非凸函数。
是非线性的,如果将这个值带入Cost函数,然后再求代价函数,会得到如下有多个局部最优的函数:
image所以,另找一个是凸函数的代价函数使得能够方便的找到代价函数的全局最小值。
因此对于逻辑回归的代价函数:
image对应的函数的图形如下:
y = 1时 | y = 0时 |
---|---|
image | image |
当假设函数和期望值越接近时,代价函数值越小,反之越大。
简化代价函数以及梯度下降
简化单个样本的代价函数
逻辑回归代价函数对于单个样本的代价函数,可以把 y = 1,y = 0的两种情况合二为一,写成统一的式子:
拟合逻辑回归的参数θ
image核心问题在于求解最小化代价函数:
image对上图的偏导数项展开:
image由于假设函数不同,实际上线性回归和逻辑回归的梯度下降是两个完全不同的东西。
高级优化
使用实例
比如一个包含两个参数的问题:
image对于上图中的代价函数,可以求得 = 5, = 5时,的值最小。
如何使用octave程序计算、:
function [jVal, gradient] = costFunction(theta)
jVal = (theta(1)-5)^2 + (theta(2)-5)^2;
gradient = zeros(2,1);
gradient(1) = 2*(theta(1)-5);
gradient(2) = 2*(theta(2)-5);
上面这段代码定义了一个函数costFunction(theta)
,参数是一个theta
向量,返回值是jVal
、gradient
。
接下来调用高级优化函数fminunc
:
options = optimset('GradObj', 'on', 'MaxIter', '100');
initialTheta = zeros(2,1);
[optTheta, functionVal, exitFlag] = fminunc(@costFunction, initialTheta, options);
fminunc
表示Octave里无约束最小化函数,调用这个函数时,需要传入一个存有配置信息的变量options
。上面的代码中,设置项中'GradObj', 'on'
,代表设置梯度目标参数为打开状态(on),这也意味着现在确实要给这个算法提供一个梯度。'MaxIter', '100'
代表设置最大迭代次数为100次。initialTheta
代表我们给出的一个𝜃的猜测初始值。
然后调用fminunc
这个函数,传入三个参数,其中第一个参数@costFunction
这里的@
符号代表指向之前定义的costFunction
函数的指针。后面两个参数分别是定义的𝑡ℎ𝑒𝑡𝑎
初始值和配置信息options
。
当调用这个fminunc
函数时,它会自动的从众多高级优化算法中挑选一个来使用。
最终会得到三个返回值,分别是满足最小化代价函数𝐽(𝜃)的𝜃值optTheta
,costFunction
中定义的jVal
的值functionVal
,以及标记是否已经收敛的状态值exitFlag
,如果已收敛,标记为1
,否则为0
。
具体操作:
首先在当前工作目录下创建costFunction.m脚本,写入costFunction函数:
image
然后在Octave终端下带入fminunc
函数:
网友评论