Logistic回归是机器学习中非常经典的一个方法,主要用于解决二分类问题,它是多分类问题softmax的基础,而softmax在深度学习中的网络后端做为常用的分类器,接下来我们将从原理和实现来阐述该算法的思想。

1.原理

a.问题描述

考虑二分类问题,利用回归的思想,拟合特征向量到类别标签的回归,从而将分类问题转化为回归问题,通常通过引入Logistic平滑函数实现。

假设已知训练样本集\(D\)的\(n\)个样本\(\{(x_{i},t_{i})| i=1,...,n\}\) ,其中\(t_{i}\in \left \{ 0,1 \right \}\) 为类别标签,\(x_{i} \in R^{d}\) 为特征向量。

b.Logistic函数

Logistic回归需要用到一个重要的Logistic函数,又称为Sigmod函数,Logistic的重要作用就是通过它建立了特征和类别概率的拟合关系,其形式如下:

\(f\left ( x \right )=\frac{1}{1+exp(-x)}\)

对应的图如下所示:

Logistic函数具有以下两个重要的性质:

i:    \(f(-x)=1-f(x)\)

ii:    \({f}'(x)=f(x)f(-x)=f(x)(1-f(x))\)

c.目标函数

根据Logistic函数,Logistic回归的回归函数为

\(g(x)=\frac{1}{1+exp(w^{\mathit{T}}x)}\)

其中\(w\) 为回归参数。

我们使用到极大似然估计法,因此需要构造关于每个已知样本  \(\left ( x_{i},t_{i} \right )\)的概率密度:

\(P(x_{i},t_{i};w)=\left\{\begin{matrix}
g(x_{i}),t_{i}=1 &\\
1-g(x_{i}),t_{i}=0  &
\end{matrix}\right.=g(x_{i})^{t_{i}}g(x_{i})^{(1-t_{i})}\)

可进一步表示为:

\(P(x_{i},t_{i};w)=g(x_{i})^{t_{i}}(1-g(x_{i})^{(1-t_{i})}\)

有了以上的定义,我们的目标是希望通过寻找合适的\(w\),使得每个样本点的似然概率最大,因此接下来就是构造似然函数,然后通过似然函数构造目标函数。

似然函数的构造的思路是假设样本独立前提下,期望每个样本的似然概率最大,换句话而言就是期望所有样本的似然概率乘积最大,即:

\(p(D|w)=\prod_{i=1}^{n}g(x_{i})^{t_{i}}(1-g(x_{i})^{(1-t_{i})}\)

以上乘积通常求导数非常的困难,容易引入关联的变量,通常通过取负对数(-ln)来将乘积转化为求和,以及最大化转化为最小化形式(最优化问题通常转化为最小化问题),因此上述问题可转化为:

\(E(w)=-\left [ \sum_{i=1}^{n} t_{i}ln(g(x_{i})+(1-t_{i})ln(1-g(x_{i}) \right ]\)

以上公式即为目标函数了。

d.优化算法

该优化问题采用Newton-Raphson迭代优化,迭代公式为:

\(w^{new}=w^{old}-\mathbf{H}^{-1}\triangledown E(w)\)

其中\(\mathbf{H}\)为\(E(w)\) 关于\(w\)的二阶导数矩阵。

\(\triangledown E(w)=\sum_{i=1}^{n}(y_{i}-t_{i})x_{i}=\mathbf{X}^{T}(\mathbf{y}-\mathbf{t})\)

\(\mathbf{H}=\triangledown\triangledown E(w)=\sum_{i=1}^{n}y_{i}(y_{i}-t_{i})x_{i}x_{i}^{T}=\mathbf{X}^{T}\mathbf{A}\mathbf{X}\)

其中\(\mathbf{A}\)为正定矩阵,即:

\(\mathbf{A}=\begin{bmatrix}
g(x_1)(1-g(x_1)) & 0 & \cdots & 0\\
0 & g(x_2)(1-g(x_2)) & \cdots & 0\\
\cdots & \cdots & \ddots & \cdots\\
0 & 0 & \cdots & g(x_n)(1-g(x_n))
\end{bmatrix}\)

由于\(\mathbf{A}\)为正定,因此\(\mathbf{H}\)也为正定矩阵。注意,\(g(x_i)\)的计算基于上一次的估计参数\(w^{old}\)来代入Logisti回归函数求解。

2.实现

我们举一个例子,并通过python编程求解它。问题描述为:一门考试,20位考生花费0~6小时备考。现在希望获悉备考时长与是否通过考试的关系,数据如下表格所示:

数据的解释变量仅仅为1维的学习时间,回归参数为2维向量。拟合的结果为:

\(g(time)=\frac{1}{1+exp(1.5046\cdot time-4.0777)}\)

拟合的效果图如下所示:

\(w\)迭代的梯度变化非常快,五次就能达到非常好的结果,如下所示:

[ 4.54704357]
[ 0.19111694]
[ 0.2380104]
[ 0.01743344]
[ 8.45306379e-05]
[ 1.95907862e-09]
[ 1.90137901e-16]
[ 1.90137901e-16]
[ 1.90137901e-16]
[ 1.90137901e-16]

我们使用了python实现Logistic回归,注意:我们这里对\(\mathbf{H}\)是直接的求逆,如果特征维度很高的情况下,这会消耗较大的计算亮,因此我们可以采用更有效的求解方法,如Cholesky分解法,最后贴上马农最爱的代码:

import numpy as np
from matplotlib import pyplot as plt class LogisticClassifier:
def __init__(self):
print("init"); def logistic(self,Xa,wa):
val = 1/(1+np.exp(-Xa.dot(wa)));
return val; def train(self,X,t,iter_num):
print("start to training");
Xa = np.array(X)
xsize = Xa.shape
dim = xsize[1]+1
num = xsize[0]
Xa = np.c_[Xa,np.ones([num,1])] ta = np.array(t) print dim,num
wa = 0.5*np.ones([dim,1])
for it in range(iter_num):
ya = self.logistic(Xa,wa)
deriv_wa = Xa.T.dot(ya-ta)
R = np.diag((ya*(1-ya)).flat)
H = Xa.T.dot(R).dot(Xa)
delta_w = np.linalg.inv(H).dot(deriv_wa)
wa = wa - delta_w;
print np.linalg.norm(delta_w.T, 2, 1)
#print wa
return wa if __name__ == "__main__":
print ('This is main of module "hello.py"') logCls = LogisticClassifier();
#construct data
X = [[0.5],[0.75],[1],[1.25],[1.5],[1.75],[1.75],[2],[2.25],[2.5],[2.75],[3],[3.25],[3.5],[4],[4.25],[4.5],[4.75],[5],[5.5]]
t = [[0],[0],[0],[0],[0],[0],[1],[0],[1],[0],[1],[0],[1],[0],[1],[1],[1],[1],[1],[1]]
iter_num = 10;
#training weight
w = logCls.train(X, t, iter_num)
print ("learned weight:\n")
print w #draw and show the result
pos_t = [x for i, x in enumerate(t) if x == [1]]
pos_X = [X[i] for i, x in enumerate(t) if x == [1]]
neg_t = [x for i, x in enumerate(t) if x == [0]]
neg_X = [X[i] for i, x in enumerate(t) if x == [0]] plt.scatter(pos_X,pos_t,color="r",marker='o',s = 100)
plt.scatter(neg_X,neg_t,color="g",marker='o',s = 100) Xfitted = np.array(np.linspace(0,6,100))
XfittedC = np.c_[Xfitted,np.ones([100,1])]
Yfitted = logCls.logistic(XfittedC, w)
plt.plot(Xfitted.flat,Yfitted.flat,color="b",linewidth= 5) #reset the axes
ax = plt.gca()
#no bonding box
ax.spines['top'].set_color('none')
ax.spines['right'].set_color('none')
#set as zero
ax.xaxis.set_ticks_position('bottom')
ax.spines['bottom'].set_position(('data',0.5))
ax.yaxis.set_ticks_position('left')
ax.spines['left'].set_position(('data',3)) plt.xlabel("X",fontsize="xx-large")
plt.ylabel("t",fontsize="xx-large")
plt.title("Logistic method,learned weight:[%f,%f]"%(w[0],w[1]),fontsize="xx-large")
plt.legend(["Fitted function","Postive Samples","Negative Samples"],fontsize="xx-large",loc='upper left');
plt.show()

 3.参考资料

[1].Logistic回归与梯度下降法[2].Logistic回归与牛顿迭代法

 

												

机器学习(1):Logistic回归原理及其实现的更多相关文章

  1. [机器学习实战-Logistic回归]使用Logistic回归预测各种实例

    目录 本实验代码已经传到gitee上,请点击查收! 一.实验目的 二.实验内容与设计思想 实验内容 设计思想 三.实验使用环境 四.实验步骤和调试过程 4.1 基于Logistic回归和Sigmoid ...

  2. 机器学习之logistic回归算法与代码实现原理

    Logistic回归算法原理与代码实现 本文系作者原创,转载请注明出处:https://www.cnblogs.com/further-further-further/p/10033567.html ...

  3. 机器学习之Logistic 回归算法

    1 Logistic 回归算法的原理 1.1 需要的数学基础 我在看机器学习实战时对其中的代码非常费解,说好的利用偏导数求最值怎么代码中没有体现啊,就一个简单的式子:θ= θ - α Σ [( hθ( ...

  4. 机器学习5—logistic回归学习笔记

    机器学习实战之logistic回归 test5.py #-*- coding:utf-8 import sys sys.path.append("logRegres.py") fr ...

  5. logistic回归原理和公式

    转自:http://blog.csdn.net/ariessurfer/article/details/41310525 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...

  6. 机器学习算法-logistic回归算法

    Logistic回归算法调试 一.算法原理 Logistic回归算法是一种优化算法,主要用用于只有两种标签的分类问题.其原理为对一些数据点用一条直线去拟合,对数据集进行划分.从广义上来讲这也是一种多元 ...

  7. 机器学习笔记—Logistic回归

    本文申明:本系列笔记全部为原创内容,如有转载请申明原地址出处.谢谢 序言:what is logistic regression? Logistics 一词表示adj.逻辑的;[军]后勤学的n.[逻] ...

  8. Logistic回归原理及公式推导[转]

    原文见 http://blog.csdn.net/acdreamers/article/details/27365941 Logistic回归为概率型非线性回归模型,是研究二分类观察结果与一些影响因素 ...

  9. 转载:Logistic回归原理及公式推导

    转载自:AriesSurfer 原文见 http://blog.csdn.NET/acdreamers/article/details/27365941 Logistic回归为概率型非线性回归模型,是 ...

随机推荐

  1. Javascript中的Callback方法浅析

    什么是callback?  回调函数就是一个通过函数指针调用的函数.如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用为调用它所指向的函数时,我们就说这是回调函数.回调函数不是由该函数 ...

  2. 一文看懂python主要应用领域或应用场景

    Python简介 Python(英国发音:/ˈpaɪθən/美国发音:/ˈpaɪθɑːn/),是一种面向对象的解释型计算机程序设计语言,由荷兰人GuidovanRossum于1989年发明,第一个公开 ...

  3. 牛客红包OI赛 B 小可爱序列

    Description 链接:https://ac.nowcoder.com/acm/contest/224/B 来源:牛客网 "我愿意舍弃一切,以想念你,终此一生." " ...

  4. (二) solr 索引数据导入:xml格式

    xml 是最常用的数据索引格式,不仅可以索引数据,还可以对文档与字段进行增强,从而改变它们的重要程度. 下面就是具体的实现方式: schema.xml的字段配置部分如下: <field name ...

  5. 使用Emacs:帮助篇

    当你打开emacs并认真阅读“快速指南”后,你已经知道用C-x C-f打开文件,用C-x C-s保存文件,用C-x C-c退出emacs,可以在emacs中生存了.这里把Tutorial.cn中出现的 ...

  6. 多线程-TaskExecutor-使用Demo

    BasicExecute.java package com.jef.executeTest; public abstract class BasicExecute extends Thread { @ ...

  7. 使用spring-boot-maven-plugin插件打包spring boot项目

    在spring-boot项目中使用spring-boot-maven-plugin插件进行打包,输出可执行JAR包.项目包含多个模块,当打完包后在本地的maven仓库中发现输出的可执行JAR非常小,并 ...

  8. Wpf使用Winform控件后Wpf元素被Winform控件遮盖问题的解决

    有人会说不建议Wpf中使用Winform控件,有人会说建议使用Winform控件在Wpf下的替代方案,然而在实际工作中由于项目的特殊需求,考虑到时间.成本等因素,往往难免会碰到在WPF中使用Winfr ...

  9. 002 Ajax中传输格式为HTML

    一: 1.介绍 返回的数据可以直接插入到需要的地方. 2.优缺点 二:程序大纲 1.结构 三:程序 1.css body { background: #ffb url("logo.png&q ...

  10. 牛客网 桂林电子科技大学第三届ACM程序设计竞赛 C.二元-K个二元组最小值和最大-优先队列+贪心(思维)

    链接:https://ac.nowcoder.com/acm/contest/558/C来源:牛客网 小猫在研究二元组. 小猫在研究最大值. 给定N个二元组(a1,b1),(a2,b2),…,(aN, ...