Logistic回归---机器学习算法之四
2015-09-02 13:40
253 查看
Logistic回归
本博客介绍Logistic回归算法,代码实现基于python:简单概念介绍
sigmoid函数
数学模型的建立
*
最大似然函数
pynum函数说明
代码实现
总结
简单概念介绍
假设现在有一些数据点,我们用一条直线对这些点进行拟合(该线称为最佳拟合直线),这个拟合过程就称为回归。训练分类器就是为了寻找最佳拟合参数,使用的是最优化算法。该直线也就是所谓分类超平面(二维坐标下是一条直线,三维坐标下是一个平面,n维坐标下是(n-1)维平面)Logistic回归针对是二分类问题
sigmoid函数
我们想要的函数应该能够预测输入数据的所属类别,比如函数输出0或者1.要满足这个条件,很自然的想到了单位阶跃函数,但是该函数是从0瞬间跳跃到1,这个跳跃的变化点难以把握。所以我们一般用sigmoid函数来代替
从图像可以看出,x=0的时候,函数值为0.5,随着x的增大,无限接近1,x减小,无限接近0,所以分类标准如下:
函数值大于0.5,属于类别1
函数值小于0.5,属于类别0
因为分类的样本有多个属性或者特征,所以x=
, 通常我们会给每一个特征乘上一个权重系数
所以上述公式变为
其中
。我们重写方程如下:
数学模型的建立
有了上述决策函数,决策面就是Z=0, 也就是θTx=0,那么接下来的问题就是如何确定回归系数,也就是上述函数中的θ的值。这里介绍几个小概念,详细内容可以查阅相关文件:
梯度的方向:函数值变大的方向
梯度上升算法:求取极大值
梯度下降算法:求取极小值
一般函数如果非凸,那么很难求取全局的极值,有可能是局部的极值,因为非凸函数有多次起伏
简单判断函数凹凸形:f(x)的二阶导数>0,则f(x)是凹函数
凸函数的定义
假设f(x)在[a,b]上连续,若对于任意的x1,x2∈[a,b],恒有
f[(x1+x2)/2]≥[f(x1)+f(x2)]/2,则称f(x)在[a,b]上是凸函数
凹函数的定义
假设f(x)在[a,b]上连续,若对于任意的x1,x2∈[a,b],恒有
f[(x1+x2)/2]≤[f(x1)+f(x2)]/2,则称f(x)在[a,b]上是凹函数
接下来的问题就是寻找代价函数。从上述sigmoid的图像可以知道,h(x)的值越接近0或者1分类效果越好,所以代价函数就是:
(观察值和估计值的差值平方)
我们的目的是最小化这个值,但是因为h(x)是非凸的,所以还应该重新选择代价函数
注意到这样一个问题,此处我们已经知道样本的类别,也就是事件已经发生,这时候我们需要估计出一组θ值,使得这事件发生的概率最大,这就是最大似然估计(详细内容可以查看相关资料)
根据求解最大似然估计的步骤,我们需要写出似然函数。
我们知道hθ(x)≥0.5<后面简用h>,此时y=1, 小于0.5,y=0. 那么我们就用h作为y=1发生的概率(可以这个理解,在x取某一组固定值的情况下,属于类别1的概率,因为此时h的值大于0.5,也符合概率较大,比如为0.9),那么当y=0时,h<0.5,此时不能用h作为y=0的概率,<因为最大似然的思想使已有的数据发生的概率最大化,小于0.5太小了>,我们可以用1-h作为y=0的概率,这样就可以作为y=0的概率了,,然后只需要最大化联合概率密度函数就可以了。
转换成对数似然函数:
因为这个方程无法求得确切的解,所以只能采用迭代优化算法,似然函数是求最大值,所以采用梯度上升算法,求导过程:
上述方程少了一个求和符号,所以完整的迭代方式为:
如果是随机的迭代算法,就不需要求和(也就是整体样本迭代),每次选择一个样本进行迭代:
其中α是一个极小的正值,表示迭代步长。
pynum函数
这里简单说明一下代码中用到的pynum的函数mat:将数组转化成矩阵(永远是2维的。注意转换后的乘法等运算规则覆盖了数组的,遵循数学上的矩阵运算法则。mat是ndarray的子类)
tranpose:对数组或者矩阵重新排列,如果transpose()没有指明第二个参数的值,那么就是交换两个轴,如果指明了参数,比如三个轴的情况下,指明参数为(1,0,2),该参数的意思是按照这个顺序交换某一元素的索引,举例来说,比如8这个元素的索引为(0,1,0),执行tranpose后,索引变为(1,0,0),即交换了前两个轴的索引。
pynum轴的概念(axes): 最外层的是轴0,轴0里面包含的是第二层轴,也就是轴1,
getA():将matrix转换成数组
代码实现
声明
本博客的公式部分引用了机器学习实战笔记5(logistic回归) 这篇博文,特此声明相关文章推荐
- 安卓读取本机大图片
- 2015多校联合第三场 hdu5317 RGCDQ
- Cocos2d-x----------------------------------ProgressTimer进度条
- Tiny4412中断介绍
- CLR via C#(01)-.NET平台下代码是怎么跑起来的
- 转帖-linux文件系统
- 记录自己的编程记录
- jackson annotations注解详解
- python cookbook:第一章 数据结构和算法
- GNS3模拟cisco7200与实体系统联网、启动telnet、SSH2,具体操作留存
- apk防止反编译
- iOS TableView实现上拉加载更多数据
- 共享bean
- 2015年下半年的关注点
- java多选框改成左右多选下拉框
- 程序猿讨厌没有价值的任务
- 微店2016——判断给定的字符串是否是整数
- 从键盘输入字符串并输出该字符串(汇编程序)
- XCode 常用快捷键
- POJ 3150 Cellular Automaton(矩阵快速幂)