pcodigo2web/workspace/avaliador/obtertreinotesteclusters.php

294 lines
7.3 KiB
PHP
Executable File

<?php
// Este script seleciona amostras representativas de treino e de teste de cada cluster gerado
function gerartreinoteste($nqt, $cl, $dircluster, $fsel, $fttr, $ftte, $fr, $fr2)
{
$linksubmissoes="http://lcad.inf.ufes.br/soap/submissoes/$nqt";
// Carregar rotulos do cluster
$lb=file($dircluster."labels.txt");
if ($cl<>"rd") // Se cluster tiver mais de um elemento
{
// Carregar matriz de indexação
$m= file($dircluster."matrizreduzida.txt");
$primeiralinha = $m[0];
// Normalizar os índices
unset($m[0]);
$m=array_values($m);
// Número de padrões da matriz
$ni=count($m);
// Abrir arquivos de treino/teste, de rótulos de treino/teste e gravar primeira linha
$arqtr=$dircluster."treino.csv";
$arqte=$dircluster."teste.csv";
$arqltr=$dircluster."ltreino.csv";
$arqlte=$dircluster."lteste.csv";
$ftr= fopen($arqtr,'w');
$fte= fopen($arqte,'w');
$fltr= fopen($arqltr,'w');
$flte= fopen($arqlte,'w');
fwrite($ftr, $primeiralinha);
fwrite($fte, $primeiralinha);
// Obter fracao de selecao
$fracao= explode("/", $fsel[0]);
$num = trim($fracao[0]);
$den = trim($fracao[1]);
if ($den!=0)
{
$razao = ($num/$den);
}
else
{
$razao=0;
}
unset($fracao);
// Se cluster conter duas amostras, selecione a que tiver menos instruções como treino
if ($ni==2)
{
$v1=explode(" ", trim($m[0]));
$v2=explode(" ", trim($m[1]));
$s1=array_sum($v1);
$s2=array_sum($v2);
// Grava treino/teste e seus rotulos
if ($s1<$s2)
{
// Grava no treino e no teste
fwrite($ftr, str_replace(' ', ';', $m[0]));
fwrite($fltr, $lb[0]);
$guarda=trim($lb[0]);
fwrite($fttr, $guarda.";".$cl."\n");
fwrite($fr, $guarda.";-1;X <a href=$linksubmissoes/$guarda/arquivosaida>Ver Saida Gerada</a>"."\n");
fwrite($fr2, $guarda."\n");
fwrite($fte, str_replace(' ', ';', $m[1]));
fwrite($flte, $lb[1]);
$guarda=trim($lb[1]);
fwrite($ftte,$guarda .";".$cl."\n");
fwrite($fr, $guarda.";-1; <a href=$linksubmissoes/$guarda/arquivosaida>Ver Saida Gerada</a>"."\n");
}
else
{
fwrite($ftr, str_replace(' ', ';', $m[1]));
fwrite($fltr, $lb[1]);
$guarda=trim($lb[1]);
fwrite($fttr, $guarda.";".$cl."\n");
$ql=$guarda.";-1; X <a href=$linksubmissoes/".$guarda."/arquivosaida>Ver Saida Gerada</a>"."\n";
fwrite($fr,$ql);
fwrite($fr2, $guarda."\n");
fwrite($fte, str_replace(' ', ';', $m[0]));
fwrite($flte, $lb[0]);
$guarda=trim($lb[0]);
fwrite($ftte,$guarda.";".$cl."\n");
fwrite($fr, $guarda.";-1; <a href=$linksubmissoes/".$guarda."/arquivosaida>Ver Saida Gerada</a>"."\n");
}
unset($v1);
unset($v2);
}
else
{
// Número de amostras sorteadas
$nt=round($razao*$ni);
// Obtém os índices da matriz
$vindices= array_keys($m);
// Grava o treino
for($k=0;$k<$nt;$k++)
{
// Sorteia valor um item da matriz
$vs = array_rand($vindices, 1);
$indv=$vindices[$vs];
$linha= str_replace(' ', ';', $m[$indv]);
$codigo=$lb[$indv];
// Grava em arquivos de treino
fwrite($ftr, $linha);
fwrite($fltr, $codigo);
$guarda=trim($codigo);
fwrite($fttr, $guarda.";".$cl."\n");
fwrite($fr, $guarda.";-1; X <a href=$linksubmissoes/".$guarda."/arquivosaida>Ver Saida Gerada</a>"."\n");
fwrite($fr2, $guarda."\n");
unset($vindices[$vs]);
$vindices=array_values($vindices);
}
// O que sobrou em $vindices grava como teste
$novotam = count($vindices);
for($contind = 0; $contind < $novotam ; $contind++)
{
$iteste = $vindices[$contind];
fwrite($fte, $m[$iteste]);
fwrite($flte, $lb[$iteste]);
$guarda = trim($lb[$iteste]);
fwrite($ftte,$guarda.";".$cl."\n");
fwrite($fr, $guarda.";-1; <a href=$linksubmissoes/$guarda/arquivosaida>Ver Saida Gerada</a>"."\n");
}
unset($vindices);
}
// Descarrega matriz
unset($m);
// Fecha arquivos abertos
fclose($ftr);
fclose($fte);
fclose($fltr);
fclose($flte);
}
else // Cluster com um só elemento (outlier)
{
$tam = count($lb);
for($i=0;$i<$tam;$i++)
{
$parte= explode(";", $lb[$i]);
$guarda = trim($parte[0]);
// Grava para o professor pontuar, mas não vai para o treino, já que é outlier
fwrite($fr, $guarda.";-1; X <a href=$linksubmissoes/".$guarda."/arquivosaida>Ver Saida Gerada</a>"."\n");
unset($parte);
}
}
// Descarrega matriz e seus rotulos
unset($lb);
} // Fim da função
// Início do programa
$diretorioentrada = "indexados/";
$diretoriopredicao = "arquivospredicao/";
$fracaoselecao = file("arquivosselecao/fracaoselecao.csv");
$minimo = 3; // Se o professor pontuou pelo menos 3 amostras, ele já iniciou processo.
$ponteiro1 = opendir($diretorioentrada);
// Para cada subdiretorio do diretorio de entrada
while (($nomequestao = readdir($ponteiro1)))
{
if (($nomequestao<>".") && ($nomequestao<>".."))
{
// Se existe notastreino.csv e o professor corrigiu menos de 10% da base,
// isto é, 90% das amostras estão em pontuadas em -1, podemos atualizar treino e teste
$diretorioquestao= $diretorioentrada.$nomequestao."/";
$diretorioclusters= $diretorioquestao."clusters/";
if (file_exists($diretorioclusters))
{
// Arquivo com todos os rótulos de treino e com o número do cluster
$ltreino = $diretorioquestao."ltreino.csv";
$lteste = $diretorioquestao."lteste.csv";
$lresultado=$diretorioquestao."resultado.csv";
$lresultado2=$diretorioquestao."/professordevepontuar.csv";
$frotulostreino= fopen($ltreino,'w');
$frotulosteste= fopen($lteste,'w');
$frotulosresultado= fopen($lresultado,'w');
$frotulosresultado2= fopen($lresultado2,'w');
$ponteiro2 = opendir($diretorioclusters);
// Para cada subdiretorio do diretorio clusters
while (($nomecluster = readdir($ponteiro2)))
{
if (($nomecluster<>".") && ($nomecluster<>"..") )
{
$enderecocluster= $diretorioclusters.$nomecluster."/";
gerartreinoteste($nomequestao, $nomecluster, $enderecocluster, $fracaoselecao, $frotulostreino, $frotulosteste, $frotulosresultado, $frotulosresultado2);
}
}
fclose($frotulostreino);
fclose($frotulosteste);
fclose($frotulosresultado);
fclose($frotulosresultado2);
} // FIm do If ==> se existem clusters
} // Fim do If
} // Fim do While
unset($fracaoselecao);
?>