梯度下降法求解logisitic回归及其python代码实现

01 logisitic回归与梯度下降法
logisitic回归是因变量是分类的回归模型或算法,它实际上是一种分类方法,主要用于两分类问题(即输出只有两种,分别代表两个类别),所以利用了Logistic函数(或称为Sigmoid函数),函数形式为:

Paste_Image.png
其中,
z={\theta }_{0}{x }_{0}+{\theta }_{1}{x }_{1}+...+{\theta }_{n}{x }_{n}
z={\theta }_{0}{x }_{0}+{\theta }_{1}{x }_{1}+...+{\theta }_{n}{x }_{n}
,向量表示为:
Z={\Theta}^{T}X
Z={\Theta}^{T}X

梯度下降法则是一种最优化算法,它是用迭代的方法求解目标函数得到最优解,是在最小二乘法cost function(成本函数)的基础上,利用梯度迭代求出局部最优解。在这里关于梯度下降法不做过多介绍,相关资料已经很多且后边还会分析,对其的理解借用一位网友的描述吧:
梯度下降法被比喻成一种方法,一个人蒙着眼睛去找从山坡到溪谷最深处的路。 他看不到地形图,所以只能沿着最陡峭的方向一步一步往前走。每一步的大小(也就是梯度)与地势陡峭的程度成正比。 如果地势很陡峭,他就走一大步,因为他相信他仍在高出,还没有错过溪谷的最低点。如果地势比较平坦,他就走一小步。这时如果再走大步,可能会与最低点失之交臂。 如果真那样,他就需要改变方向,重新朝着溪谷的最低点前进。 他就这样一步一步的走啊走,直到有一个点走不动了,因为路是平的了,于是他卸下眼罩,已经到了谷底深处。
02 用梯度下降法求解logisitic回归
用梯度下降法求解logisitic回归的步骤为:
(1)构建损失函数
预测函数为:
函数hθ(x)的值有特殊的含义,它表示结果取1的概率,因此对于输入x分类结果为类别1和类别0的概率分别为:
(1)式综合起来可以写成:
取似然函数为:
对数似然函数为:
最大似然估计就是求使l(θ)取最大值时的θ,将J(θ)取为下式,即:
因为乘了一个负的系数-1/m,所以取J(θ)最小值时的θ为要求的最佳参数。
注:在这里为什么加了个系数-1/m,编者翻阅了相关资料,因为不加的话,说是不能用梯度下降法(而是梯度上升法),所以要加负号,而1/m代表了样本平均。
最终得到:
(2)梯度下降法求解最小值
采用与线性回归中一样的梯度下降法来确定θ的值,即设置一个合适的学习率α之后,同步更新所有j=1 to n:

θ更新过程可以写成:
重复更新步骤,直到损失函数的值收敛为止。
03 python代码的实现
在这里采用了python2.7 版本,并分为两大步骤:构建梯度下降法函数与创建数据函数。而经过上面的推导,对我们编程最有用的不是那些过程,而是得到的结果,即最后一个公式,因此,将围绕最后得到的梯度下降法求解公式来构建函数。

-*- coding: UTF-8 -*-
import numpy as np #科学计算(矩阵)包
import random #生成随机数的包

#梯度下降算法函数,x/y是输入变量,theta是参数,alpha是学习率,m是实例,numIterations梯度下降迭代次数
def gradientDescent(x, y, theta, alpha, m, numIterations):
    xTrans = x.transpose() #矩阵转置
    #在1-numIterations之间for循环
    for i in range(0,numIterations):
        hypothesis = np.dot(x,theta) #矩阵相乘
        loss = hypothesis - y #预测值减去实际值
        # avg cost per example (the 2 in 2*m doesn't really matter here.
        # But to be consistent with the gradient, I include it)
        cost = np.sum(loss **2)/(2 * m)
        #成本函数:loss方差的平均加总,在这里采用了常用的成本函数,而非logistic特有的
        print("Iteration %d | Cost: %f" % (i, cost))
        # avg gradient per example
        gradient = np.dot(xTrans, loss) / m  #计算梯度
        # update
        theta = theta - alpha * gradient #参数theta的计算,即更新法则
    return theta


#创建数据,numPoints实例数,bias加一些偏倚或偏差,variance:方差
def genData(numPoints,bias,variance):
    x = np.zeros(shape=(numPoints,2)) #生成0矩阵,shape表示矩阵的形状,参数1是行,后边是列
    y = np.zeros(shape=(numPoints))
    #对x、y的0矩阵填充数值
    for i in range(0,numPoints):
        x[i][0] = 1 #第i行第1列全部等于1
        x[i][1] = i  # 第i行第2列等于i
        y[i] = (i + bias) + random.uniform(0,1) * variance # 第i行第2列等于i+bias(偏倚),再加,0-1的随机数,以及方差
    return x, y

x, y  = genData(100, 25, 10) #传入参数
print "x:"
print x
print "y:"
print y
m, n = np.shape(x) #检查x的行列数,是否一致
numIterations = 100000
alpha = 0.0005  #学习率,不能太大也不能太小
theta = np.ones(n) #初始化
theta = gradientDescent(x, y, theta, alpha, m, numIterations)
print(theta)

可以根据不同的数据,利用gradientDescent()函数来求解。

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

推荐阅读更多精彩内容