Você está na página 1de 16

Trabalho 2 - Cálculo Numérico

Paulo Marcus Haratani Marques Meira

16/02/2021

Introdução:
A habilidade de prever o futuro sempre foi cobiçada ao longo da história da humanidade. De histórias
bíblicas até videntes como Nostradamus, qualquer um que possuíse o conhecimento do futuro logo se tornava
uma pessoa de destaque, bem quista por reis e grandes comerciantes. Embora essa habilidade seja tida como
um poder sobrenatural ou fictício, a verdade é que hoje qualquer pessoa pode prever com um certo grau
de exatidão uma vasta gama de eventos, desde que seja instruída para tal, através de métodos estatísticos
conhecidos como “Regressão”, e o conhecimento destes é quase tão requisitado no mercado de trabalho
quanto eram os poderes de vidência na antiguidade, sendo imprescindíveis para qualquer um que almeje
trabalhar na área de Ciência de Dados.
Tendo em mente a importancia de tais metodos, este trabalho tem como objetivo solucionar três problemas
utilizando um método de regressão em específico, a saber a Regressão Logística. Ao longo das soluções
também será utilizado o método de decomposição matricial por valores singulares. Sabendo que ambos
possuem uma base matemática muito extensa, não irei me aprofundar em explicações sobre estas.
Uma vez que tais soluções foram realizadas no Matlab, será abordado em seguida as entradas utilizadas
no programa para que as soluções pudesse ser obtida, bem como os resultados alcançados. Seguidamente,
falarei sobre os scripts em si, passo a passo.

Entradas:
Como entrada, foram utilizados três bases de dados, todas obtidas no repositório da Universidade da Califór-
nia, Irvine (UCI). As bases de dados foram a base “Iris”, que possui 150 observações de quatro atributos, base
“Wine”, que possui 178 observações de treze atributos, e a base “Breast Cancer Wisconsin (Diagnostic)”, que
possui 683 observações de 9 atributos. Atributos que não contribuiriam para a resolução do problema foram
excluidos anteriormente. No caso específico da base “Breast Cancer Wisconsin (Diagnostic)”, eu realizei um
ordenamento das linhas através do tipo de câncer apresentado (variável categórica que foi retirada da base
após o ordenamento) no ambiente R. Além disso, algumas linhas apresentavam valores faltantes (NA’s), mas
como o número de linhas com NA’s era ínfimo em relação ao total, eu retirei essas linhas da base também.
Obs: No repositório UCI havia mais de um formato da base de dados “Breast Cancer Wisconsin (Diagnostic)”.
Obtive as soluções para duas delas, uma aparente mais mal comportada (a descrita anteriormente), e a outra,
melhor organizada, contendo 30 atributos e 568 observações. Também realizei o ordenamento desta segunda
base no ambiente R.
Obs2: Também sobre a base “Breast Cancer Wisconsin (Diagnostic)”, as classes na base menos organizada
são 2 -> Câncer (tumor) Benigno e 4 -> Câncer (tumor) Malígno. Mantive a notação “tipo 2” para câncer
benigno na análise da base mais organizada, uma vez que já havia realizado a analise na outra base.

1
Saídas:
O resultado final, para cada base de dados, são três gráficos. O primeiro indica a importância de cada
atributo para o modelo. O segundo contêm a classificação utilizada no problema, ou seja, sobre qual classe
queremos realizar predições. Por fim, o terceiro gráfico exibe o comportamento das observações da base de
dados no modelo utilizado, e através dele podemos inferir um limite para classificar os dados.

Método:
Primeiramente, acessei o Repositório UCI (<- nesse link), e baixei as bases de dados. Feito isso, iniciei as
operações no Matlab.
Obs: Inicialmente, colocarei o passo a passo das operações com a base de dados Iris. O restante das operações
será exibido na seção “Scripts”.

• Realizei a decomposição por valores singulares da base de dados, obtendo as matrízes U, S e V, e plotei
a diagonal da matriz S, para analizar a importância dos atributos:

