Skip to content

StefanioHabrArticles/OOMLCS

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

13 Commits
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

OOMLCS

Object-oriented machine learning with C#

Примеры

Аппроксимация функции

Модель, полученная в результате обучения

В этом примере мы аппроксимируем функцию, заданную следующими значениями:

x f(x)
1 20
2 346.12814956
3 440.811685833281
4 506.386394877906
5 553.932275490213
6 588.456079653438
7 613.525471204964
8 631.72958494378
9 644.948484588186
10 654.547375835747
11 661.517601472129
12 666.579024106174
13 670.254371278109
14 672.923221087921
15 674.861203807411
16 676.268468093033
17 677.290351698946
18 678.032391495382
19 678.571222979033
20 678.962494942032

Известно, что перцептрон с одним скрытым слоем может аппроксимировать любую непрерывную функцию многих переменных с любой точностью.

Создадим перцептрон:

var approximator = new Perceptron
(
    new LayerConfig
    {
        NumOfNeurons = 100,
        NumOfPrevNeurons = 1,
        LearningRate = 0.005d,
        Momentum = 0.005d,
        ActivationFunction = new Tanh(1, 1)
    },
    new LayerConfig
    {
        NumOfNeurons = 1,
        NumOfPrevNeurons = 100,
        LearningRate = 0.01d,
        Momentum = 0.005d,
        ActivationFunction = new LeakyReLU(0.1d)
    }
);

Подготовим обучающие данные:

// значения функции
var y = new double[] 
{
    20,
    346.12814956,
    440.811685833281,
    506.386394877906,
    553.932275490213,
    588.456079653438,
    613.525471204964,
    631.72958494378,
    644.948484588186,
    654.547375835747,
    661.517601472129,
    666.579024106174,
    670.254371278109,
    672.923221087921,
    674.861203807411,
    676.268468093033,
    677.290351698946,
    678.032391495382,
    678.571222979033,
    678.962494942032
};
// обучающая выборка
var trainset = new (Vector x, Vector y)[20];
for (int i = 0; i < trainset.Length; i++)
    trainset[i] = (new Vector(i + 1), new Vector(y[i]));

// среднее
var avg = trainset.Select(t => t.y[0]).Average();
// дисперсия
var std = (new Vector(trainset.Select(t => t.y[0]).ToArray()) - Vector.VecByConst(Vector.E(trainset.Length), avg)).Length / Math.Sqrt(trainset.Length);
// нормализация данных
trainset = trainset.Select(t => (t.x, new Vector((t.y[0] - avg) / std))).ToArray();

Обучим и проверим:

// обратное распространение ошибки
approximator.TrainBackProp(trainset, 0.0009);
// получение предскзания
for (int i = 0; i < trainset.Length; i++)
    Console.WriteLine($"f({i + 1}) = {approximator.Predict(new Vector(i + 1))[0] * std + avg}");

Загрузка и сохранение модели

// сохранение
string modelFile = approximator.SaveModel(@"C:\Some\path");
// загрузка
var approximator = new Perceptron(null);
approximator.LoadModel($@"C:\Some\path\{modelFile}");
Console.WriteLine(approximator.Predict(new Vector(3.4567d)));

About

Object-oriented machine learning with C#

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages