惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

D
DataBreaches.Net
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
云风的 BLOG
云风的 BLOG
B
Blog
博客园 - Franky
I
InfoQ
A
About on SuperTechFans
博客园_首页
L
LangChain Blog
量子位
腾讯CDC
Microsoft Security Blog
Microsoft Security Blog
博客园 - 【当耐特】
美团技术团队
V
V2EX
Apple Machine Learning Research
Apple Machine Learning Research
雷峰网
雷峰网
MongoDB | Blog
MongoDB | Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
T
The Blog of Author Tim Ferriss
P
Proofpoint News Feed
G
Google Developers Blog
Last Week in AI
Last Week in AI

博客园 - 知然

Agent 路由模式实战:基于 Google ADK 的实现 鸿蒙 Native API 的封装库 h2lib_arkbinder 朴素贝叶斯python代码实现(西瓜书) 决策树ID3原理及R语言python代码实现(西瓜书) WebSocket协议详解与c++&c#实现 游戏服务器h2engine架构优化和跨平台设计 多元线性回归公式推导及R语言实现 h2engine游戏服务器设计之聊天室示例 游戏服务器设计之NPC系统 游戏服务器设计之任务系统 H2Engine游戏服务器设计之属性管理器 WebSocket 开发模拟客户端与有游戏服务器通信 H2Engine服务器引擎介绍 python的解释器spython介绍 fflua更新-增加对引用的支持 linux epoll 开发指南-【ffrpc源码解析】 ffrpc相关文章列表 ffrpc的php客户端lib FFrpc python客户端lib
logistic逻辑回归公式推导及R语言实现
知然 · 2018-09-25 · via 博客园 - 知然

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/