>> A = iris’;
>> [U, S, V] = svd(A);
>> s = diag(S);
>> s = s*(1/sum(s));
>> plot(s)

2
• Observando que os atributos de maior importância no modelo são os dois primeiros, os utilizei para
classificar os dados da base, plotando o gráfico em seguida:

>> Aux = S*V’;


>> x = Aux(1,:);
>> y = -Aux(2,:);
>> plot(x(51:100), y(51:100), ’ob’)
>> hold on
>> x1 = Aux(1, 1:50);
>> x2 = Aux(1, 101:end);
>> xp = horzcat(x1, x2);
>> y1 = -Aux(2, 1:50);
>> y2 = -Aux(2, 101:end);
>> yp = horzcat(y1, y2);
>> plot(xp, yp, ’sr’)
>> title(’Classificador para Iris Versicolor’)
>> hold off

• Em seguida, partindo para a regressão logística de fato, com base na classificação realizada, defini a
minha matriz b, para resolver o sistema de equações lineares α = Ab, onde A é a nossa base de dados.
O resultado obtido são os coeficientes βi do modelo de regressão, utilizados no modelo para verificar
se dados futuramente obtidos se encaixam na categoria delimitada ou não. Em seguida, plotei o ajuste
utilizado na própria base de dados, para observar se o modelo foi bem ajustado. Em muitos casos, um
ajuste perfeito é irreal, uma vez que os dados raramente se dividem em categorias bem definidas.

3
>> lg1 = log(0.9999/(1-0.9999));
>> lg0 = log(0.0001/(1-0.0001));
>> b = zeros(150,1);
>> b(51:100) = lg1;
>> b(1:50) = lg0;
>> b(101:end) = lg0;

>> alpha = A’\b;


>> aux = A’ * alpha;
>> num = exp(aux);
>> p = num./(1+num);
>> figure
>> plot(p, ’*’);

• Como observado, uma vez que a categoria escolhida na base de dados se mistura com outra, o ajuste
do modelo é pouco eficiente, tendo um grau alto de incerteza. Para tentar minimizar o erro, procurei
formas de definir um ponto de corte para o modelo, um valor x tal que valores abaixo dele não
pertenceriam a categoria definida, enquanto valores acima dele pertenceriam. Para tal, observei a
média e a mediana dos valores previstos pelo modelo para os dois grupos, e tomei decisões a partir de
seus valores.

>> q1 = A(1:end, 51:100)’;


>> q2_1 = A(1:end, 1:50)’;
>> q2_2 = A(1:end, 101:end)’;
>> q2 = vertcat(q2_1, q2_2);
>> num1 = q1*alpha;
>> num1 = exp(num1);
>> pq1 = num1/(1+num1);
>> num2 = q2*alpha;
>> num2 = exp(num2);
>> pq2 = num2/(1+num2);

4
>> media1 = mean(pq1(1:end, 13))
0.0344

>> media2 = mean(pq2(1:end, 73))


0.0294

>> mediana1 = median(pq1(1:end, 13))


0.0026

>> mediana2 = median(pq2(1:end, 73))


2.0932e-05

• No caso da base iris, observei que a média dos dois grupos é muito próxima. Concluí através de
observações das matrizes pq que a proximidade das médias se devia a outliers em ambas as matrizes,
portanto optei pela mediana como ponto de corte. Acredito que um valor razoável para corte com baixo
erro seria 4.1864e-04, ou 0.00042, aproximadamente 20 vezes a mediana do grupo que não pertence a
categoria delimitada. Esse valor é bastante superior à mediana obtida, mas ainda é menos da metade
da mediana observada para o grupo pertencente à categoria delimitada.
• Realizei as mesmas operações para as outras bases de dados. Através dos dados observados, acredito
que os scripts apresentados nesse trabalho possam analizar, com baixo erro, se outras entradas de
dados pertencem ou não à categoria delimitada em cada banco.

