逻辑回归的理解与python示例

逻辑回归(2018-11-4)

注:根据唐宇迪老师视频总结,如有侵权,请联系本人

一、逻辑回归相关概念

1.1逻辑回归解决的问题

之前一章分析了线性回归的解决方法,是通过误差的高斯分布来推演出的损失函数,但是存在数据样本是否符合分布的问题,在逻辑回归中.使用了sigmoid函数将线性问题转化为非线性的二分类任务,这样的好处是不用考虑误差分布,直接通过变换进行概率求解.

1.2 sigmoid函数

表达式:
g(z)=\frac{1}{1+e^{-z}} \tag{0}

特点:

  • 自变量取值为任意实数,值域[0,1].
  • 将任意的输入映射到[0,1]的区间,物理上可以解释为由值到概率的转换.
sigmiod函数

逻辑回归实现思想:

  • 定义预测函数(将线性函数代入sigmiod函数):
    h_{\theta}(x)=g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}} \tag{1}
    其中 \theta_{0}+\theta_{1}x_{1}+,...,\theta_{n}x_{n}=\sum^{n}_{i=1}\theta_{i}x_{i}=\theta^Tx.这里面的\theta_{i}x_{i}就是线性回归问题中的要求得函数.
    预测函数可以看做将函数y=\theta_{i}x_{i}转换到[0,1]区间上,以概率分布的模式表达结果.
    所以在分类任务中,可以假设以下公式成立:

P(y=1|x;\theta)=h_{\theta}(x) \tag{2}
P(y=0|x;\theta)=1-h_{\theta}(x) \tag{3}

将(2),(3)式合并后得到:
P(y|x;\theta)=h_{\theta}(x)^y(1-h_{\theta}(x))^{1-y} \tag{4}

1.3求解过程示例

根据(4)式求得似然函数L(\theta):
L(\theta)=\prod^{m}_{i=1}P(y_{i}|x_{i};\theta)=\prod^{m}_{i=1}h_{\theta}(x_{i})^{y_{i}}(1-h_{\theta}(x_{i}))^{1-y_{i}} \tag{5}

再对(5)式求对数似然,目的是将复杂度较高的乘法替换为简单的加法:
l(\theta)=logL(\theta)=\sum^{m}_{i=1}(y_{i}logh_{\theta}(x_{i})+(1-y _{i})log(1-h_{\theta}(x_{i}))) \tag{6}

  • 由于梯度是上升的,若求l(\theta)为最大值,则可以引入J(\theta)=-\frac{1}{m}l(\theta)转为求梯度下降的任务.自此,就可以通过梯度下降的方法获得近似解了.

求解过程:
l(\theta)=logL(\theta)=\sum^{m}_{i=1}(y_{i}logh_{\theta}(x_{i})+(1-y _{i}log(1-h_{\theta}(x_{i})))

J(\theta)中对\theta_{j}求偏导:
\frac{d}{d\theta_{j}}J(\theta)=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}\frac{1}{h_{\theta}(x_{i})}\frac{d}{d\theta_{j}}h_{\theta}(x_{i})-(1-y_{i})\frac{1}{1-h_{\theta}(x_{i})}\frac{d}{d\theta_{j}}h_{\theta}(x_{i}))\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup\frac{d}{d\theta_{j}}g(\theta^Tx_{i})\tag{7}

