zoukankan      html  css  js  c++  java
  • logistic逻辑回归公式推导及R语言实现

    Logistic逻辑回归

    Logistic逻辑回归模型

    线性回归模型简单,对于一些线性可分的场景还是简单易用的。Logistic逻辑回归也可以看成线性回归的变种,虽然名字带回归二字但实际上他主要用来二分类,区别于线性回归直接拟合目标值,Logistic逻辑回归拟合的是正类和负类的对数几率。

    假设有一个二分类问题,输出为y∈{0,1}

    定义sigmoid函数:

    用sigmoid函数的输出是0,1之间,用来拟合y=1的概率,其函数R语言画图如下:

    x = seq(-5, 5, 0.1)
    y = 1 / (1 + exp(-1*x))
    plot(x, y, type="line")
    

    logistic逻辑回归可以拟合因变量为1的概率,最终分类的时候,我们可以一个阈值,比如0.5,大于阈值的都分为正类,向量化公式如下:

    还可以换一种方式理解logistic逻辑回归,他是用多元线性函数去拟合因变量为正例与反例的比值的自然对数,推导如下:

    Logistic逻辑回归算法

    • 假设自变量维度为N
    • W为自变量的系数,下标0 - N
    • X为自变量向量或矩阵,X维度为N,为了能和W0对应,X需要在第一行插入一个全是1的列。
    • Y为因变量
    • W为未知数待求解

    最大似然估计法

    梯度下降法迭代公式

    R语言实现

    使用iris数据集

    > head(iris)
      Sepal.Length Sepal.Width Petal.Length Petal.Width Species
    1          5.1         3.5          1.4         0.2  setosa
    2          4.9         3.0          1.4         0.2  setosa
    3          4.7         3.2          1.3         0.2  setosa
    4          4.6         3.1          1.5         0.2  setosa
    5          5.0         3.6          1.4         0.2  setosa
    6          5.4         3.9          1.7         0.4  setosa
    

    将数据分为训练数据和测试数据

    R语言使用批量梯度下降法迭代求解

    iris2 = rbind(subset(iris, Species=='setosa'), subset(iris, Species=='versicolor'))
    X <- cbind(rep(1, nrow(iris2)), iris2$Sepal.Length, iris2$Sepal.Width, iris2$Petal.Length, iris2$Petal.Width)
    Y <- as.numeric(iris2$Species) - 1
    maxIterNum <- 2000;
    step <- 0.05;
    W <- rep(0, ncol(X))
    m = nrow(X)
    sigmoid <- function(z) { 1 / (1 + exp(-z))}
    for (i in 1:maxIterNum){
        grad <- t(X) %*% (sigmoid(X %*% W)-Y);
        if (sqrt(as.numeric(t(grad) %*% grad)) < 1e-8){
            print(sprintf('iter times=%d', i));
            break;
        }
        W <- W - grad * step;
    }
    print(W);
    hfunc <- function(a) {if (a > 0.5) return(1) else return (0);}
    myY = apply(sigmoid(X %*% W), 1, hfunc)
    print(cbind(Y, myY))
    

    输出后,可以看到拟合完全正确,因为本文只是为了推导一下逻辑回归的算法,所以直接用全部数据拟合,没有再抽出一部分做测试数据。

    总结

    • 应该增加一部分训练数据,验证模型的正确性
    • 应该增加正则项避免过拟合,比如L2正则

    更多精彩文章 http://h2cloud.org/

  • 相关阅读:
    Zend Studio下调试PHP的一点注意事项
    使用FTP出现中文乱码解决方案
    C++数据类型与C#对应表
    FineUI 开发B/S系统
    c#调用带输出参数的存储过程
    经典FormsAuthenticationTicket 分析
    C# Oracle数据库操作类实例详解
    如何使用C#的Hashtable[哈希表]
    对三层架构的理解
    C# 最简单的三层架构实例 ——转载自网易博客
  • 原文地址:https://www.cnblogs.com/zhiranok/p/LogisticRegression.html
Copyright © 2011-2022 走看看