• Para um ajuste mais preciso, a solução seria adotar valores com mais casas para limx→+∞ log x e
limx→0 log x. Sabendo que se pra qualquer valor y existe um log(x) tal que y = logx, podemos assumir
valores suficientemente grandes para que o nosso modelo fique melhor ajustado, porém isso levaria a
um aumento enorme no número de casas decimais das observações, como veremos a seguir.

lg1 = 200;
lg0 = -200;
b = zeros(150,1);
b(51:100) = lg1;
b(1:50) = lg0;
b(101:end) = lg0;

alpha = A’\b;
aux = A’ * alpha;
num = exp(aux);
p = num./(1+num);
figure
plot(p, ’*’);

5
Observamos que assumindo os valores de log(x) como 200 e -200, as observações se tornam muito mais
bem comportadas. No entanto, quando analisamos os seus valores (observando a mediana), percebemos um
aumento assustador no número de casas decimais. Realizar análises com tantas casas decimais pode ser
difícil a depender da máquina.

media1 = mean(pq1(1:end, 13))


0.02
media2 = mean(pq2(1:end, 73))
0.01
mediana1 = median(pq1(1:end, 13))
2.850797158077797e-56
mediana2 = median(pq2(1:end, 73))
1.003539977327751e-101

A medida que os dados se tornaram mais bem comportados, as médias tendem a 0.02 e 0.01 respectivamente
(testes com valores superiores de log(x) não impactaram nas médias). Contudo, devido ao número de casas
decimais das medianas, se torna complexo definir onde se situaria o ponto de corte.

Scripts:
• Wine

6
>> A = wine’;
>> [U, S, V] = svd(A);
>> s = diag(S);
>> s = s*(1/sum(s));
>> plot(s, ’*’)

Observamos que mais uma vez os atributos mais influentes são os dois primeiros.

>> Aux = S*V’;


>> x = Aux(1,:);
>> y = -Aux(2,:);
>> plot(x(1:59), y(1:59), ’ob’)
>> hold on
>> plot(x(60:end), y(60:end), ’sr’)
>> title(’Classificador para Vinho tipo 1’)
>> hold off

7
A separação dos dados aqui é um pouco melhor que no caso da categoria Versicolor da base Iris. Percebemos
que a categoria desejada nesse caso possui as suas observações concentradas no canto superior direito do
gráfico. Esse comportamento mais bem definido se reflete no comportamento do modelo, como veremos a
seguir.

>> lg1 = log(0.99999999/(1-0.99999999));


>> lg0 = log(0.00000001/(1-0.00000001));
>> b = zeros(178,1);
>> b(1:59) = lg1;
>> b(60:end) = lg0;

>> alpha = A’\b;


>> aux = A’ * alpha;
>> num = exp(aux);
>> p = num./(1+num);
>> figure
>> plot(p, ’*’);

8
De fato, apesar de alguns poucos valores centrais, a maioria das observações do modelo se concentram nas
bordas, como é desejado em uma regressão logística.

>> q1 = A(1:end, 1:59)’;


>> q2 = A(1:end, 60:end)’;
>> num1 = q1*alpha;
>> num1 = exp(num1);
>> pq1 = num1/(1+num1);
>> num2 = q2*alpha;
>> num2 = exp(num2);
>> pq2 = num2/(1+num2);

>> media1 = mean(pq1(1:end, 19))


0.0240

>> media2 = mean(pq2(1:end, 51))


0.0070

>> mediana1 = median(pq1(1:end, 19))


2.1291e-09

>> mediana2 = median(pq2(1:end, 51))


3.0806e-08

9
Diferentemente do problema da base Iris, na base Wine as mediânas das matrizes pq não são bons parâmetros
para o ponto de corte, uma vez que a mediâna do grupo que não pertênce à categoria 1 de vinhos é mais
alta que a do grupo que pertence. Apesar disso, as médias aqui são parâmetros bastante bons, tendo em
vista que a média do grupo não pertencente à categoria é menos da metade da média do grupo pertencente.
Com isso em mente, acredito que 0.014 (duas vezes a média do grupo não pertencente) seja um ponto de
corte com baixo erro.

