基于Logistic回归的二元分类应用(含公式推导)

一、 关于回归

在分类中问题中,如果给定一个输入,其所产生的输出是一个布尔值,那么这是是与否型的答案;而在输出是数值型的值下,我们所希望的学习结果不是C={0, 1},而是一个连续的函数。我们倾向于将数值的输出写成关于输入的函数,数值输入称为自变量,数值输出称为因变量。我们希望通过对训练数据集学习后得出一个类似下面的函数关系式(这里以简单线性为例)。

在二元分类中,我们需要一个这样的函数:它能够接收所有的输入并能预测类别,即0或1。Sigmoid函数正是我们需要的函数,
sigmoid函数
它具有以下性质:
a、函数输入为0时,Sigmoid结果为0.5。
b、随着输入x值的增大,Sigmoid函数接近1,随着x的减小,其值接近于0。
我们将上面拟合得到函数g(x)代入Sigmoid函数中,若g(x)输出值大于0时,Sigmoid函数结果大于0.5,g(x)值小于0时,Sigmoid函数小于0.5。这样Sigmoid函数把g(x)函数值转为为后验概率,也即Sigmoid函数大于0.5概率时,我们将X类标标记为1,而概率小于0.5时,X类标记为0。
sigmoid函数值越大,我们越有把握将X正确地分类。
二、寻找最佳拟合曲线


针对g(x)函数回归系数的求解,我们使用梯度上升优化法多次迭代求出最佳参数。
所谓梯度是指多元函数在某一点处的一阶偏导数向量。一个梯度应用直观理解的例子是热传导问题,物体温度沿着各个方向传播速度是不相同的,那么沿着哪条方向温度变化率是最小或最大的呢?还有是在爬山过程中,我们朝着哪个方向迈出一步上升的幅度最大呢?答案是沿着梯度的方向,温度变化率最大、迈出一步上升幅度最大。梯度上升法用于求解最大值,梯度下降法用于求解最小化问题。
基于上面提到的理论,我们在训练数据集中经过多次迭代后求解出最佳拟合参数,之后便能够在测试数据集中预测类别。

三、公式推导




四、更新回归系数


根据以上计算得出的梯度公式,我们每次迭代更新回归系数W公式为:

更新回归系数

alpha为学习因子(learning factor)或者称为步长(stepsize),该参数决定每次沿梯度方向移动多少。alpha值选择很重要,如果alpha值偏大,则可能导致函数摆动甚至发散,如果偏小,使得函数收敛速度很慢,计算开销偏大。同时,运用梯度方法求解最优化问题,最终结果可能不一定是全局最优,可能只是局部最优解。因为,在使用梯度方法优化过程中,它寻找的是最近的一个极值点,因此来说,函数仅存在一个极值点时才能达到全局最优。
求解最优化问题,梯度方法较为简单,但结果相当有效。我们还需注意的是标准梯度上升法在每次更新回归系数W时,都要遍历整个数据集,当数据规模很大情况下,内存开销和计算量很大。下面介绍一种在线学习算法--随机梯度上升法。
随机梯度上升法基本思想是:在每一次迭代更新回归系数时,其不是遍历整个数据集,而是一次仅用一个样本点来更新回归系数。更高级的思想是,我们不再像上面对alpha参数保持不变,而是随着迭代次数的增加,逐渐减小alpha值,也即越靠近最优解时,我们移动的步长越小以防越过最优解。同时,样本点也可以随机选取以减少周期性波动。

五、代码实现

1、标准梯度上升法

def gradAscent():

    dataMat = []
    labelMat = []
    with open('testSet.txt') as fr:
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
            labelMat.append(int(lineArr[2]))

    dataMatrix = mat(dataMat)
    labelMat = mat(labelMat).transpose()
    m, n = shape(dataMatrix)
    alpha = .001
    maxCycles = 500
    weights = ones((n, 1))
    # print 'weights:', weights
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = (labelMat - h)
        weights += alpha * dataMatrix.transpose() * error
    return weights

2、sigmoid方法

def sigmoid(inx):
    return 1.0 / (1 + exp(-inx))

3、改进的随机梯度上升法

def stocGradAscentImproved(numIter=150):
    """Improved Stochastic gradient ascent method"""
    with open('testSet.txt') as fr:
        for line in fr.readlines():
            lineArr = line.strip().split()
            dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
            labelMat.append(int(lineArr[2]))

    dataMat = array(dataMat)
    labelMat = array(labelMat)
    m, n = shape(dataMat)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 2 / (1.0 + j + i) + 0.01  # 更快地收敛
            randIndex = int(random.uniform(0, len(dataIndex)))
            h = sigmoid(sum(dataMat[randIndex] * weights))
            error = classLabels[randIndex] - h
            weights += alpha * error * dataMat[randIndex]
            del dataIndex[randIndex]  # 已选过的样本点删除
    return weights

4、其中testSet.txt文件部分内容:

-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

stocGradAscentImproved方法在训练数据集求解出回归系数W,也即解出拟合曲线了,之后使用测试数据集预测类标号。如果sigmoid函数计算结果值大于0.5,则标记为1,而小于0.5标记为0
在测试数据集上多次迭代求平均错误率。

六、总结

1、选择合适的分类器函数,这里使用sigmoid函数,我们在高中生物课学习过该参数,即种群S型生长曲线。sigmoid函数能够把拟合计算得到的曲线转换为后验概率,当sigmoid函数值大于0.5时,我们把该类标记为A类,小于0.5时,标记为B类。
2、在大规模数据集中,由于标准梯度上升法在每次迭代更新回归系数时,它都是遍历整个数据集,因此,该方法占用的内存空间和计算量很大。
3、公式算法应自己推导一遍以便对程序有更好的理解。

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

推荐阅读更多精彩内容