diff --git a/InstallerSamples/MachineLearning/08_Datasets/01_MakeBlobs.pas b/InstallerSamples/MachineLearning/08_Datasets/01_MakeBlobs.pas new file mode 100644 index 000000000..c8fa2c046 --- /dev/null +++ b/InstallerSamples/MachineLearning/08_Datasets/01_MakeBlobs.pas @@ -0,0 +1,31 @@ +// MakeBlobs синтетический датасет. +// Демонстрирует генерацию кластеризованных данных и их визуализацию. +uses MLABC, PlotML; + +begin + // --- генерируем синтетические данные + var centers := 3; + var (X,y) := Datasets.MakeBlobs( + n := 600, + centers := centers, + clusterStd := 1.2, + seed := 1 + ); + + var n := X.RowCount; + + // --- визуализация + Plot.Title('MakeBlobs синтетический датасет'); + Plot.XLabel('признак 1'); + Plot.YLabel('признак 2'); + + for var c := 0 to centers-1 do + begin + var ind := y.ToArray.Indices(v -> Round(v) = c).ToArray; + + var xs := ind.ConvertAll(i -> X[i,0]); + var ys := ind.ConvertAll(i -> X[i,1]); + + Plot.Points(xs, ys, size := 3, legend := 'кластер ' + c); + end; +end. \ No newline at end of file diff --git a/bin/Lib/LinearAlgebraML.pas b/bin/Lib/LinearAlgebraML.pas index cfc98e81f..c78885b56 100644 --- a/bin/Lib/LinearAlgebraML.pas +++ b/bin/Lib/LinearAlgebraML.pas @@ -1,4 +1,14 @@ -unit LinearAlgebraML; +/// Линейная алгебра для алгоритмов машинного обучения. +/// +/// Содержит типы Vector и Matrix и численные методы, +/// используемые в моделях ML: +/// решение систем линейных уравнений, least squares, +/// ridge-регрессия и специализированные методы +/// для симметричных положительно определённых матриц. +/// +/// Модуль предназначен для внутреннего использования +/// в ML-алгоритмах и оптимизирован для задач обучения моделей. +unit LinearAlgebraML; interface @@ -243,6 +253,16 @@ function SolveAuto(A: Matrix; b: Vector): Vector; /// Входные A и b изменяются. Возвращаемый вектор x имеет длину n. function SolveRidge(A: Matrix; b: Vector; lambda: real := 0): Vector; +/// Решает задачу наименьших квадратов для системы A * x ≈ b. +/// +/// Используется QR-разложение матрицы A. +/// Подходит для переопределённых систем (число строк больше числа столбцов). +/// +/// Временная сложность: O(m * n²), где +/// m — число строк A, +/// n — число столбцов A. +/// +/// Вызывает исключение, если размеры A и b не согласованы. function SolveLeastSquaresQR(A: Matrix; b: Vector): Vector; implementation diff --git a/bin/Lib/MLABC.pas b/bin/Lib/MLABC.pas index bfd6320bd..2867c90c8 100644 --- a/bin/Lib/MLABC.pas +++ b/bin/Lib/MLABC.pas @@ -14,6 +14,7 @@ uses DataFrameABC; uses MLExceptions; uses InspectionML; uses MLPipelineABC; +uses MLDatasets; type Vector = LinearAlgebraML.Vector; @@ -76,6 +77,8 @@ type ImputeStrategy = PreprocessorABC.ImputeStrategy; Imputer = PreprocessorABC.Imputer; + Datasets = MLDatasets.Datasets; + implementation diff --git a/bin/Lib/MLDatasets.pas b/bin/Lib/MLDatasets.pas index 92c516287..8c2523157 100644 --- a/bin/Lib/MLDatasets.pas +++ b/bin/Lib/MLDatasets.pas @@ -7,13 +7,24 @@ uses DataFrameABC, LinearAlgebraML; type Datasets = static class public - // --- synthetic datasets (Matrix + Vector) + // --- Синтетические датасеты (Matrix + Vector) - /// Генерирует k кластеров (blobs) для задач классификации и кластеризации + /// Генерирует синтетический датасет из нескольких гауссовых кластеров. + /// Возвращает матрицу признаков X и вектор меток кластеров y. + /// + /// Параметры: + /// • n — количество объектов (точек) + /// • centers — число кластеров + /// • clusterStd — стандартное отклонение точек внутри кластера + /// • nFeatures — число признаков (размерность пространства) + /// • seed — значение генератора случайных чисел (seed < 0 → случайный) static function MakeBlobs( n: integer := 300; centers: integer := 3; - seed: integer := 1): (Matrix, Vector); + clusterStd: real := 1.0; + nFeatures: integer := 2; + seed: integer := -1 + ): (Matrix, Vector); /// Генерирует датасет "две луны" для демонстрации нелинейной классификации и кластеризации static function MakeMoons( @@ -40,7 +51,7 @@ type seed: integer := 1): (Matrix, Vector); - // --- DataFrame datasets (реалистичные таблицы) + // --- DataFrame датасеты (реалистичные таблицы, считываемые из csv) /// Датасет цен на квартиры (задача регрессии) static function RussianHousing: DataFrame; @@ -64,12 +75,71 @@ type implementation -static function Datasets.MakeBlobs( - n: integer ; - centers: integer ; - seed: integer): (Matrix, Vector); +uses MLExceptions; + +const + ER_PARAM_GT_ZERO = + 'Параметр {0} должен быть > 0!!Parameter {0} must be > 0'; + +function Normal(rnd: System.Random): real; begin - Result := nil; + var u1 := rnd.NextDouble; + var u2 := rnd.NextDouble; + Result := Sqrt(-2 * Ln(u1)) * Cos(2 * Pi * u2); +end; + +/// Генерирует синтетический датасет из нескольких гауссовых кластеров. +/// Возвращает матрицу признаков X и вектор меток кластеров y. +/// +/// Параметры: +/// • n — количество объектов (точек) +/// • centers — число кластеров +/// • clusterStd — стандартное отклонение точек внутри кластера +/// • nFeatures — число признаков (размерность пространства) +/// • seed — значение генератора случайных чисел (seed < 0 → случайный) +static function Datasets.MakeBlobs( + n: integer; centers: integer; + clusterStd: real; nFeatures: integer; seed: integer): (Matrix, Vector); +begin + if n <= 0 then + ArgumentOutOfRangeError(ER_PARAM_GT_ZERO, 'n'); + + if centers <= 0 then + ArgumentOutOfRangeError(ER_PARAM_GT_ZERO, 'centers'); + + if clusterStd <= 0 then + ArgumentOutOfRangeError(ER_PARAM_GT_ZERO, 'clusterStd'); + + if nFeatures <= 0 then + ArgumentOutOfRangeError(ER_PARAM_GT_ZERO, 'nFeatures'); + + var actualSeed := + if seed >= 0 then seed + else System.Environment.TickCount and integer.MaxValue; + + var rnd := new System.Random(actualSeed); + + var X := new Matrix(n, nFeatures); + var y := new Vector(n); + + // --- генерируем центры кластеров + var centersM := new Matrix(centers, nFeatures); + + for var c := 0 to centers - 1 do + for var j := 0 to nFeatures - 1 do + centersM[c,j] := rnd.NextDouble * 20 - 10; + + // --- генерация точек + for var i := 0 to n - 1 do + begin + var c := rnd.Next(centers); + y[i] := c; + + for var j := 0 to nFeatures - 1 do + X[i,j] := centersM[c,j] + clusterStd * Normal(rnd); + end; + + Result := (X, y); end; static function Datasets.MakeMoons( diff --git a/bin/Lib/MLModelsABC.pas b/bin/Lib/MLModelsABC.pas index edf8d727b..b156ab440 100644 --- a/bin/Lib/MLModelsABC.pas +++ b/bin/Lib/MLModelsABC.pas @@ -1,4 +1,16 @@ -unit MLModelsABC; +/// Модуль моделей машинного обучения и матричных преобразований. +/// +/// Содержит: +/// • функции активации +/// • модели: LinearRegression, LogisticRegression, ElasticNet, +/// kNN, DecisionTree, RandomForest, GradientBoosting, +/// KMeans, DBSCAN +/// • трансформеры признаков (StandardScaler, PCA и др.) +/// • Pipeline для объединения преобразований и модели. +/// +/// Все алгоритмы работают с числовыми данными: +/// X — Matrix (объекты × признаки), y — Vector (целевая переменная). +unit MLModelsABC; interface @@ -1356,7 +1368,7 @@ type /// Обучает преобразования и модель function Fit(X: Matrix; y: Vector): IModel; - /// Применяет только преобразования (без модели) + /// Применяет только преобразования (без модели)constructor Create; function Transform(X: Matrix): Matrix; /// Делает предсказание @@ -1390,6 +1402,10 @@ type fFeatureCount: integer; fFitted: boolean; public + /// Создаёт StandardScaler. + /// Параметры масштабирования (среднее и стандартное отклонение) + /// вычисляются при вызове Fit. + constructor Create(); begin end; /// Вычисляет среднее и стандартное отклонение по каждому признаку. function Fit(X: Matrix): ITransformer; @@ -1425,20 +1441,16 @@ type /// Создаёт MinMaxScaler с диапазоном [rangeMin, rangeMax]. /// По умолчанию масштабирование выполняется к [0, 1] constructor Create(rangeMin: real := 0.0; rangeMax: real := 1.0); - /// Вычисляет минимальные и максимальные значения - /// по каждому признаку. + /// Вычисляет минимальные и максимальные значения по каждому признаку. function Fit(X: Matrix): ITransformer; - /// Применяет линейное масштабирование признаков - /// к диапазону [0, 1]. + /// Применяет линейное масштабирование признаков к диапазону [0, 1]. function Transform(X: Matrix): Matrix; - /// Минимальные значения признаков, - /// вычисленные при обучении. + /// Минимальные значения признаков, вычисленные при обучении. property Min: Vector read fMin; - /// Максимальные значения признаков, - /// вычисленные при обучении. + /// Максимальные значения признаков, вычисленные при обучении. property Max: Vector read fMax; /// Признак того, что преобразование обучено. @@ -1451,7 +1463,7 @@ type /// Трансформер главных компонент (PCA). /// Выполняет уменьшение размерности путём проекции данных - /// на первые k главных компонент. + /// на первые k главных компонент. /// На этапе Fit вычисляет главные компоненты ковариационной матрицы. /// На этапе Transform проецирует данные: /// Z = (X - μ) · W @@ -1494,7 +1506,9 @@ type fFitted: boolean; public - /// threshold — минимальная допустимая дисперсия (>= 0) + /// Создаёт VarianceThreshold: + /// • threshold — минимально допустимая дисперсия признака. + /// Столбцы с Var(X_j) < threshold удаляются. constructor Create(threshold: real := 0.0); /// Вычисляет дисперсии признаков и запоминает индексы @@ -1564,12 +1578,12 @@ type // Multiclass version function ComputeChiSquare(feature: Vector; y: Vector): real; public - /// Создаёт трансформер с использованием встроенного критерия: + /// Создаёт трансформер SelectKBest с использованием встроенного критерия: /// • k — число отбираемых признаков. /// • score — тип критерия (например, Correlation) constructor Create(k: integer; score: FeatureScore := FeatureScore.Correlation); - /// Создаёт трансформер с пользовательской функцией оценки: + /// Создаёт трансформер SelectKBest с пользовательской функцией оценки: /// • scoreFunc — функция (feature, y) → real constructor Create(k: integer; scoreFunc: (Vector, Vector) -> real); diff --git a/bin/Lib/MetricsABC.pas b/bin/Lib/MetricsABC.pas index 6eacdd378..c0c5797cf 100644 --- a/bin/Lib/MetricsABC.pas +++ b/bin/Lib/MetricsABC.pas @@ -1,4 +1,13 @@ -unit MetricsABC; +/// Метрики качества моделей машинного обучения. +/// +/// Содержит метрики для: +/// • регрессии (MSE, RMSE, MAE, R2) +/// • классификации (Accuracy, Precision, Recall, F1 и др.) +/// • вероятностных моделей (LogLoss, ROC, AUC) +/// • кластеризации (Silhouette, Calinski–Harabasz, Davies–Bouldin, ARI) +/// +/// Также включает класс ConfusionMatrix для анализа результатов классификации. +unit MetricsABC; interface diff --git a/bin/Lib/PlotML.pas b/bin/Lib/PlotML.pas index 22b4c59d5..c8c6e9d87 100644 --- a/bin/Lib/PlotML.pas +++ b/bin/Lib/PlotML.pas @@ -121,6 +121,9 @@ type static procedure Limits(xmin,xmax,ymin,ymax: real); static procedure XLim(xmin,xmax: real); static procedure YLim(ymin,ymax: real); + static procedure Title(s: string); + static procedure XLabel(s: string); + static procedure YLabel(s: string); static procedure Clear; @@ -501,6 +504,30 @@ begin end); end; +static procedure Plot.Title(s: string); +begin + RunUI(() -> + begin + rootChart.Title := s; + end); +end; + +static procedure Plot.XLabel(s: string); +begin + RunUI(() -> + begin + rootChart.BottomTitle := s; + end); +end; + +static procedure Plot.YLabel(s: string); +begin + RunUI(() -> + begin + rootChart.LeftTitle := s; + end); +end; + static procedure Plot.Clear; begin RunUI(() ->