49 lines
1.2 KiB
Julia
49 lines
1.2 KiB
Julia
|
using LinearAlgebra
|
|||
|
using Distributions
|
|||
|
using Random
|
|||
|
using Zygote
|
|||
|
using Plots
|
|||
|
|
|||
|
Random.seed!(0);
|
|||
|
|
|||
|
function normalgenerator(amount::Number,μ::Number,σ::Number,lowerbound::Number=0,upperbound::Number=1)
|
|||
|
return rand(Truncated(Normal(μ,σ),lowerbound,upperbound),amount)
|
|||
|
end
|
|||
|
|
|||
|
function noisyline(intercept::Number,slope::Number,samples::Number,μ::Number,σ::Number,lb::Number=0,ub::Number=1)
|
|||
|
noise = normalgenerator(samples,μ,σ,lb,ub)
|
|||
|
exes = Array{Float64,1}(undef,samples)
|
|||
|
for i in 1:samples
|
|||
|
exes[i] = i
|
|||
|
end
|
|||
|
line = slope .* exes .+ intercept
|
|||
|
y = noise .+ line
|
|||
|
w = ones(samples)
|
|||
|
X = hcat(exes,w)
|
|||
|
return X,y
|
|||
|
end
|
|||
|
|
|||
|
function MSE(X::Array,y::Array,w::Array)
|
|||
|
return mean((y - X * w).^2)
|
|||
|
end
|
|||
|
|
|||
|
function gradient_descent(X::Array,y::Array,α::Number,w::Array,iter::Number)
|
|||
|
costs = Array{Float64,1}(undef,iter)
|
|||
|
for i in 1:iter
|
|||
|
costs[i] = MSE(X,y,w)
|
|||
|
∇X, ∇y, ∇w = gradient(MSE,X,y,w)
|
|||
|
w = w - α * ∇w
|
|||
|
end
|
|||
|
return w,costs
|
|||
|
end
|
|||
|
|
|||
|
function get_res_line(X::Array,result::Array)
|
|||
|
return result[1] .* X[:,1] .+ result[2]
|
|||
|
end
|
|||
|
|
|||
|
|
|||
|
X,y = noisyline(2,4,100,0,1);
|
|||
|
N,D = size(X);
|
|||
|
w = ones(D);
|
|||
|
pred,cost = gradient_descent(X,y,0.0001,w,6);
|