Gradient descent training + Added all dataset + graphs improvements
Some checks failed
linter / quality (push) Failing after 18s
tests / ci (8.4) (push) Failing after 10s
tests / ci (8.5) (push) Failing after 11s

This commit is contained in:
2026-03-13 22:06:08 +01:00
parent f8d9fbc5b1
commit f0e7be4476
29 changed files with 872 additions and 68 deletions

View File

@@ -2,14 +2,14 @@
namespace App\Http\Controllers;
use App\Models\SimplePerceptron;
use App\Models\SimplePerceptronTraining;
use App\Events\PerceptronInitialization;
use App\Models\GradientDescentPerceptronTraining;
use App\Models\SimpleBinaryPerceptronTraining;
use App\Services\DataSetReader;
use App\Services\ISynapticWeightsProvider;
use App\Services\PerceptronIterationEventBuffer;
use App\Services\ZeroSynapticWeights;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
class PerceptronController extends Controller
{
@@ -18,29 +18,32 @@ class PerceptronController extends Controller
*/
public function index(Request $request)
{
$perceptronType = $request->query('type', 'simple');
$perceptronType = $request->query('type');
$learningRate = 0.1;
$maxIterations = 100;
$learningRate = 0.01;
$maxIterations = 200;
$minError = 0.6;
switch ($perceptronType) {
case 'simple':
$learningRate = 0.015;
$maxIterations = 100;
$maxIterations = 150;
break;
case 'gradientdescent':
$learningRate = 0.00003;
}
return inertia('PerceptronViewer', [
'type' => $perceptronType,
'sessionId' => session()->getId(),
'datasets' => $this->getDatasets(),
'minError' => 0.01,
'datasets' => $this->getDatasets($perceptronType),
'minError' => $minError,
'learningRate' => $learningRate,
'maxIterations' => $maxIterations,
]);
}
private function getDatasets(): array
private function getDatasets(string $perceptronType): array
{
$dataSetsDirectory = public_path('data_sets');
$files = scandir($dataSetsDirectory);
@@ -51,17 +54,44 @@ class PerceptronController extends Controller
$dataset['label'] = str_replace('.csv', '', $file);
$dataSetReader = new DataSetReader($dataSetsDirectory . '/' . $file);
$dataset['data'] = [];
foreach ($dataSetReader->lines as $line) {
$dataset['data'][] = [
'x' => $line[0],
'y' => $line[1],
'label' => $line[2],
];
switch (count($dataSetReader->lines[0])) {
case 3:
foreach ($dataSetReader->lines as $line) {
$dataset['data'][] = [
'x' => $line[0],
'y' => $line[1],
'label' => $line[2],
];
}
break;
case 2:
foreach ($dataSetReader->lines as $line) {
$dataset['data'][] = [
'x' => $line[0],
'y' => $line[1],
'label' => 1,
];
}
break;
default:
$dataset['data'] = null; // Not supported for viewing
break;
}
switch ($dataset['label']) {
case '2.9':
$dataset['defaultLearningRate'] = 0.015;
case 'logic_and_gradient':
switch ($perceptronType) {
case 'gradientdescent':
$dataset['defaultLearningRate'] = 0.3;
break;
}
break;
case 'table_2_9':
switch ($perceptronType) {
case 'simple':
$dataset['defaultLearningRate'] = 0.015;
break;
}
break;
}
$datasets[] = $dataset;
@@ -78,7 +108,7 @@ class PerceptronController extends Controller
public function run(Request $request, ISynapticWeightsProvider $synapticWeightsProvider)
{
$perceptronType = $request->input('type', 'simple');
$perceptronType = $request->input('type');
$minError = $request->input('min_error', 0.01);
$weightInitMethod = $request->input('weight_init_method', 'random');
$dataSet = $request->input('dataset');
@@ -96,11 +126,12 @@ class PerceptronController extends Controller
$iterationEventBuffer = new PerceptronIterationEventBuffer($sessionId, $trainingId);
$networkTraining = match ($perceptronType) {
'simple' => new SimplePerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId),
'simple' => new SimpleBinaryPerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId),
'gradientdescent' => new GradientDescentPerceptronTraining($dataSetReader, $learningRate, $maxIterations, $synapticWeightsProvider, $iterationEventBuffer, $sessionId, $trainingId, $minError),
default => null,
};
event(new \App\Events\PerceptronInitialization($dataSetReader->lines, $networkTraining->activationFunction, $sessionId, $trainingId));
event(new PerceptronInitialization($dataSetReader->lines, $networkTraining->activationFunction, $sessionId, $trainingId));
$networkTraining->start();