DeltasMinimum: Double;
DeltasMinimum: double;
Свойство DeltasMinimum определяет минимальное значение параметра точности delta.
delta - это значение ошибки, которое будет использовано для изменения веса синапса. Если значение delta для всех весов меньше, чем DeltasMinimum, то процесс обучения закончен.
Для выполнения примера добавьте ссылки на системные сборки: MathFin, Stat.
Sub
UserBackP;
Var
NN: SmBackPropagation;
y, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10: Array[15] Of Double;
x11, x12, x13, x14, x15, x16, x17, x18, x19, x20:
Array[15] Of
Double;
x21, x22, x23, x24, x25, x26, x27, x28, x29, x30:
Array[15] Of
Double;
Ex: ISlSeries;
res, i, j: Integer;
masI, PerformanceMatrix: Array Of
Double;
CatList, CategoriesList, KfoldIntervals: Array
Of Integer;
s: String;
CrossValidation: ICrossValidation;
CrossValPerf: ICrossValidationPerformanceScores;
Begin
NN := New SmBackPropagation.Create;
// Генерируем исходные данные.
15-ть объектов с 30-ю признаками
For i := 0 To 14
Do
x1[i] := Math.RandBetween(-5, 5); x16[i]
:= Math.RandBetween(-5, 5);
x2[i] := Math.RandBetween(-5, 5); x17[i]
:= Math.RandBetween(-5, 5);
x3[i] := Math.RandBetween(-5, 5); x18[i]
:= Math.RandBetween(-5, 5);
x4[i] := Math.RandBetween(-5, 5); x19[i]
:= Math.RandBetween(-5, 5);
x5[i] := Math.RandBetween(-5, 5); x20[i]
:= Math.RandBetween(-5, 5);
x6[i] := Math.RandBetween(-5, 5); x21[i]
:= Math.RandBetween(-5, 5);
x7[i] := Math.RandBetween(-5, 5); x22[i]
:= Math.RandBetween(-5, 5);
x8[i] := Math.RandBetween(-5, 5); x23[i]
:= Math.RandBetween(-5, 5);
x9[i] := Math.RandBetween(-5, 5); x24[i]
:= Math.RandBetween(-5, 5);
x10[i] := Math.RandBetween(-5, 5); x25[i]
:= Math.RandBetween(-5, 5);
x11[i] := Math.RandBetween(-5, 5); x26[i]
:= Math.RandBetween(-5, 5);
x12[i] := Math.RandBetween(-5, 5); x27[i]
:= Math.RandBetween(-5, 5);
x13[i] := Math.RandBetween(-5, 5); x28[i]
:= Math.RandBetween(-5, 5);
x14[i] := Math.RandBetween(-5, 5); x29[i]
:= Math.RandBetween(-5, 5);
x15[i] := Math.RandBetween(-5, 5); x30[i]
:= Math.RandBetween(-5, 5);
End For;
// Значения объясняемого
ряда
y[0] := 1; y[5] := 6; y[10] := -1;
y[1] := 2;
y[6] := 4; y[11] := -1;
y[2] := 5;
y[7] := 8; y[12] := -1;
y[3] := 4;
y[8] := 8; y[13] := -1;
y[4] := 5;
y[9] := 7; y[14] := -1;
// Задаем объясняемый ряд
NN.Dependent.Value := y;
// Задаем объясняющие ряды
Ex := NN.Explanatories;
Ex.Add.Value := x1; Ex.Add.Value := x11; Ex.Add.Value
:= x21;
Ex.Add.Value := x2; Ex.Add.Value := x12; Ex.Add.Value
:= x22;
Ex.Add.Value := x3; Ex.Add.Value := x13; Ex.Add.Value
:= x23;
Ex.Add.Value := x4; Ex.Add.Value := x14; Ex.Add.Value
:= x24;
Ex.Add.Value := x5; Ex.Add.Value := x15; Ex.Add.Value
:= x25;
Ex.Add.Value := x6; Ex.Add.Value := x16; Ex.Add.Value
:= x26;
Ex.Add.Value := x7; Ex.Add.Value := x17; Ex.Add.Value
:= x27;
Ex.Add.Value := x8; Ex.Add.Value := x18; Ex.Add.Value
:= x28;
Ex.Add.Value := x9; Ex.Add.Value := x19; Ex.Add.Value
:= x29;
Ex.Add.Value := x10; Ex.Add.Value := x20; Ex.Add.Value
:= x30;
// Число нейронов во внутреннем
слое
NN.Neurons := 22;
// Число итераций
NN.Epoch := 400;
// Минимальное значение delta
NN.DeltasMinimum := 0.001;
// Задаем параметры кросс-валидации
CrossValidation := NN.CrossValidation;
CrossValidation.SamplingType := CrossValidationSamplingType.Kfold;
CrossValidation.NumberOfFolds := 8;
// Выполняем расчёт и выводим
результаты
res := NN.Execute;
If res = 0
Then
Debug.WriteLine("
== Заполнение по шаблону == ");
Debug.WriteLine("До
После ");
masI := NN.FilledDependent.Value;
For
i := 0 To y.Length
- 1 Do
If y[i] <> -1
Then
s
:= y[i].ToString;
Else
s
:= "-";
End If;
s
:= s + " "
+ masI[i].ToString;
Debug.WriteLine(s);
End
For;
// Выводим список категорий
CatList := NN.CategoriesList;
If
CatList.Length > 0 Then
Debug.WriteLine(" == Список категорий == "); Debug.Indent;
For i := 0 To CatList.Length - 1
Do
Debug.WriteLine(CatList[i]);
End For;
Debug.Unindent;
End
If;
//
Выводим сводные результаты классификации
Debug.WriteLine(" === Сводные результаты классификации ===");
Debug.Indent;
s := "";
For
i := 0 To NN.ClassificationSummary.GetUpperBound(1) Do
For j := 0 To NN.ClassificationSummary.GetUpperBound(2) Do
s
:= s + NN.ClassificationSummary[i, j].ToString + "
";
End For;
Debug.WriteLine(s);
s
:= "";
End
For;
Debug.Unindent;
//
Выводим результаты кросс-валидации
NN.ExecuteValidation;
CrossValPerf := NN.PerformanceScores;
Debug.WriteLine("
=== Результаты кросс-валидации === ");
Debug.Indent;
Debug.WriteLine("Анализируемый
признак: " + CrossValPerf.ClassificatorName);
Debug.Write("Количество
факторов, влияющих на анализируемый признак: ");
Debug.WriteLine(CrossValPerf.FactorsNumber);
Debug.WriteLine("Количество
наблюдений: " + CrossValPerf.ObservationsNumber.ToString);
Debug.WriteLine("Количество
повторений: " + CrossValidation.NumberOfRandomTests.ToString);
Debug.WriteLine("Точность
классификации: " + CrossValPerf.ClassificationAccuracy.ToString);
Debug.WriteLine("Категории:");
Debug.Indent;
CategoriesList := CrossValPerf.CategoriesList;
For
i := 0 To CategoriesList.Length
- 1 Do
Debug.WriteLine(CategoriesList[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Интервалы
для блоков:");
Debug.Indent;
KfoldIntervals := CrossValPerf.KfoldIntervals;
For
i := 0 To KfoldIntervals.Length
- 1 Do
Debug.WriteLine(KfoldIntervals[i]);
End
For;
Debug.Unindent;
Debug.WriteLine("Корректная
классификация:");
Debug.Indent;
PerformanceMatrix := CrossValPerf.PerformanceMatrix;
For
i := 0 To PerformanceMatrix.GetUpperBound(1) - 1 Do
For j := 0 To PerformanceMatrix.GetUpperBound(2)
- 1 Do
Debug.Write(PerformanceMatrix[i,
j].ToString + #9);
End For;
Debug.WriteLine("");
End
For;
Debug.Unindent;
Debug.Unindent;
End If;
End Sub UserBackP;
В результате выполнения примера для указанных данных будет выполнена кластеризация с помощью сети обратного распространения, в окно консоли будут выведены результаты кластеризации, список категорий, сводные результаты классификации и результаты кросс-валидации.
Необходимые требования и результат выполнения примера Fore.NET совпадают с примером Fore.
Imports
Prognoz.Platform.Interop.MathFin;
Imports Prognoz.Platform.Interop.Stat;
…
Public Shared
Sub UserBackP();
Var
NN: SmBackPropagation;
y, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10: Array[15] Of Double;
x11, x12, x13, x14, x15, x16, x17, x18, x19, x20:
Array[15] Of
Double;
x21, x22, x23, x24, x25, x26, x27, x28, x29, x30:
Array[15] Of
Double;
Ex: ISlSeries;
res, i, j: Integer;
CatList, masI, PerformanceMatrix, CategoriesList,
KfoldIntervals: System.Array;
m: Prognoz.Platform.Interop.MathFin.MathClass;
s: string;
CrossValidation: ICrossValidation;
CrossValPerf: ICrossValidationPerformanceScores;
Begin
NN := New SmBackPropagation.Create();
// Генерируем исходные данные.
15-ть объектов с 30-ю признаками
m := New Prognoz.Platform.Interop.MathFin.MathClass.Create();
For i := 0
To 14 Do
x1[i] := m.RandBetween(-5, 5); x16[i]
:= m.RandBetween(-5, 5);
x2[i] := m.RandBetween(-5, 5); x17[i]
:= m.RandBetween(-5, 5);
x3[i] := m.RandBetween(-5, 5); x18[i]
:= m.RandBetween(-5, 5);
x4[i] := m.RandBetween(-5, 5); x19[i]
:= m.RandBetween(-5, 5);
x5[i] := m.RandBetween(-5, 5); x20[i]
:= m.RandBetween(-5, 5);
x6[i] := m.RandBetween(-5, 5); x21[i]
:= m.RandBetween(-5, 5);
x7[i] := m.RandBetween(-5, 5); x22[i]
:= m.RandBetween(-5, 5);
x8[i] := m.RandBetween(-5, 5); x23[i]
:= m.RandBetween(-5, 5);
x9[i] := m.RandBetween(-5, 5); x24[i]
:= m.RandBetween(-5, 5);
x10[i] := m.RandBetween(-5, 5); x25[i]
:= m.RandBetween(-5, 5);
x11[i] := m.RandBetween(-5, 5); x26[i]
:= m.RandBetween(-5, 5);
x12[i] := m.RandBetween(-5, 5); x27[i]
:= m.RandBetween(-5, 5);
x13[i] := m.RandBetween(-5, 5); x28[i]
:= m.RandBetween(-5, 5);
x14[i] := m.RandBetween(-5, 5); x29[i]
:= m.RandBetween(-5, 5);
x15[i] := m.RandBetween(-5, 5); x30[i]
:= m.RandBetween(-5, 5);
End For;
// Значения объясняемого
ряда
y[0] := 1; y[5] := 6; y[10] := -1;
y[1] := 2;
y[6] := 4; y[11] := -1;
y[2] := 5;
y[7] := 8; y[12] := -1;
y[3] := 4;
y[8] := 8; y[13] := -1;
y[4] := 5;
y[9] := 7; y[14] := -1;
// Задаем объясняемый ряд
NN.Dependent.Value := y;
// Задаем объясняющие ряды
Ex := NN.Explanatories;
Ex.Add().Value := x1; Ex.Add().Value := x11; Ex.Add().Value
:= x21;
Ex.Add().Value := x2; Ex.Add().Value := x12; Ex.Add().Value
:= x22;
Ex.Add().Value := x3; Ex.Add().Value := x13; Ex.Add().Value
:= x23;
Ex.Add().Value := x4; Ex.Add().Value := x14; Ex.Add().Value
:= x24;
Ex.Add().Value := x5; Ex.Add().Value := x15; Ex.Add().Value
:= x25;
Ex.Add().Value := x6; Ex.Add().Value := x16; Ex.Add().Value
:= x26;
Ex.Add().Value := x7; Ex.Add().Value := x17; Ex.Add().Value
:= x27;
Ex.Add().Value := x8; Ex.Add().Value := x18; Ex.Add().Value
:= x28;
Ex.Add().Value := x9; Ex.Add().Value := x19; Ex.Add().Value
:= x29;
Ex.Add().Value := x10; Ex.Add().Value := x20; Ex.Add().Value
:= x30;
//
Число нейронов во внутреннем слое
NN.Neurons := 22;
// Число итераций
NN.Epoch := 400;
// Минимальное значение delta
NN.DeltasMinimum := 0.001;
// Задаем параметры кросс-валидации
CrossValidation := NN.CrossValidation;
CrossValidation.SamplingType := CrossValidationSamplingType.cvstKfold;
CrossValidation.NumberOfFolds := 4;
// Выполняем расчёт и выводим
результаты
res := NN.Execute();
If res = 0
Then
System.Diagnostics.Debug.WriteLine(" == Заполнение по шаблону == ");
System.Diagnostics.Debug.WriteLine("До После ");
masI := NN.FilledDependent.Value;
For
i := 0 To y.Length
- 1 Do
If y[i] <> -1
Then
s
:= y[i].ToString();
Else
s
:= "-";
End If;
s
:= s + " "
+ masI[i].ToString();
System.Diagnostics.Debug.WriteLine(s)
End
For;
//
Выводим список категорий
CatList := NN.CategoriesList;
If
CatList.Length > 0 Then
System.Diagnostics.Debug.WriteLine(" == Список категорий == ");
System.Diagnostics.Debug.Indent();
For i := 0 To CatList.Length - 1
Do
System.Diagnostics.Debug.WriteLine(CatList[i]);
End For;
System.Diagnostics.Debug.Unindent();
End
If;
//
Выводим сводные результаты классификации
System.Diagnostics.Debug.WriteLine(" === Сводные результаты классификации ===");
System.Diagnostics.Debug.Indent();
s := "";
For
i := 0 To NN.ClassificationSummary.GetUpperBound(1) Do
For j := 0 To NN.ClassificationSummary.GetUpperBound(0) Do
s
:= s + NN.ClassificationSummary.GetValue(i, j).ToString() + "
";
End For;
System.Diagnostics.Debug.WriteLine(s);
s
:= "";
End
For;
// Выводим результаты кросс-валидации
NN.ExecuteValidation();
CrossValPerf := NN.PerformanceScores;
System.Diagnostics.Debug.WriteLine(" === Результаты кросс-валидации === ");
System.Diagnostics.Debug.Indent();
System.Diagnostics.Debug.WriteLine("Анализируемый признак: " + CrossValPerf.ClassificatorName);
System.Diagnostics.Debug.Write("Количество факторов, влияющих на анализируемый
признак: ");
System.Diagnostics.Debug.WriteLine(CrossValPerf.FactorsNumber);
System.Diagnostics.Debug.WriteLine("Количество наблюдений: " + CrossValPerf.ObservationsNumber.ToString());
System.Diagnostics.Debug.WriteLine("Количество повторений: " + CrossValidation.NumberOfRandomTests.ToString());
System.Diagnostics.Debug.WriteLine("Точность классификации: " + CrossValPerf.ClassificationAccuracy.ToString());
System.Diagnostics.Debug.WriteLine("Категории:");
System.Diagnostics.Debug.Indent();
CategoriesList := CrossValPerf.CategoriesList;
For
i := 0 To CategoriesList.Length
- 1 Do
System.Diagnostics.Debug.WriteLine(CategoriesList[i]);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Интервалы для блоков:");
System.Diagnostics.Debug.Indent();
KfoldIntervals := CrossValPerf.KfoldIntervals;
For
i := 0 To KfoldIntervals.Length
- 1 Do
System.Diagnostics.Debug.WriteLine(KfoldIntervals[i]);
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.WriteLine("Корректная классификация:");
System.Diagnostics.Debug.Indent();
PerformanceMatrix := CrossValPerf.PerformanceMatrix;
For
i := 0 To PerformanceMatrix.GetUpperBound(0) - 1 Do
For j := 0 To PerformanceMatrix.GetUpperBound(1)
- 1 Do
System.Diagnostics.Debug.Write(PerformanceMatrix[i,
j].ToString() + char.ConvertFromUtf32(9));
End For;
System.Diagnostics.Debug.WriteLine("");
End
For;
System.Diagnostics.Debug.Unindent();
System.Diagnostics.Debug.Unindent();
End If;
End Sub UserBackP;
См. также: