Chama o método step_gradient iterativamente para atualizar o valor de θ. Armazena os valores intermediários para plotar
theta =[0,0]
theta_logs =[theta]# para plotar
cost_logs =[costFunction(x,y,theta)]# para plotar
n_iter=200
alpha =0.001for i inrange(n_iter):
theta = step_gradient(x,y,theta,alpha)
theta_logs.append(theta)# para plotar
cost_logs.append(costFunction(x,y,theta))# para plotar
Alpha = 0.03
Alpha = 0.02
Alpha = 0.01
Alpha = 0.001
Alpha = 0.0001
Vetorização
Algumas linguagens (como matlab e R) permite o uso de técnicas de vetorização. Nessas linguagens, algumas operacoes são transparentemente aplicadas a vetores ou matrizes.
Em python, a biblioteca numpy provê várias funcionalidades para explorar vetorização
Função de custo - vetorizada
Uma versão da função de custo vetorizada é mostrada a seguir. Observe que não é utilizado o laço.
defcostFunction(X, y, theta):
error = np.dot(X, theta)- y
return np.mean(error)/2defstep_gradient(x,y,theta,alpha):
m =len(x)
theta = theta -(alpha/m)* np.dot(x.T, np.dot(x, theta)- y)return(theta)
x = np.column_stack((np.ones(len(x)),x))
theta =[0,0]
n_iter=200
alpha =0.001for i inrange(n_iter):
theta = step_gradient(x,y,theta,alpha)
Regressão linear multivariada
Múltiplas variáveis = múltiplos atributos
No problema anterior, tinhamos
x = tamanho da casa (em ft2)
y = preço da casa
Mas podemos adicionar novas variáveis, tais como
x1,x2,x3,x4 são quatro atributos: x1 = tamanho (ft2) x2 = número de quartos x3 = number de andares x4 = idade da casa (anos) y = preço das casas
Mais notação
n = número de atributos (n=4)
m = número de exemplos
xi = vetor de entrada para um exemplo. i é o índice do conjunto de treinamento, então x3 é, por exemplo a 3a casa. x é um vetor n-dimensional
xji é o valor do atributo j do i-ésimo exemplo de treino. Por exemplo, x23 é o número de quartos da terceira casa.
Forma da hipótese
Anteriormente nossa hipótese era da forma: hθ(x)=θ0+θ1x
Agora que temos multiplos atributos: hθ(x)=θ0+θ1x+θ2x+θ3x+θ4x
Se adicionarmos uma feature adicional x0=1, em notação vetorial temos:
hθ(x)=θx
Descida do Gradiente
Os parâmetros ainda podem ser determinados pela função de custo
Atualizamos cada parâmetro θj fazendo θj:=θj−α∂θj∂J(θ)
em que ∂θj∂J(θ)=m1i∑m(hθ(xi)−yi)xji
A forma vetorial se ajusta ao número de variáveis
Diferença de escala
Atributos em diferentes escalas podem atrapalhar a descida do Gradiente. Por exemplo, se tivermos x1 = Tamanho (0 - 2000 ft2) x2 = número de quartos (1-5)
Os contornos gerados pelo plot de θ1 \emph{vs} θ2 será alongado em um dos eixos e estreito no outro
Diferença de escala
Colocar os atributos na mesma escala pode fazer o algoritmo covergir mais rapidamente
As linhas de contorno se parecerão mais com um círculo
Possíveis opções
Ajustar entre 0 e 1: max(xj)−min(xj)xji−min(xj)
Normalização: σ(xj)xji−μ(xj)
Criação de atributos
Suponha que tenhamos os atributos:
x1 = Largura da frente to terreno
x2 = Profundidade do terreno
Podemos criar um novo atributo x3 = Área fazendo x3=x1∗x2
Em muitos casos, a definição de novos atributos pode gerar modelos melhores!
Regressão Polinomial
Regressão Polinomial
Como podemos ajustar um polinômio de grau n>1 aos dados?
Uma ideia simples é criar novos atribtos:
x1x2x3=x=x2=x3
Criarndo atributos como esses e aplicando o algoritmo de regressão linear podemos fazer regressão polinomial!
Regressão Polinomial
Reescalar os atributos se torna ainda mais importated nesse caso
Ao invés de um polinômio convencional, também podemos usar xz1,z∈{2,3,…} (i.e., raiz quadrada, raiz cúbica, etc)
Podemos criar muitos atributos - posteriormente vamos ver algoritmos para selecionar os melhores atributos
Equação normal
Para alguns problemas de regressão linear, a equação normal provê uma melhor solução