Entradas, Saídas e Análise de Dados
Regressão Linear
Jorge Cruz
DI/FCT/UNL
Programação para as Ciências Experimentais
1º Semestre 2005/2006
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
1
Regressão Linear : Um Exemplo
Exemplo
• Um dado produto é fabricado numa linha de produção por
lotes. Os lotes são encomendados pelos clientes e têm um
número variável de exemplares do produto, de acordo com a
ordem do cliente.
• A empresa produtora está interessada em desenvolver um
modelo de produção, de forma a poder prever
– Qual o tempo que demora cada lote a ser produzido
– Quais os lotes que são produzidos em mais ou menos
tempo que o esperado, de forma a poderem ser analisados
os factores que facilitam ou dificultam o fabrico.
• Para fazer esse estudo a empresa detém um histórico da
produção de vários lotes no passado.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
2
Regressão Linear : Um Exemplo
• O modelo desenvolvido tem em conta que
– Antes de se começar a produzir o produto é necessário
gastar um dado tempo (t0: tempo de setup) para preparar
um conjunto de recursos (ex: máquinas e instalações).
– Uma vez estabelecida essa preparação o número de peças
produzidas é basicamente proporcional ao tempo,
demorando um tempo t1 a fabricar cada peça.
• Assim parece apropriado um modelo do tipo, em que o tempo
T necessário para se produzirem P peças é dado por:
T = t 1 P + t0
• O problema consiste pois em determinar os valores de t0 e t1 a
partir dos dados históricos.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
3
Análise de Dados – Regressão Linear
• Este problema é apenas um exemplo de aplicação da técnica
de análise de dados, denominada, regressão linear, que na sua
forma geral se pode descrever por:
– Regressão Linear: Dado um conjunto de dados, xi e yi verificar se
eles estão numa relação linear
Y = m X +b
• O problema tem dois subproblemas:
– Determinar os valores de m e b mais apropriados aos
valores dos vários pares de valores <xi,yi>.
– Avaliar se é razoável assumir a relação linear acima, ou
seja, se os pares de valores <xi,yi> a “suportam” (isto é, se
existe uma boa correlação linear entre X e Y).
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
4
Análise de Dados – Regressão Linear
• Podemos ilustrar esta técnica com dois exemplos gráficos
Os valores de m (inclinação da recta) e de b (intersecção da
recta com o eixo Y) são idênticos nos dois casos
y
y
x
X e Y têm uma forte
correlação linear
4 Novembro 2005
x
X e Y têm uma fraca
correlação linear
Entradas, Saídas e Análise de Dados
Regressão Linear
5
Determinação de m e de b
• O tratamento matemático para a determinação dos valores de
m e b é relativamente simples e consiste em determinar os
valores de m e b que minimizem o erro entre os resultados
esperados e os resultados experimentais.
• Para cada ponto <xi,yi> o erro “experimental” é dado por
ei = yi – (m xi + b)
O erro E que se pretende minimizar é o erro quadrático médio,
E = Σ e i2
• Assim sendo o problema reduz-se a determinar os valores de
m e b que minimizam o erro E.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
6
Determinação de m e de b
• O mínimo de uma função em relação a uma variável ocorre
quando a derivada dessa função em ordem a essa variável é
nula. Assim sendo há que obter os zeros da derivada de E em
relação a m e a b.
– Nota 1: Assume-se uma função contínua e continuamente derivável,
caso contrário o mínimo pode não ocorrer no zero da derivada.
– Nota 2: A função E tem duas variáveis, m e b. A análise em Rn
justifica que o mínimo deve corresponder ao zero das duas derivadas.
– Nota 3: Como o mínimo de E = F coincide com o mínimo de E2 = F,
pode minimizar-se F = E2 = Σei2
• Os valores de m e b que minimizam o erro são assim
determinados como aqueles que verificam
F
F
=0
e
=0
m
b
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
7
Determinação de m e de b
F
• Ora
=0
b
 Σ (yi – m xi – b)2
