LR逻辑回归-简单学习

1. 线性回归(Linear Regression)

提到逻辑回归,还是要从线回归说起
概念:
对于多维空间中存在的样本点,我们用特征的线性组合(特征加权)去拟合空间中点的分布和轨迹。
公式:



有监督训练数据集(X,Y),X表示特征,Y表示标签,w表示该某一特征对应的权重
图形:


线性回归既可以用于回归,也可以用来分类;但由于输出值是不确定范围,鲁棒性差等原因,分类效果不好;于是就有逻辑回归。

2. 逻辑回归(Logistic Regression)

逻辑回归是在线性回归的基础上套用了一个逻辑函数(比如:sigmoid),将线性回归不确定范围的输出值映射到(0,1)上,变成为了一个概率预测。
公式:

sigmoid函数公式如下:

θ
sigmoid函数图像:


sigmoid函数的导数形式:

整理得LR的目标函数:

假设有n个独立的训练样本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一个观察到的样本(xi, yi)出现的概率是:

当y=1时只有前面y属于1的概率,当y=0时只有后面y属于0的概率

整个样本集,也就是n个独立的样本出现的似然函数为

整个样本的后验概率:

其中:

进一步简化,最终函数为:

2.1 确定模型参数

对目标函数求导:

分三部分求导:
第一部分:

第二部分:

第三部分:

模型参数更新公式为:

整体损失函数梯度求解过程:


故,参数更新公式为:


2.2 python实现LR的核心代码片段

# coding:utf-8
'''
Created on Oct 27, 2010
Logistic Regression Working Module
@author: Peter
代码来源:机器学习实战-第五章的源码片段
'''
def sigmoid(inX):
    return 1.0/(1+exp(-inX))

def stocGradAscent(dataMatrix, classLabels, numIter=150):
    m,n = shape(dataMatrix)
    weights = ones(n)   #initialize to all ones
    for j in range(numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001    #apha decreases with iteration, does not 
            randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            # 标签的真实值-预测值
            error = classLabels[randIndex] - h
            # 模型参数更新公式(与我们推导的形式一致)
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights 

总结

优点:

  • 最简单的分类模型(简单,容易理解)
  • 在线学习
  • 输出结果是输入样本的概率列表,可以任意设定阀值,定义想要的输入分类
  • 对小噪音的鲁棒性较好

缺点:

  • 没有考虑特征间的关系
    ——LR+多项式模型;或者使用FM,FFM模型
  • 样本数量大时,性能较差
  • 不能处理大量多类特征
  • 容易欠拟合
  • 只能处理二分类
    ——sigmoid替换为Softmax可处理多分类

你可能感兴趣的:(LR逻辑回归-简单学习)