• Breast Cancer Wisconsin (Diagnostic), base menos organizada:

Como dito anteriormente, achei necessário ordenar essa base de dados para que fosse possível realizar a
analise da forma proposta. Uma vez que tenho mais domínio desse tipo de operação utilizando o ambiente
R, realizei as modificações nele, e criei um novo arquivo contendo os dados ordenados. Nenhuma linha ou
coluna foi modificada no ambiente R, apenas a ordenação foi realizada.

bs = breast.cancer.wisconsin
bs = bs[order(bs$V11),]
write.csv(bs, "bscancer.csv", row.names = FALSE)

>> A = bscancer’;
>> [U, S, V] = svd(A);
>> s = diag(S);
>> s = s*(1/sum(s));
>> plot(s, ’*’)

Diferentemente das bases anteriores, todos os atributos possuem um peso expressivo na base. Apesar disso,

10
mantive a opção de utilizar apenas os dois primeiros, tendo em vista que o primeiro é, de longe, o mais
expressivo.

>> Aux = S*V’;


>> x = Aux(1,:);
>> y = -Aux(2,:);
>> plot(x(1:444), y(1:444), ’ob’)
>> hold on
>> plot(x(445:end), y(445:end), ’sr’)
>> title(’Classificador para Câncer tipo 2’)
>> hold off

Os dados são claramente mal distribuidos. A maior parte dos valores do classificador se encontram no lado
superior direito do gráfico, porém existem muitos valores dispersos e se misturando com os valores não
pertencentes ao classificador. Isso diminui a eficiência do modelo. É previsível que, uma vez que boa parte
dos dados não seguem um padrão, haverão varios valores centrais na plotagem dos valores ajustados no
modelo.

>> lg1 = log(0.9999/(1-0.9999));


>> lg0 = log(0.0001/(1-0.0001));
>> b = zeros(683,1);
>> b(1:444) = lg1;
>> b(445:end) = lg0;

11
>> alpha = A’\b;
>> aux = A’ * alpha;
>> num = exp(aux);
>> p = num./(1+num);
>> figure
>> plot(p, ’*’);

Como previsto, o ajuste é quase completamente aleatório. Adotar limx→1 log x e limx→0 log x com mais casas
decimais aumentaria a precisão, porêm os clusters permaneceriam mal definidos.

>> q1 = A(1:end, 1:444)’;


>> q2 = A(1:end, 445:end)’;
>> num1 = q1*alpha;
>> num1 = exp(num1);
>> pq1 = num1/(1+num1);
>> num2 = q2*alpha;
>> num2 = exp(num2);
>> pq2 = num2/(1+num2);

>> media1 = mean(pq1(1:end, 68));


0.0032
>> media2 = mean(pq2(1:end, 46));
0.0046
>> mediana1 = median(pq1(1:end, 68));
6.7690e-05
>> mediana2 = median(pq2(1:end, 46));
1.6743e-09

Mais uma vez, é observável que a mediana é o melhor parâmetro para se utlizar como ponto de corte. Assumi

12
3.3486e-07 (200x a mediana do grupo não pertencente à categoria selecionada) seria um bom ponto de corte,
uma vez que é um valor bastante distante da mediana do grupo não pertencente, mas também inferior é à
mediana do grupo pertencente.

• Breast Cancer Wisconsin (Diagnostic), base mais organizada:

>> A = bscancer1’;
>> [U, S, V] = svd(A);
>> s = diag(S);
>> s = s*(1/sum(s));
>> plot(s, ’*’)

Nessa versão da base de dados temos 21 atributos a mais, o que facilita a distinção dos grupos. Além disso,
temos menos observações, uma vez que as observações com valores faltantes da primeira base não constam
nessa segunda, e aparentemente observações que poderiam confundir o modelo pertencendo à ambas as
classificações também foram retiradas.

>> Aux = S*V’;