=0
b
Σ – 2 (yi – m xi – b) = 0
Σ (yi – m xi – b) = 0
Σ (yi – m xi) – n b= 0
Σ (yi – m xi)
b=
n
F
• Por outro lado,
=0
m
 Σ (yi – m xi – b)2
=0
m
Σ – 2 xi (yi – m xi – b) = 0
Σ xi (yi – m xi – b) = 0
Σ (xi yi – m xi2 – b xi ) = 0
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
8
Determinação de m e de b
Σ (yi – m xi)
• Usando agora o valor de b =
na fórmula
n
Σ (xi yi – m xi2 – b xi ) = 0 permite-nos obter o valor de m:
Σ (xi yi – m xi2 – 1/n xi Σ (yi – m xi)) = 0
Σ (n xi yi – n m xi2 ) – Σ xi Σ (yi – m xi) = 0
n Σ xi yi – m n Σ xi2 – Σ xi Σ yi + m Σ xi Σ xi = 0
m [n Σ xi2 – (Σ xi)2] = n Σ xi yi – Σ xi Σ yi
... obtendo-se assim
4 Novembro 2005
n Σ xi yi – Σ xi Σ yi
m=
n Σ xi2 – (Σ xi)2
Entradas, Saídas e Análise de Dados
Regressão Linear
9
Determinação de m e de b
• Assim, dados vectores X e Y, com n valores de xi e yi os
valores de m e de b podem ser obtidos através das fórmulas
n Σ xi yi – Σ xi Σ yi
m=
n Σ xi2 – (Σ xi)2
Σ (yi – m xi)
b=
n
• Em Octave, estas fórmulas podem calcular-se através do
seguinte conjunto de equações
Sx = sum(X);
Sy = sum(Y);
Sxx = sum(X.*X);
Sxy = sum(X.*Y);
m = (n * Sxy – Sx*Sy) / (n*Sxx – Sx^2)
b = (Sy – m * Sx) / n
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
10
Correlação entre X e Y
• Para medir a qualidade da relação linear entre X e Y pode
usar-se o coeficiente de correlação r.
n Σ xi yi – Σ xi Σ yi
r=
[n Σ xi2 – (Σ xi)2] [n Σ yi2 – (Σ yi)2]
• Este coeficiente (cuja derivação exige um maior
conhecimento de estatística) varia entre 1 (correlação
perfeita) e 0 (correlação nula).
• O seu valor em OCTAVE pode ser obtido através das
equações anteriores e ainda de:
Syy = sum(Y.*Y);
r = (n * Sxy – Sx*Sy) / sqrt ((n*Sxx – Sx^2)* (n*Syy – Sy^2)
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
11
Armazenamento de Dados
• Quando a quantidade de dados é grande, não é razoável ou
mesmo possível introduzi-los “manualmente” num programa.
• Tipicamente esses dados são armazenados em ficheiros que
têm de ser lidos pelos programas que os tratam.
• As funções básicas de manutenção de ficheiros (criação,
alteração e destruição, localização, acesso ao seu conteúdo,
etc.) são definidas no sistema de ficheiros (file system) ,
componente do sistema operativo (Operating System Windows, Linux, MacOS, ...).
• Todas as linguagens de programação têm acesso a essas
funções básicas (primitivas), implementadas através de
chamadas ao sistema, mas que são disponibilizadas ao nível
da linguagem através de instruções próprias.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
12
Armazenamento de Dados
• Existe uma grande variedade de formas nessas instruções mas
algumas características são razoavelmente gerais:
– Antes de se escrever ou ler num ficheiro, este tem de ser aberto num
modo apropriado (leitura, escrita, leitura/escrita,...).
– Na abertura de um ficheiro, este é associado a um “canal” com um
identificador (tipicamente um número) único. Todos os acessos ao
ficheiro referem esse valor e não o nome com que o ficheiro é
conhecido no sistema de ficheiros.
– Os acessos de leitura e escrita de dados dos ficheiros dependem da
forma como os dados são codificados. Estes podem ser armazenados
como texto ou numa forma codificada que optimiza o espaço.
– Após todos os acessos pretendidos terem sido executados, o ficheiro
deve ser fechado.
• Como estas operações podem ser muito variadas, vamos
centrar-nos nos acessos a ficheiros texto em OCTAVE.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
13
Entrada de Dados
• Após a abertura de um ficheiro texto, ele pode ser lido de
duas formas básicas:
– Leitura carácter a carácter, sendo tarefa do programador interpretar as
sequências de caracteres como números, palavras, etc...
– Leitura de acordo com determinados padrões (templates) em que
existem primitivas da linguagem que interpretam directamente os
caracteres para o tipo de dados pretendido.
• Por exemplo, assumamos que um ficheiro tem a sequência de
caracteres “ 23   45.2 ”. Neste caso podemos
– ler os 11 caracteres e tendo em atenção os espaços interpretar esses
caracteres como dois números (um inteiro e outro decimal).
– Indicar como padrão de leitura um inteiro seguido de um decimal que
são retornados em variáveis indicadas.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
14
Saída de Dados
• O armazenamento de dados num ficheiro segue passos
semelhantes. A abertura de um ficheiro em modo escrita, cria
um ficheiro, que pode ser escrito de duas formas básicas:
– Escrita carácter a carácter, sendo tarefa do programador criar as
sequências adequadas de caracteres para representar números,
palavras, etc...
– Escrita de acordo com determinados padrões (templates)
disponibilizados por primitivas da linguagem.
• Por exemplo, para se escreverem os dados 23 e 45.2 num
ficheiro ( “ 23   45.2 ”), pode-se
– escrever os 11 caracteres sequencialmente, isto é,
‘ ’,‘ ’,‘2’,’3’,‘ ’,‘ ’,‘4’,‘5’,‘.’,’2’,‘ ’
– indicar como padrão de escrita um inteiro (com 4 dígitos, seguido de
um espaço, seguido de um decimal com 5 casas, incluindo uma casa
decimal, seguido de um espaço.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
15
Exemplo de Regressão Linear
• Assumamos pois um ficheiro em duas
colunas, em que
188
40
145
– A primeira coluna representa o número de
peças de cada lote (Pi)
– A segunda coluna, o número de horas
necessárias para produzir esse lote (Ti)
.........
61
139
Objectivos:
• Estabelecer uma relação linear T = t1 P + t0 ;
• Escrever um ficheiro em 3 colunas em
188
40
que:
– As duas primeiras colunas são como antes
– A 3ª coluna, representa a diferença entre o
tempo estimado e o tempo gasto
efectivamente .
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
606.39
161.35
396.18
145
196.93
357.33
606.39
161.35
396.18
19.51
19.55
-61.39
.............
61
139
196.93
357.33
-8.03
-82.19
16
Entrada de Dados
• A instrução fopen abre o ficheiro com o nome “linear.txt”, em
modo de leitura (“r” - read), e atribui-lhe um número de canal
‘fid’, usado posteriormente.
• A instrução fclose fecha o canal com número ‘fid.
[fid,msg] = fopen("linear.txt", "r");
i = 0; X = []; Y = [];
[xi,yi,count] = fscanf(fid,"%i%f",”C”);
while !feof(fid)
i = i + 1;
X(i) = xi;
Y(i) = yi;
[xi,yi,count] = fscanf(fid,"%i%f",”C”);
endwhile;
n=i;
fclose(fid);
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
188
40
145
...
113
88
606.39
161.35
396.18
445.69
248.63
17
Entrada de Dados
• A instrução [xi,yi,count] = fscanf(fid,"%i%f",”C”)
permite ler dados
–
–
–
–
–
do canal de entrada (1º argumento - fid)
de acordo com um padrão (template - ,"%i%f")
como na linguagem C (3º argumento – “C”)
os dados efectivamente lidos são colocados nas variáveis xi e yi
o seu número é colocado na variável count.
• Neste caso, são lidos 2 números do canal de entrada. O
primeiro é um inteiro ("%i") e o segundo é decimal ("%f").
188
[xi,yi,count] = fscanf(fid,"%i%f",”C”); 40
xi = 188
145
yi = 606.39
...
count = 2
113
88
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
606.39
161.35
396.18
445.69
248.63
18
Entrada de Dados
• Quando não há mais dados para ler, a instrução
[xi,yi,count] = fscanf(fid,"%i%f",”C”)
retorna xi e yi vazios (xi = yi = []) e count = 0.
• Normalmente existe uma função “end of file” para indicar se
a última leitura já foi feita após o fim do ficheiro. Em Octave
essa função é expressa por feof(fid).
[xi,yi,count] = fscanf(fid,"%i%f",”C”)
F = feof(fid).
count = 2, xi = 88, yi = 248.63, F = 0
[xi,yi,count] = fscanf(fid,"%i%f",2)
F = feof(fid).
count = 0, xi = [], yi = [],
F = 1
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
188
40
145
...
113
88
606.39
161.35
396.18
445.69
248.63
19
Entrada de Dados
• A instrução fscanf pode pois ser usada no ciclo abaixo, que
instancia os vectores X e Y.
i = 0; X = []; Y = [];
[xi,yi,count] = fscanf(fid,"%i%f",”C”);
while !feof(fid)
i = i + 1;
X(i) = xi;
Y(i) = yi;
[xi,yi,count] = fscanf(fid,"%i%f",”C”);
endwhile;
n = i;
• Notas:
1. A chamada de fscanf é feita antes do ciclo.
2. A condição de entrada no ciclo é !feof
3. A variável n guarda o número de pontos X e Y lidos.
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
20
Tratamento dos Dados
• Uma vez obtidos os vectores X e Y com n pontos, os parâmetros
m, b e r da regressão linear podem ser recalculados, bem como
os erros (valores observados e os valores esperados).
sx = sum(X);
sxy = sum(X.*Y);
sxx = sum(X.*X);
sy = sum(Y);
syy = sum(Y.*Y);
m = (n*sxy-sx*sy)/(n*sxx-sx^2);
b = (sy-m*sx)/n;
r = (n*sxy-sx*sy)/sqrt((n*sxx-sx^2)*(n*syy-sy^2));
E = zeros(1,n);
.for i = 1:n
E(i) = Y(i) - (m * X(i) + b);
endfor;
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
21
Saída dos Dados
• As instruções fopen e fclose são semelhantes, mas com modo
de escrita (“w” - write).
• A instrução fprintf escreve no canal de saída com
identificador fid os 3 valores indicados com formatos:
– Inteiro com 5 dígitos (1º dado – X(i))
– Decimal, com 7 casas, das quais duas decimais (2º/3º dado – Y(i) e E(i))
– Separados por espaços (no template) e com mudança de linha (“\n”)
[fid,msg] = fopen("linear_out.txt", "w");
for i = 1:n
fprintf(fid,"%5i %7.2f %7.2f\n", X(i),Y(i),E(i));
endfor;
fclose(fid);
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
22
Visualização dos Dados
• Ax e Ay , e portanto As, definem os limites dos eixos dos X e Y
(na realidade P – nº de peças e T – tempo de fabrico).
• Os vários plots destinam-se aos valores X e Y (na forma de
pontos – formato “@”, a recta de regressão (Y2 tem os dois
pontos limites) .
Ax = [0,1.1*max(X)]; Ay = [0,1.1*max(Y)];
As = [Ax,Ay];
Y2 = [m*min(Ax)+b, m*max(Ax)+b];
clearplot;
hold on; axis(As);
plot(X,Y,'@33');
plot(Ax,Y2,'2');
4 Novembro 2005
Entradas, Saídas e Análise de Dados
Regressão Linear
23
Download

Entradas, Saídas e Análise de Dados