04-逻辑回归

问题描述

现在有一份数据,$x_i$是数据的特征,y是分类0或1,这是一个二分类问题。我们希望训练一个模型,当有新的数据的时候,判断数据的分类是0,还是1。

x1 x2 y
-0.017612 14.053064 0
-1.395634 4.662541 1
-0.752157 6.538620 0
-1.322371 7.152853 0
0.423363 11.054677 0
0.406704 7.067335 1
0.667394 12.741452 0
-2.460150 6.866805 1
0.569411 9.548755 0
-0.026632 10.427743 0
... ... ...

这里的数据只有两个特征值,我们可以在二维图像上画出来。如下图,如果只有两个特征,而数据是线性可分的就可以用一条直线将数据划分开来。如果不止两个特征呢?如果有更多的特征,比如有k个,那么在k维的空间中线性可分的数据也会有一个超平面可以将数据分割开来。
  那么这个超平面可以表示为$z = w_1x_1+w_2x_2+w_3x_3+....+w_kx_k + b$,如果用向量表示则可以写成$z=w^T x + b$


数据点
数据点

预备知识

sigma函数

我们需要一个函数输出0和1来预测类别,理想状态下单位阶跃函数符合这个需求,
$$f(x) = \left{
\begin{aligned}
0 & = & x < 0 \
0.5 & = & x = 0 \
1 & = & x > 0
\end{aligned}
\right.$$
  但是后续的计算需要这个函数是一个可微的函数,显然单位阶跃函数不符合这个需求 ,我们希望能找到一个近似单位阶跃函数并且连续可微的函数,simga函数有很好的性质符合我们的需求。
$$\sigma(z) = \frac{1}{1+e^{-z}}$$
  当输入z=0时,返回0.5,当z越大,$\sigma$逼近1,当z减小$\sigma$逼近0,


两种尺度下的sigma函数,当尺度足够大时,sigma看起来就像阶跃函数
两种尺度下的sigma函数,当尺度足够大时,sigma看起来就像阶跃函数

两种尺度下的sigma函数,当尺度足够大时,sigma看起来就像阶跃函数
$\sigma(z) = \frac{1}{1+e{-z}}$的输入为z,而$z=wT x$ ,那么现在问题就变成,怎么找到最优的$w$,这里我们把$w$称为回归系数。
  将$z=w^T x$带入$\sigma(z)$得到
$$h_w(x) = \frac{1}{1+e{wT x + b}}$$
  上式可以转换为 $$ln(\frac{h_w(x)}{1-h_w(x)}) = w^Tx + b$$
  若将 y 视为样本 x 作为正例的可能性,则 1-h_w(x) 是其反例可能性,两者的比值$\frac{h_w(x)}{1-h_w(x)}$,称为"几率" (odds) ,反映了 m 作为正例的相对可能性.对几率取对数则得到
"对数几率" (log odds,亦称 logit),$ln(\frac{h_w(x)}{1-h_w(x)})$

由此可看出,上式实际上是在用线性回归模型的预测结果去逼近,真实标记的对数几率,因此,其对应的模型称为"对数几率回归" (logistic regression,亦称 logit regression) .特别需注意到,虽然它的名字是"回归",但 实际却是一种分类学习方法.这种方法有很多优点,例如它是直接对分类可能 性进行建模,无需事先假设数据分布?这样就避免了假设分布不准确所带来的 问题;它不是仅预测出"类别",而是可得到近似概率预测,这对许多需利用概 率辅助决策的任务很有用;此外,对率函数是任意阶可导的凸函数,有很好的数学性质,现有的许多数值优化算法都可直接用于求取最优解.

若将式 (3.18) 中的 y 视为类 后验概率估计 $p(y =1|x)$ , 则
$$ln(\frac{p(y=1|x)}{p(y=0|x)}) = w^Tx+b$$
显然
$$p(y=1|x) = h_w(x)$$
$$p(y=0|x) = 1-h_w(x)$$
  于是可以通过极大似然法来估计w和b,对率回归模型最大化"对数似然" (loglikelihood)
$$l(w) = \sum^m_{i=1}(y_ilogh_w(x_i) +(1-y_i)log(1-h_w(x_i)) )$$
  好了我们现在的目标就是求得系数w使得$l(w)$最大。

基于最优化方法确定回归系数

梯度下降求最小值

现在我们使用最优化方法中的梯度下降法来寻找最优回归系数。梯度下降法的思想是:要找到某个函数的最小值,最好的方法是沿着该函数的某一点上减少最快的方向,及梯度方向寻找。
1.梯度
  那么梯度怎么得到呢?增长最快的方向,在单变量的函数(如$f(x)=3x^2+4x+1$这样的函数)上就是导数。但是我们的函数有n个变量,这时需要计算函数的偏导数,用$\bigtriangledown f(x_1,x_2)$表示偏导数。
2.梯度下降
   一开始可以赋予$w$一个随机值,然后在每次迭代的时候将$w$向变化最快的方向移动就可以。用向量表示的话可以写成$w = w - \alpha \bigtriangledown_w f(w)$,$\alpha$控制了每次变化的大小。变化了流程如下图所示。


enter description here
enter description here

回头看之前的似然函数
$$l(w) = \sum^m_{i=1}(y_ilogh_w(x_i) +(1-y_i)log(1-h_w(x_i)) )$$
  现在需要计算w的梯度。
$$ \begin{aligned}
\frac{ \delta (l(w))}{\delta w} &= -\frac{1}{m}\frac{ \delta (\sum^m_{i=1}(y_ilogh_w(x_i) +(1-y_i)log(1-h_w(x_i)) ))}{\delta w} \
&= -\frac{1}{m}\sum^m_{i=1}(y_i \frac{1}{h_w(x_i)} +(1-y_i)\frac{1}{1-h_w(x_i)} )\frac{\delta h_w(x_i) }{\delta w} \
&= -\frac{1}{m}\sum^m_{i=1}(y_i \frac{1}{\sigma(z(x_i))} +(1-y_i)\frac{1}{1-\sigma(z(x_i))} )\frac{\delta \sigma(z(x_i))}{\delta w} \
&= -\frac{1}{m}\sum^m_{i=1}(y_i \frac{1}{\sigma(z(x_i))} +(1-y_i)\frac{1}{1-\sigma(z(x_i))} )(1-\sigma(z(x_i)) \sigma(z(x_i))\frac{\delta z(x_i) }{\delta w} \
&= -\frac{1}{m}\sum^m_{i=1}(y_i (1-\sigma(z(x_i))) +(1-y_i)(\sigma(z(x_i))) )x_i \
&= -\frac{1}{m}\sum^m_{i=1}(y_i - \sigma(z(x_i)) )x_i \
&= \frac{1}{m}\sum^m_{i=1}(h_w(x)-y_i)x_i \
\end{aligned}$$

那么现在w的更新过程可以写成$w = w - \alpha \frac{1}{m} \sum(h_w(x_i)-y_i)x_i$,

实现

1.sigma函数
  输入X是numpy.array类型数据,可以直接按照向量化来计算

def simgoid(X):
    return 1.0 / (1.0 + exp(-X))

2.梯度上升
这里$w$初始化为1,$w = w - \alpha \frac{1}{m} \sum(h_w(x_i)-y_i)x_i$的计算将数据向量化计算。

def gradAscent(dataSet,labels):
    dataMat = mat(dataSet)
    labelMat = mat(labels).transpose()
    s = shape(dataMat)
    weights = ones((s[1],1))
    maxStep = 500
    alpha = 0.001
    for i in range(maxStep):
        h = simgoid(dataMat*weights)
        error = labelMat - h
        weights = weights + alpha*dataMat.transpose()*error
    return weights

完整代码

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容