Skip directly to content

Instalando e usando Julia e Exercícios sobre Regressão Linear e Polinomial

Faça o download de Julia em:
http://julialang.org/downloads/

e instale em seu computador.

Instale o IPython notebook em seu computador:

http://ipython.org/notebook.html

Depois, digite julia na linha de comando, executando o binário para entrar no modo script interativo e digite dentro desse ambiente:

Pkg.add("IJulia")
Pkg.add("PyPlot")
Pkg.add("RDatasets")
Pkg.add("Gadfly")

Se encontrar o erro "ERROR: symlink: file already exists (EEXIST)" thrown using Pkg
resolva ele assim como explicado em: https://www.reddit.com/r/Julia/comments/3e9qlf/error_symlink_file_already_exists_eexist_thrown/

cd $HOME/.julia/v0.3/ rm .cache ln -s $HOME/.julia/.cache .cache

Em seguida, execute na linha de comando (terminal):

ipython notebook

Nesse ambiente, você poderá criar scripts em Julia (ou Python, Ruby) dentro de um navegador de maneira interativa, bem como visualizar gráficos no próprio navegador.

Crie um novo script Julia para experimentar com a linguagem.

Se desejar, poderá instalar também o ambiente de desenvolvimento para Julia: Juno

Veja um resumo da linguagem Julia aqui:  http://learnxinyminutes.com/docs/julia/
Alungs slides sobre Julia: http://www.stat.wisc.edu/~bates/JuliaForRProgrammers.pdf
Outras fontes para aprender Julia: http://julialang.org/learning/

Exercícios

Antes de começar os exercícios, deverá executar esse código uma vez:

using Gadfly
using Distributions

Para resolver os exercícios, você pode desejar ver os slides da Aula 1 (ver no Moodle, a ser inserido pelo prof. Marcelo).

OBS: Na próxima aula, traga seu laptop com Julia instalado.

Exercício 1 (Regressão Linear), para sexta-feira (28 de agosto):

Dado um conjunto de pontos ou exemplo de treinamento com erro Gaussiano em y, encontre a hipótese (reta) que maximiza o likelihood de observar os dados dado a hipótese, ou seja, aquela que aproxima os dados quando consideramos a função de custo como sendo o erro quadrático. Para isso, use o método do descenso do gradiente para atualizar os parâmetros theta da hipótese (reta). Por exemplo, poderá criar pelo menos 2 funções:

function gradient(examples, theta)
function gradient_descent(examples, theta; learning_rate=0.05)

que retorna o valor do gradiente com relação à theta (um vetor); e que executa o laço de repetição da atualização dos parâmetros theta. A hipótese será:

function hypothesis(x, theta)
   y =  [1 x]' * theta
end

com theta inicial:

theta_ini = ones(2) * 0.001

Os exemplos de treinamento poderão ser gerados da seguinte maneira:

n = 10
x = 1:0.1:n
d = Normal(0,8)    
y = 5.4x 
ysample = y + rand(d,length(x))
plot(x=x,y=ysample,Geom.point)

Para plotar os resultados, poderá usar essa função:

# Plota resultados
function plot_results()
    h_ = zeros(length(x))
    for i in 1:length(x)
        h_[i] = hypothesis(x[i], theta)
    end
    # hypothesis in red
    plot(layer(x=x, y=h_, Geom.point, Theme(default_color=color("red"))),
    layer(x=x, y=y, Geom.point),
    layer(x=x, y=ysample, Geom.point, Theme(default_color=color("black"))))
end

Exercício 2  (Regressão Polinomial), para sexta-feira (28 de agosto)

Crie agora um conjunto de treinamento (x,y) que expresse uma relação não-linear entre x e y, e treine uma hipótese não-linear para aproximar os dados de treinamento. As funções gradient e gradient_descent ficarão basicamente iguais (se você criou uma função gradient genérica o suficiente; caso contrário, terá que modificá-la). Você deverá mudar a função hypothesis(x, theta) e verificar se a função gradient precisará ser mudada.

Exercício 3, para sexta-feira (28 de agosto)

Tente aproximar os dados do exercício 1 com uma hipótese não-linear, por ex., do exercício 2. O que acontece?

Agora, faça o contrário, tente aproximar os dados do exercício 2 com uma hipótese linear, por ex., do exercício 1. O que acontece?

Exercício 4, opcional

Adapte o algoritmo anterior (do exercício 1) para regressão logística. Use o seguinte conjunto de dados de treinamento:
## classes linearmente separaveis
n = 40
sigma = 5
d1 = Normal(0,sigma)    
d2 = Normal(20,sigma)  
# classe 1
x1 = rand(d1,n)
x2 = rand(d1,n)
samples = [x1 x2 zeros(n)]
# classe 2
x1 = rand(d2,n)
x2 = rand(d2,n)
samples = [x; x1 x2 ones(n)]

plot(layer(x=samples[:,1],y=samples[:,2],Geom.point))

Uma seleção de outros pacotes ou extensões existentes para Julia:

Pkg.add("NaiveBayes")
Pkg.add("BayesNets")
Pkg.add("Boltzmann")
Pkg.add("Clustering")

Pkg.add("DecisionTree")   # https://github.com/bensadeghi/DecisionTree.jl
Pkg.add("Distributions")
Pkg.add("Evolutionary")
Pkg.add("FaceDatasets")
Pkg.add("GaussianMixtures")
Pkg.add("LIBSVM")
Pkg.add("MachineLearning")
Pkg.add("Lora")   /   Pkg.add("Mamba")   /  Pkg.add("MCMC")
Pkg.add("MarketData")
Pkg.add("MAT")   # Matlab files reading
Pkg.add("MNIST")   # handwritten digits dataset
Pkg.add("Mocha")   # Deep learning

Pkg.add("Morsel")  # web development