【HowTo ML】分类问题->逻辑回归
2016-03-27 15:32
465 查看
分类问题(Classification Problem)
样本因变量YY被标记为种类,也就是说分类是要预测一个离散值的输出。对应的问题就是分为 YY 类的概率。支持向量机支持无数多的属性
逻辑回归(Logistic Regression)
逻辑回归:根据自变量确定因变量的种类,hθ(x)∈[0,1]h _ \theta(x) \in [0,1] 但是在分类问题中hθ(x)h _ \theta(x)可以>1>1或者<0<0.逻辑回归通常使用的是二元,这类问题中 y∈{0,1}y \in \{0,1 \} .
其中:
0: Negative Class 1: Positive Class
常见问题:垃圾邮件过滤,欺诈检测,肿瘤识别.
通常我们不会使用线性回归来解决分类问题.
对于两种分类来说,我们通常会引入阀值(Threshold),但当我们加入一个XX较大的数据通常会对阀值造成很大影响.
但现实中影响却不大.
假设函数(Hypothesis Representation)
为了使hθ(x)∈[0,1]h _ \theta(x) \in [0,1],我们需要更改回归问题时用到的函数,变成形式hθ(x)=g(θTX)h _ \theta(x) = g(\theta^TX).其中gg称为S型函数(Sigmoid function)或者(Logistic Function),定义为g(z)=11+e−zg(z) = \frac {1}{1+e^{-z}},函数图像如下:
带入可得
hθ(x)=11+e−θTxh _ \theta(x) = \frac {1}{1+e^{-\theta^Tx}}
我们也能将hθ(x)h _ \theta(x)解释为如下形式:
hθ(x)=P(y=1|x;θ)h _ \theta(x) = P(y=1|x;\theta)
解释为:当给定xx,概率参数为θ\theta时,y=1y=1的概率.
对于二元分类问题来说y=0y=0和y=1y=1是对立事件,所以y=0y=0的概率就是1−P(y=1|x;θ)1-P(y=1|x;\theta).
决策边界(Decision boundary)
决策边界是决策函数的一个属性,由参数决定,能根据参数将样本分为不同类别的边界.为了更好的理解决策边界,现在我们考虑逻辑函数g(z)g(z)的对称性.通常,我们会将阀值设定在0.5,也就是说当hθ(x)≥0.5h _ \theta(x) \ge 0.5时y=1y=1.
其实,也就是当hθ(x)≥0h _ \theta(x) \ge 0时 y=1y=1.
代价函数(Cost Function)
对于线性回归来说:J(θ)=1m∑i=1m12(hθ(x(i))−y(i))2=1m∑i=1mCost(hθ(x(i)),y(i))
\begin{align}
J(\theta) & = \frac {1}{m} \sum _ {i = 1} ^ { m } \frac {1} {2}(h _ \theta ( x^{(i)} ) - y ^ {(i)})^2 \\
& = \frac {1}{m} \sum _ {i = 1} ^ { m } Cost(h _ \theta ( x^{(i)} ), y ^ {(i)})
\end{align}
代价函数可以方便的表示为:
Cost(hθ(x),y)=12(hθ(x),y)
Cost(h _ \theta ( x ), y ) = \frac {1} {2} (h _ \theta ( x ) , y)
我们为什么不能直接套用线性回归的代价函数?因为我们期望代价函数能得到一个最小的值,但线性回归的代价函数是非凸函数(Non-convex),如左图,有多个局部最小值.我们期望能得到右图.
那么逻辑回归的代价函数应该设计成什么样呢?
Cost(hθ(x),y)={log(hθ(x)−log(1−hθ(x))(if y=1)(if y=0)}
Cost(h _ \theta (x) , y) = \big\lbrace
\begin{array}
-log(h _ \theta(x)&(if\ y=1) \\
-log(1 - h _ \theta(x))&(if\ y=0)
\end{array}
\big\rbrace
假设有个目标的x→0x \to 0,我们预测为1,但事实上却相反,那这个算法就会收到较大的惩罚.反之亦然.
但是有处于中部的预测错误,我们就不会受到较大惩罚.
为了方便编写,我们可将CostCost函数转换成:
Cost(hθ(x),y)=−y log(hθ)−(1−y)log(1−hθ(x))
Cost( h _ \theta (x), y ) =
-y\ log(h _ \theta) - (1-y)log(1-h _ \theta(x))
所以
J(θ)=1m∑i=1mCost(hθ(x(i)),y(i))=−1m∑i=1my log(hθ)+(1−y)log(1−hθ(x))
\begin{align}
J(\theta)
& = \frac {1}{m} \sum _ {i = 1} ^ { m } Cost(h _ \theta ( x^{(i)} ), y ^ {(i)})\\
& = - \frac {1}{m} \sum _ {i=1} ^ {m} y\ log(h _ \theta) + (1-y)log(1-h _ \theta(x))
\end{align}
逻辑回归的梯度下降
梯度下降算法:repeatuntilconvergence{θj:=θj−α∂∂θjJ(θ0,θ1)(for j:n,n=2)}
\begin{array}{l}
repeat\;until \; convergence \{ \\
\qquad
\theta _ j := \theta _ j - \alpha \frac{\partial}{\partial\theta _ j}J(\theta _ 0,\theta _ 1) (for\ j : n,n=2) \\
\}
\end{array}
带入待解函数后可化简为
repeatuntilconvergence{θj:=θj−α1m∑i=1m(hθ(x(i))−y(i))x(i)j(for j:n)}
\begin{array}{l}
repeat\;until \; convergence \{ \\
\qquad \theta _ j := \theta _ j - \alpha\frac{1}{m} \sum^m _ {i=1}( h _ \theta(x^{(i)})-y^{(i)})x _ j^{(i)} (for\ j : n) \\
\}
\end{array}
惊奇(?)的发现,里面的公式其实没有变!
其实改变的只有hθ(x) h _ \theta(x) 函数.
特征缩放
线性回归的特征缩放是有效的!其他参数求取方法
Conjugate gradient共轭梯度法BFGS(变尺度法)
L-BFGS(限制变尺度法)
优点:
不需要手动选择学习率α\alpha(通过线性搜索选择)
比梯度下降快
Octave中使用函数:
fminunc(无约束最小化函数):
-- Function File: fminunc (FCN, X0) -- Function File: fminunc (FCN, X0, OPTIONS) -- Function File: [X, FVAL, INFO, OUTPUT, GRAD, HESS] = fminunc (FCN, ...)Octave:
具体用法
##定义代价函数 function [jVal, gradient] = costFunction(theta) #... options = optimset( 'GradObj', 'on', 'MaxIter', '100'); initialTheta=zeros(2,1); [optTheta, functionVal, exitFlag] ... = fminunc(@costFunction, initalTheta, option;
options 解释:
梯度下降
打开
最大迭代次数
100次
exitFlag:
如果为1就是收敛了,具体查阅手册.
解决多类别分类问题(Multi-class classification)
思想: 把多类别分类转化为多次逻辑回归,也就是每次分为两类,一类为本次所选取的类,另一类为剩下的(One-vs-Rest).最后我们能得到K(种类个数)个逻辑分类器.也就可以得到每一种可能性的概率了,通常我们取最大的那个作为结果.
相关文章推荐
- 【Android】Eclipse自动编译NDK/JNI的三种方法
- C++学习笔记——第12章 继承
- 从此不求人:自主研发一套PHP前端开发框架(9)
- Bestcoder #47 B Senior's Gun
- Timer与TimerTask的真正原理&使用介绍
- why we need virtual key word
- Android Data Binding框架指南
- Linux网络配置之二ip、ss、网络相关配置文件
- boost 与 string 的应用
- lintcode:Subsets II
- J2EE轻量级框架--3.26学习心得
- ansible解密
- The Suspects 简单的并查集
- hybrid app
- poj1185(状态压缩dp)
- Github简单教程--入门
- php的分页查询建立分页类
- Python实现一个简单的Feistel结构的密码算法
- eclipse设置打印GC
- app证书