首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用Flux.jl进行Logistic回归

用Flux.jl进行Logistic回归
EN

Stack Overflow用户
提问于 2018-03-06 15:59:15
回答 2查看 994关注 0票数 3

我有一个由两个科目的学生分数组成的数据集,以及该学生是否被大学录取的结果。我需要对数据进行logistic回归,并找到最优参数θ,以最小化损失,并对测试数据进行预测。我不想在这里建立任何复杂的非线性网络。

数据如下所示

我定义了逻辑回归的损失函数,它工作得很好。

代码语言:javascript
复制
predict(X) = sigmoid(X*θ)
loss(X,y) = (1 / length(y)) * sum(-y .* log.(predict(X)) .- (1 - y) .* log.(1 - predict(X)))

我需要最小化这个损失函数,并找到最优的θ。我想用Flux.jl或任何其他使它更简单的库来完成它。在阅读了示例之后,我尝试使用Flux.jl,但无法将成本降到最低。

我的代码片段:

代码语言:javascript
复制
function update!(ps, η = .1)
  for w in ps
    w.data .-= w.grad .* η
    print(w.data)
    w.grad .= 0
  end
end

for i = 1:400
  back!(L)
  update!((θ, b))
  @show L
end
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-06 18:33:51

您可以使用GLM.jl (更简单)或Flux.jl (更复杂,但一般更强大)。在代码中,我生成数据,以便您可以检查结果是否正确。此外,我还有一个二进制响应变量--如果您有目标变量的其他编码,您可能需要稍微修改代码。

下面是要运行的代码(可以调整参数以提高收敛速度--我选择了安全的参数):

代码语言:javascript
复制
using GLM, DataFrames, Flux.Tracker

srand(1)
n = 10000
df = DataFrame(s1=rand(n), s2=rand(n))
df[:y] = rand(n) .< 1 ./ (1 .+ exp.(-(1 .+ 2 .* df[1] .+ 0.5 .* df[2])))
model = glm(@formula(y~s1+s2), df, Binomial(), LogitLink())

x = Matrix(df[1:2])
y = df[3]
W = param(rand(2,1))
b = param(rand(1))
predict(x) = 1.0 ./ (1.0+exp.(-x*W .- b))
loss(x,y) = -sum(log.(predict(x[y,:]))) - sum(log.(1 - predict(x[.!y,:])))

function update!(ps, η = .0001)
  for w in ps
    w.data .-= w.grad .* η
    w.grad .= 0
  end
end

i = 1
while true
  back!(loss(x,y))
  max(maximum(abs.(W.grad)), abs(b.grad[1])) > 0.001 || break
  update!((W, b))
  i += 1
end

以下是研究结果:

代码语言:javascript
复制
julia> model # GLM result
StatsModels.DataFrameRegressionModel{GLM.GeneralizedLinearModel{GLM.GlmResp{Array{Float64,1},Distributions.Binomial{Float64},GLM.LogitLink},GLM.DensePredChol{Float64,Base.LinAlg.Cholesky{Float64,Array{Float64,2}}}},Array{Float64,2}}

Formula: y ~ 1 + s1 + s2

Coefficients:
             Estimate Std.Error z value Pr(>|z|)
(Intercept)  0.910347 0.0789283 11.5338   <1e-30
s1            2.18707  0.123487 17.7109   <1e-69
s2           0.556293  0.115052 4.83513    <1e-5


julia> (b, W, i) # Flux result with number of iterations needed to converge
(param([0.910362]), param([2.18705; 0.556278]), 1946)
票数 5
EN

Stack Overflow用户

发布于 2019-01-30 01:31:14

谢谢这个有用的例子。但是,它似乎没有在我的设置(Julia1.1,Flux0.7.1.)中运行,因为预测和丢失函数中的1+和1-操作不是在TrackedArray对象上广播的。幸运的是,修复方法很简单(注意点!):

代码语言:javascript
复制
predict(x) = 1.0 ./ (1.0 .+ exp.(-x*W .- b))
loss(x,y) = -sum(log.(predict(x[y,:]))) - sum(log.(1 .- predict(x[.!y,:])))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49135107

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档