下面详细对\frac{d}{d\theta_{j}}g(\theta^Tx)的求导过程做解释:

  • 对于分数类导数,求导公式为:
    (\frac{u}{v})'=\frac{u'v-v'u}{v^2} \tag{9}
  • 由于
    (e^x)'=e^x\tag{9}
    \frac{dy}{dx}= \frac{dy}{du}\cdot\frac{du}{dx}\tag{10}
    所以对g(\theta^Tx)=\frac{1}{1+e^{-\theta^Tx}}求导的过程如下:
    (g(\theta^Tx))'=(\frac{1}{1+e^{-\theta^Tx}})'=\frac{1'\times(1+e^{-\theta^Tx})-(1+e^{-\theta^Tx})'\times1}{(1+e^{-\theta^Tx})^2}\\=\frac{0-(1+e^{-\theta^Tx})'}{(1+e^{-\theta^Tx})^2}=\frac{-1'-(e^{-\theta^Tx})'}{(1+e^{-\theta^Tx})^2}=\frac{-(e^{-\theta^Tx})(-\theta^Tx)'}{(1+e^{-\theta^Tx})^2}\\=(\frac{-(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2})(-\theta^Tx)'\\=(\frac{(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2})(\theta^Tx)' \tag{11}
    然而
    \frac{(e^{-\theta^Tx})}{(1+e^{-\theta^Tx})^2}=\frac{1+(e^{-\theta^Tx})-1}{(1+e^{-\theta^Tx})^2}=-g(\theta^Tx)^2+g(\theta^Tx)=g(\theta^Tx)(1-g(\theta^Tx)) \tag{12}

所以,结合(7),(11),(12)式,得出下式结论:

-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup\frac{d}{d\theta_{j}}g(\theta^Tx_{i})\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup(\frac{(e^{-\theta^Tx_{i}})}{(1+e^{-\theta^Tx_{i}})^2})(\theta^Tx_{i})'\\=-\frac{1}{m}\sum^{m}_{i=1}\lgroup y_{i}\frac{1}{g(\theta^Tx_{i})} -(1-y_{i})\frac{1}{1-g(\theta^Tx_{i})}\rgroup g(\theta^Tx_{i})(1-g(\theta^Tx_{i}))(\theta^Tx_{i})'\\=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}(1-g(\theta^Tx_{i}))-(1-y_{i})g(\theta^Tx_{i}))x_{i}^{j}\\=-\frac{1}{m}\sum^{m}_{i=1}(y_{i}-g(\theta^Tx_{i}))x_{i}^{j}\\=\frac{1}{m}\sum^{m}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j}\tag{13}
其中,x_{i}^{j}=\frac{d}{d\theta_{j}}(\theta^Tx_{i})

公式化简后,就可以使用梯度下降的方法对参数进行迭代更新,最终获得一个最优的\theta
\theta_{j+1}=\theta-\alpha\frac{1}{m}\sum^{m}_{i=1}(h_{\theta}(x_{i})-y_{i})x_{i}^{j} \tag{14}
其中 \alpha是步长,(13)式的结论是梯度下降的方向,最后求解\theta的最优解.

1.4python实例

数据:考试成绩,每组两门课,如果被录取则标记为1,未录取则为0.
目的:根据已有数据评估新数据是否会被录取.
思想:在已有数据上进行逻辑回归训练,获得理想的\theta值.

数据:

成绩1 成绩2 是否录取
34.623660 78.024693 0
30.286711 43.894998 0
35.847409 72.902198 0
60.182599 86.308552 1
79.032736 75.344376 1

简单起见,只取了代码中的五组数据,仅做示范.

step 1 构造sigmoid函数(根据(0)式)

def sigmoid(z):
    return 1 / (1 + np.exp(-z))

step 2 构造预测函数(根据(1)式)

def model(X, theta):

    return sigmoid(np.dot(X, theta.T))

step 3 构造损失函数(根据(1)式)

def cost(X, y, theta):
    left = np.multiply(-y, np.log(model(X, theta)))
    #print(left.shape)
    right = np.multiply(1 - y, np.log(1 - model(X, theta)))
    #print(right.shape)
    return np.sum(left - right) / (len(X))

step 4 求出\theta的梯度方向(根据(13)式)

def gradient(X, y, theta):
    grad = np.zeros(theta.shape)
    error = (model(X, theta)- y).ravel()
   
    for j in range(len(theta.ravel())): 
        term = np.multiply(error, X[:,j])
        grad[0, j] = np.sum(term) / len(X)
    
    return grad

step 5 运用梯度下降方法求得最优解(根据(14式))

def descent(data, theta,y,thresh,alpha):
    #梯度下降求解
    i = 0 # 迭代次数
    costs = [cost(data, y, theta)] # 损失值

    while True:
        grad = gradient(data, y, theta)
        theta = theta - alpha*grad # 参数更新
        costs.append(cost(data, y, theta)) # 计算新的损失
        i += 1 
        if i>thresh: break  
    return theta, i-1, costs, grad

step6 代入数据,进行运算

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

推荐阅读更多精彩内容