ДИПЛОМ_ИПОВС / Казначев А.А. Диплом
.pdf* @param int $lenghtEntersy */
function __construct($lenghtEnters){ for($i=0;$i!=$lenghtEnters;$i++){
$this->weight[$i]= rand(10, 30)/100;
}
}
/** * Функция активации
*
*@param int $x
*@return int */
function active($x){ //тангенциальная return tanh($x); //экспоненциальная
//return 1/(1+exp(-$x));
}
/**
* Функция вычисления выхода
*
* @param array $enters */
function solve($enters){ $this->entersToStudy=$enters; $this->summ=0;
91
for($i=0;$i<count($enters);$i++){ $this->summ+=$enters[$i]*$this->weight[$i];
}
$this->outers=$this->active($this->summ);
}
/**
* Функция вывода данных нейрона на экран
*/
function display(){ echo " summ "; echo $this->summ; echo " outers "; echo $this->outers; echo " weidth ";
echo print_r($this->weight); echo " enters ";
echo print_r($this->entersToStudy); echo " error ";
echo $this->errorOnNeuron; echo "<br>";
}
/**
* Функция получения весов нейрона
*
* @return array */
function getWidth(){ $result;
92
$count=0;
foreach ($this->weight as $weightOne){ $result[$count]=$weightOne; $count++;
}
return $result;
}
/**
* Функция установки весов нейрона
*
* @param array $weight */
function setWidth($weight){ $this->weight=$weight;
}
}
2.2 Класс NeuroLayer
<?
/**
* Класс, реализующий модель слоя из нейронов
*/
class NeuroLayer{
public $outersLayer; public $neurons;
93
/**
* Конструктор класса
*
*@param int $countNeurons
*@param int $countEnters */
function __construct($countNeurons,$countEnters){ for($i=0;$i!=$countNeurons;$i++){
$this->neurons[$i]=new Neuron($countEnters);
}
}
/**
* Функция вычисления выхода
*
* @param array $enters */
function solve($enters){ for($i=0;$i!=count($this->neurons);$i++){
$this->neurons[$i]->solve($enters); $this->outersLayer[$i]=$this->neurons[$i]->outers;
}
}
/**
* Функция вывода данных слоя на экран
*/
function display(){
echo count($this->neurons)."<br>";
94
foreach ($this->neurons as $neuron){ $neuron->display();
}
}
/**
* Функция получения весов нейронов данного слоя
*
* @return array */
function getWidth(){ $result; $count=0;
foreach ($this->neurons as $neuron){ $result[$count]=$neuron->getWidth(); $count++;
}
return $result;
}
/**
* Функция установки весов нейронов данного слоя
*
* @param array $weight */
function setWidth($weight){ for($i=0;$i!=count($this->neurons);$i++){
$this->neurons[$i]->setWidth($weight[$i]);
}
95
}
}
2.3 Класс NeuroNet
<?
/**
* Класс, реализующий нейронную сеть
*/
class NeuroNet{
public $outerNet;
public $layers;
public $minMaxToNormalize;
/**
* Конструктор класса,принимает массив первым элементом которого является число входов, а последующие число нейронов на скрытых слоях
*
* @param int $countNeuronsOnLayer
*/
function __construct($countNeuronsOnLayer){
for($i=1;$i!=count($countNeuronsOnLayer);$i++){
$this->layers[$i-1]=new NeuroLayer($countNeuronsOnLayer[$i],$countNeuronsOnLayer[$i-1]);
}
}
/**
* Функция производной функции активации
*
* @param int $x
96
*
* @return int */
function proiz($x){
//тангенциальная
return 1/(cosh($x)*cosh($x));
//экспоненциальная
//return exp(-$x)/((1+exp(-$x))*(1+exp(-$x)));
}
/**
* Функция вычисления выхода
*
* @param array $enters */
function solve($enters){ $this->layers[0]->solve($enters); for($i=1;$i!=count($this->layers);$i++){
$this->layers[$i]->solve($this->layers[$i-1]->outersLayer);
}
$this->outerNet=$this->layers[count($this->layers)-1]->outersLayer;
}
/**
* Функция обучения на одном наборе данных,один набор входов один набор выходов
*
*@param array $enters
*@param array $outerMassive
*@param int $countOne
97
*
* @return double */
function studyOne($enters,$outerMassive,$countOne){
//решаем $this->solve($enters); $globalerror=0;
//получим выходы и вычислим ошибку на каждом нейроне выходного слоя for($i=0;$i!=count($outerMassive);$i++){
$errorOnEndLayer[$i]=0;
$errorOnEndLayer[$i]=($outerMassive[$i]-$this- >outerNet[$i])*$this->proiz($this->layers[count($this->layers)-1]- >neurons[$i]->summ);
$this->layers[count($this->layers)-1]->neurons[$i]- >errorOnNeuron=$errorOnEndLayer[$i];
if($globalerror<abs($outerMassive[$i]-$this->outerNet[$i])){ $globalerror=abs($outerMassive[$i]-$this->outerNet[$i]);
}
}
for($numberLayer=count($this->layers)-2;$numberLayer>-1;$numberLayer-
-){
$numberLayerPrev=$numberLayer+1; for($i=0;$i!=count($this->layers[$numberLayer]->neurons);$i++){
//перебираем все ошибки на предыдущем слое $errorOnNeuron[$i]=0;
for($j=0;$j!=count($this->layers[$numberLayerPrev]-
>neurons);$j++){
$errorOnNeuron[$i]+=$this->layers[$numberLayerPrev]- >neurons[$j]->errorOnNeuron*$this->layers[$numberLayerPrev]->neurons[$j]- >weight[$i];
}
//конечная ошибка на каждом нейроне
98
$errorOnNeuron[$i]=$errorOnNeuron[$i]*$this->proiz($this- >layers[$numberLayer]->neurons[$i]->summ);
$this->layers[$numberLayer]->neurons[$i]- >errorOnNeuron=$errorOnNeuron[$i];
}
}
//прямой проход меняем веса
for($i=0;$i!=count($this->layers);$i++){
for($j=0;$j!=count($this->layers[$i]->neurons);$j++){
//найдем ню по хайникену стр 253, как обратную величину квадратного корня из суммы весов, РАБОТАЕТ ПЛОХО
for($k=0;$k!=count($this->layers[$i]->neurons[$j]-
>weight);$k++){
$this->layers[$i]->neurons[$j]- >deltaWeight[$k]=0.4*$this->layers[$i]->neurons[$j]- >deltaWeight[$k]+0.1*$this->layers[$i]->neurons[$j]->errorOnNeuron*$this- >layers[$i]->neurons[$j]->entersToStudy[$k];
$this->layers[$i]->neurons[$j]->weight[$k]=$this- >layers[$i]->neurons[$j]->weight[$k]+$this->layers[$i]->neurons[$j]- >deltaWeight[$k];
}
}
}
return $globalerror;
}
/**
* функция обучения на обучающей выборке
*
*@param array $entersMassive
*@param array $exitMassive
*@param int $countEpoch
*@param int $errorLevel
99
*
* @return mixed */
function study($entersMassive,$exitMassive,$countEpoch,$errorLevel){ $gl=0;
for($j=0;$j<$countEpoch;$j++){ $gl=0;
//берем все ключи $numberOfStudyArray=array_keys($entersMassive);
//перемешиваем shuffle($numberOfStudyArray); for($i=0;$i!=count($entersMassive);$i++)
{
$err=$this->studyOne($entersMassive[$numberOfStudyArray[$i]], $exitMassive[$numberOfStudyArray[$i]],$j);
if($gl<$err){
$gl=$err;
}
}
$massivetoGraf[]=[$j,$gl]; if($gl<($errorLevel/1.2)){
return $j; break;
}
}
return $gl;
}
/**
* Функция вывода данных сети на экран
100