Julia 배우기(12): 로지스틱 회귀
로지스틱 회귀에 대한 자세한 내용은 this wiki page을 참조하십시오.
먼저 아래 그림에서 표현식과 곡선을 볼 수 있는 유명한 시그모이드 함수를 정의해야 합니다.
또한 이 시그모이드 함수를 내 코드에서 배열 형식으로 정의해야 합니다. 이를 위해 Dot Syntax for Vectorizing Functions을 배웠습니다. 공식 문서에 소개된 대로:
Any Julia function f can be applied elementwise to any array (or other collection) with the syntax
f.(A)
. For example,sin
can be applied to all elements in the vectorA
like so:sin.(A)
.
따라서 시그모이드 함수를 다음과 같이 정의합니다.
## sigmoid which takes only one scalar as input
# sigmoid(x) = 1/(1 + exp(-x))
# x = collect(-10:0.5:10)
# y = [sigmoid(i) for i in x]
# plot(x, y)
## sigmoid which takes an array as input
sigmoid(x) = 1 ./(1 .+ exp.(-x))
##### test of sigmoid function
x = collect(-10:0.5:10)
y = sigmoid(x)
using Plots
plot(x, y, title="Sigmoid function")
이 함수의 출력이 어떻게 보이는지 확인하십시오.
이제 "레이블이 지정된"샘플 데이터가 필요합니다. 저는 매우 간단한 시나리오를 상상했습니다. 한 쌍의 float 숫자(x1, x2)가 주어지면 합계가 0보다 크면 해당 레이블은 1입니다. 그렇지 않으면 레이블은 0입니다. 다음과 같이 정의됩니다.
raw_x = rand(Float64, (50,2)) ## generate a matrix of 50*2
raw_x = 10.0* (raw_x .- 0.5)
# raw_x =[ -10 4; 4 3; 5 9; -4 8; 9 -19; 4 9; -3 -1; -6 11; 8 2; 9 1; 3 -7; -4 -3]
## size of sample points
m = size(raw_x)[1]
println("Sample size: $m")
raw_y = zeros((m,1))
for idx in 1: size(raw_x)[1]
if raw_x[idx, 1] + raw_x[idx, 2]> 0
raw_y[idx] = 1.0
end
end
println(raw_y)
gr() # Set the backend to GR
# This plots using GR
display(plot(raw_x[:,1],raw_x[:,2], raw_y[:,1] ,seriestype=:scatter, title="Sample points"))
샘플은 3D로 표시됩니다.
이 문제에 대한 몇 가지 수학 정의를 수행했습니다.
따라서 손실 함수는 다음과 같이 정의할 수 있습니다.
이제 Julia에서 코딩합니다.
func(v) = (raw_x*v[1:2] ).+ v[3]
cost(v) = -(sum(raw_y.*log.(sigmoid(func(v))) + (1 .-raw_y).*log.(1 .- sigmoid(func(v)))))
내 목표는 손실 함수를 최소화하는 벡터 v를 찾는 것입니다. 따라서 최적화 문제입니다. 이제 이를 해결하기 위해 Optim 모듈을 사용해야 합니다.
init_v = [1.0, 2.0, 0.0]
res = optimize(cost, init_v)
# now solve the minimization problem
sol = Optim.minimizer(res)
println("sol: $sol")
val = Optim.minimum(res)
println("val: $val")
이것은 최적화 솔버가 산출하는 것입니다.
이제 솔루션(예측)을 테스트해 보겠습니다. 테스트를 위해 (7 12), (5 8) 및 (9 -19)의 세 가지 점을 만들었습니다. 따라서 우리는 출력 1, 1 및 0을 기대하고 있습니다.
# now test the solution:
x_test1 = [7 12; 5 8; 9 -19]
y_test1 = sigmoid((x_test1*sol[1:2] ).+ sol[3])
println("x_test1: $x_test1")
println("y_test1: $y_test1")
코드가 예측하는 내용을 아래에서 확인하세요.
Que la vie est belle :D
Reference
이 문제에 관하여(Julia 배우기(12): 로지스틱 회귀), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/jemaloqiu/learn-julia-12-logistic-regression-403g텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)