pcodigo2web/workspace/avaliador/obtertreinotesteclusters2.php

269 lines
6.1 KiB
PHP
Executable File

<?php
// Este script seleciona amostras representativas de treino e de teste de cada cluster gerado
function gerartreinoteste($cl, $dircluster, $fsel, $fttr, $ftte)
{
// Carregar matriz de indexação e seus rotulos
$m= file($dircluster."matrizreduzida.txt");
$lb=file($dircluster."labels.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
fwrite($ftr, str_replace(' ', ';', $m[0]));
fwrite($fltr, $lb[0]);
fwrite($fttr, trim($lb[0]).";".$cl."\n");
fwrite($fte, str_replace(' ', ';', $m[1]));
fwrite($flte, $lb[1]);
fwrite($ftte, trim($lb[1]).";".$cl."\n");
}
else
{
fwrite($ftr, str_replace(' ', ';', $m[1]));
fwrite($fltr, $lb[1]);
fwrite($fttr, trim($lb[1]).";".$cl."\n");
fwrite($fte, str_replace(' ', ';', $m[0]));
fwrite($flte, $lb[0]);
fwrite($ftte, trim($lb[0]).";".$cl."\n");
}
unset($v1);
unset($v2);
}
else
{
// Obter nt= numero de amostras de treino
if ($ni==3 || $ni==4)
{
$nt = 2;
}
else
{
// Se o cluster tiver mais de três amostras seleciona uma fracao de amostras de treino
$nt=round($razao*$ni);
}
// Obtém os índices da matriz
$vindices= array_keys($m);
// Calcular a soma de caracteristicas de cada padrão e armazena em vetor
$soma=array();
$maior=0;
for($k=0;$k<$ni;$k++)
{
$linha= trim($m[$k]);
$vet = explode(" ", $linha);
$soma[$k]= array_sum($vet);
unset($vet);
}
$maior = max($soma);
$menor = min($soma);
$imenor = array_search($menor, $soma);
$imaior = array_search($maior, $soma);
$ns = count($soma);
$ss = array_sum($soma);
if ($ns!=0)
{
$media = $ss/$ns;
}
else
{
$media=0;
}
//-------------------------------------------------------------------------------------------
//------------------------------------------------------------------------------------------
// Grava no treino o padrão com menor e maior soma e com valor médio
fwrite($ftr, $m[$imenor]);
fwrite($ftr, $m[$imaior]);
fwrite($fltr, $lb[$imenor]);
fwrite($fltr, $lb[$imaior]);
fwrite($ftr, $m[$imedia]);
fwrite($fltr, $lb[$imedia]);
unset($soma[$imaior]);
unset($soma[$imenor]);
unset($soma[$imedia]);
$vindices=array_values($vindices);
unset($soma);
// O que sobrou em $vindices grava como teste
foreach($vindices as $iteste)
{
fwrite($fte, $m[$iteste]);
fwrite($flte, $lb[$iteste]);
fwrite($ftte, trim($lb[$iteste]).";".$cl."\n");
}
unset($vindices);
}
// Descarrega matriz e seus rotulos
unset($m);
unset($lb);
// Fecha arquivos abertos
fclose($ftr);
fclose($fte);
fclose($fltr);
fclose($flte);
} // Fim da função
// Início do programa
$diretorioentrada = "indexados/";
$fracaoselecao = file("arquivosselecao/fracaoselecao2.csv");
$ponteiro1 = opendir($diretorioentrada);
// Para cada subdiretorio do diretorio de entrada
while (($nomequestao = readdir($ponteiro1)))
{
if (($nomequestao<>".") && ($nomequestao<>".."))
{
$diretorioquestao= $diretorioentrada.$nomequestao."/";
$diretorioclusters= $diretorioquestao."clusters/";
// Arquivo com todos os rótulos de treino e com o número do cluster
$ltreino = $diretorioquestao."ltreino.csv";
$lteste = $diretorioquestao."lteste.csv";
$frotulostreino= fopen($ltreino,'w');
$frotulosteste= fopen($lteste,'w');
// Arquivo com todos os rótulos de teste e com o número do cluster
// Arquivo com fracao de selecao
$ponteiro2 = opendir($diretorioclusters);
// Para cada subdiretorio do diretorio clusters
while (($nomecluster = readdir($ponteiro2)))
{
if (($nomecluster<>".") && ($nomecluster<>"..") && ($nomecluster<>"rd"))
{
$enderecocluster= $diretorioclusters.$nomecluster."/";
gerartreinoteste($nomecluster, $enderecocluster, $fracaoselecao, $frotulostreino, $frotulosteste);
}
}
fclose($frotulostreino);
fclose($frotulosteste);
}
}
unset($fracaoselecao);
?>