>> x = Aux(1,:);
>> y = -Aux(2,:);
>> plot(x(1:357), y(1:357), ’ob’)
>> hold on
>> plot(x(358:end), y(358:end), ’sr’)
>> title(’Classificador para Câncer Benigno’)
>> hold off

13
De fato, os dados estão bem mais comportados nessa base, com o grupo marcado pelo classificador es-
tando agrupado quase que exclusivamente no lado superior direito do gráfico, enquanto que os valores não
pertencentes ao grupo estão bastante dispersos ao longo do gráfico.

>> lg1 = 20;


>> lg0 = -20;
>> b = zeros(569,1);
>> b(1:357) = lg1;
>> b(358:end) = lg0;
>> alpha = A’\b;
>> aux = A’ * alpha;
>> num = exp(aux);
>> p = num./(1+num);
>> figure
>> plot(p, ’*’);

14
Adotei os valores de log(x) como 20 e -20, portanto é perceptível que o ajuste é bem mais eficiente que o ajuste
da base desorganizada. Mas mesmo sem valores tão altos de log(x) já era apresentada uma qualidade maior,
devido a melhor organização e maior quantidade de atributos relevantes, tornando mais fácil a distinção
entre as duas categorias.

>> q1 = A(1:end, 1:357)’;


>> q2 = A(1:end, 358:end)’;
>> num1 = q1*alpha;
>> num1 = exp(num1);
>> pq1 = num1/(1+num1);
>> num2 = q2*alpha;
>> num2 = exp(num2);
>> pq2 = num2/(1+num2);

>> media1 = mean(pq1(1:end, 95));


0.003224730330357

>> media2 = mean(pq2(1:end, 35));


0.008303084422045

>> mediana1 = median(pq1(1:end, 95));


8.283080974383029e-10

>> mediana2 = median(pq2(1:end, 35));

15
2.228698560998185e-12

Por fim, como a média do grupo não pertencente à categoria selecionada é mais alta do que a média do grupo
pertencente, acredito que a mediana seja um parâmetro mais eficiente para o ponto de corte. Adotando
2.2286e-11 como ponto de corte, acredito que o erro do ajuste seja mínimo.

Conclusão
Ao longo deste trabalho, foram solucionados problemas de regressão logística de diferentes tipos, cada qual
com características únicas. Foi observado que dados bem comportados, com categorias bem definidas, são
bastante simples de ser trabalhar (Como por exemplo a base Wine), enquanto dados confusos sem clusters
bem definidos são bem mais complexos. A solução da base “Breast Cancer Wisconsin (Diagnostic)” mal
organizada deixou muito a desejar, e embora os pontos de corte dessa base e da base Iris tenham sido
selecionados com base estatística, é certo que o erro em ambos os modelos é maior do que o desejável. Por
outro lado, no caso da base “Breast Cancer Wisconsin (Diagnostic)” bem organizada, com mais atributos,
é visível uma qualidade maior no modelo, evidenciando o quanto a organização e o volume de informações
sobre cada classe é de altissima importância.

Referências Bibliográficas:
Nesse trabalho, utilizei primariamente as informações nos vìdeos postados pelo professor. Incluí outros
materiais como fonte de informação, mas pouco destes materiais foi incluido no trabalho em si.

• https://archive.ics.uci.edu/ml/index.php
• https://www.google.com/url?sa=t&source=web&rct=j&url=https://www.di.ubi.pt/~cbarrico/
Disciplinas/ComputacaoCientifica/Downloads/Matlab_1.pdf&ved=2ahUKEwiQs-jB--7uAhWMHrkGHZzuDk8QFjAA
usg=AOvVaw12EniZUwYFrwSXw2xUnQbt (Comandos do Matlab utilizados nos scripts)
• https://www.ufsj.edu.br/portal2-repositorio/File/nepomuceno/mn/08MN_SL6.pdf (Para mais infor-
mações sobre a Decomposição por Valores Singulares)
• https://matheusfacure.github.io/2017/02/25/regr-log/(Para mais informações sobre Regressão Logís-
tica)

16

Você também pode gostar