Пример на Blobs

Поправлены комменты в ML
This commit is contained in:
Mikhalkovich Stanislav 2026-03-08 22:25:12 +03:00
parent 97da05c508
commit 779dc358b6
7 changed files with 199 additions and 25 deletions

View file

@ -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.

View file

@ -1,4 +1,14 @@
unit LinearAlgebraML; /// Линейная алгебра для алгоритмов машинного обучения.
///
/// Содержит типы Vector и Matrix и численные методы,
/// используемые в моделях ML:
/// решение систем линейных уравнений, least squares,
/// ridge-регрессия и специализированные методы
/// для симметричных положительно определённых матриц.
///
/// Модуль предназначен для внутреннего использования
/// в ML-алгоритмах и оптимизирован для задач обучения моделей.
unit LinearAlgebraML;
interface interface
@ -243,6 +253,16 @@ function SolveAuto(A: Matrix; b: Vector): Vector;
/// Входные A и b изменяются. Возвращаемый вектор x имеет длину n. /// Входные A и b изменяются. Возвращаемый вектор x имеет длину n.
function SolveRidge(A: Matrix; b: Vector; lambda: real := 0): Vector; 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; function SolveLeastSquaresQR(A: Matrix; b: Vector): Vector;
implementation implementation

View file

@ -14,6 +14,7 @@ uses DataFrameABC;
uses MLExceptions; uses MLExceptions;
uses InspectionML; uses InspectionML;
uses MLPipelineABC; uses MLPipelineABC;
uses MLDatasets;
type type
Vector = LinearAlgebraML.Vector; Vector = LinearAlgebraML.Vector;
@ -76,6 +77,8 @@ type
ImputeStrategy = PreprocessorABC.ImputeStrategy; ImputeStrategy = PreprocessorABC.ImputeStrategy;
Imputer = PreprocessorABC.Imputer; Imputer = PreprocessorABC.Imputer;
Datasets = MLDatasets.Datasets;
implementation implementation

View file

@ -7,13 +7,24 @@ uses DataFrameABC, LinearAlgebraML;
type type
Datasets = static class Datasets = static class
public public
// --- synthetic datasets (Matrix + Vector) // --- Синтетические датасеты (Matrix + Vector)
/// Генерирует k кластеров (blobs) для задач классификации и кластеризации /// Генерирует синтетический датасет из нескольких гауссовых кластеров.
/// Возвращает матрицу признаков X и вектор меток кластеров y.
///
/// Параметры:
/// • n — количество объектов (точек)
/// • centers — число кластеров
/// • clusterStd — стандартное отклонение точек внутри кластера
/// • nFeatures — число признаков (размерность пространства)
/// • seed — значение генератора случайных чисел (seed < 0 → случайный)
static function MakeBlobs( static function MakeBlobs(
n: integer := 300; n: integer := 300;
centers: integer := 3; centers: integer := 3;
seed: integer := 1): (Matrix, Vector); clusterStd: real := 1.0;
nFeatures: integer := 2;
seed: integer := -1
): (Matrix, Vector);
/// Генерирует датасет "две луны" для демонстрации нелинейной классификации и кластеризации /// Генерирует датасет "две луны" для демонстрации нелинейной классификации и кластеризации
static function MakeMoons( static function MakeMoons(
@ -40,7 +51,7 @@ type
seed: integer := 1): (Matrix, Vector); seed: integer := 1): (Matrix, Vector);
// --- DataFrame datasets (реалистичные таблицы) // --- DataFrame датасеты (реалистичные таблицы, считываемые из csv)
/// Датасет цен на квартиры (задача регрессии) /// Датасет цен на квартиры (задача регрессии)
static function RussianHousing: DataFrame; static function RussianHousing: DataFrame;
@ -64,12 +75,71 @@ type
implementation implementation
static function Datasets.MakeBlobs( uses MLExceptions;
n: integer ;
centers: integer ; const
seed: integer): (Matrix, Vector); ER_PARAM_GT_ZERO =
'Параметр {0} должен быть > 0!!Parameter {0} must be > 0';
function Normal(rnd: System.Random): real;
begin 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; end;
static function Datasets.MakeMoons( static function Datasets.MakeMoons(

View file

@ -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 interface
@ -1356,7 +1368,7 @@ type
/// Обучает преобразования и модель /// Обучает преобразования и модель
function Fit(X: Matrix; y: Vector): IModel; function Fit(X: Matrix; y: Vector): IModel;
/// Применяет только преобразования (без модели) /// Применяет только преобразования (без модели)constructor Create;
function Transform(X: Matrix): Matrix; function Transform(X: Matrix): Matrix;
/// Делает предсказание /// Делает предсказание
@ -1390,6 +1402,10 @@ type
fFeatureCount: integer; fFeatureCount: integer;
fFitted: boolean; fFitted: boolean;
public public
/// Создаёт StandardScaler.
/// Параметры масштабирования (среднее и стандартное отклонение)
/// вычисляются при вызове Fit.
constructor Create(); begin end;
/// Вычисляет среднее и стандартное отклонение по каждому признаку. /// Вычисляет среднее и стандартное отклонение по каждому признаку.
function Fit(X: Matrix): ITransformer; function Fit(X: Matrix): ITransformer;
@ -1425,20 +1441,16 @@ type
/// Создаёт MinMaxScaler с диапазоном [rangeMin, rangeMax]. /// Создаёт MinMaxScaler с диапазоном [rangeMin, rangeMax].
/// По умолчанию масштабирование выполняется к [0, 1] /// По умолчанию масштабирование выполняется к [0, 1]
constructor Create(rangeMin: real := 0.0; rangeMax: real := 1.0); constructor Create(rangeMin: real := 0.0; rangeMax: real := 1.0);
/// Вычисляет минимальные и максимальные значения /// Вычисляет минимальные и максимальные значения по каждому признаку.
/// по каждому признаку.
function Fit(X: Matrix): ITransformer; function Fit(X: Matrix): ITransformer;
/// Применяет линейное масштабирование признаков /// Применяет линейное масштабирование признаков к диапазону [0, 1].
/// к диапазону [0, 1].
function Transform(X: Matrix): Matrix; function Transform(X: Matrix): Matrix;
/// Минимальные значения признаков, /// Минимальные значения признаков, вычисленные при обучении.
/// вычисленные при обучении.
property Min: Vector read fMin; property Min: Vector read fMin;
/// Максимальные значения признаков, /// Максимальные значения признаков, вычисленные при обучении.
/// вычисленные при обучении.
property Max: Vector read fMax; property Max: Vector read fMax;
/// Признак того, что преобразование обучено. /// Признак того, что преобразование обучено.
@ -1451,7 +1463,7 @@ type
/// Трансформер главных компонент (PCA). /// Трансформер главных компонент (PCA).
/// Выполняет уменьшение размерности путём проекции данных /// Выполняет уменьшение размерности путём проекции данных
/// на первые k главных компонент. /// на первые k главных компонент.
/// На этапе Fit вычисляет главные компоненты ковариационной матрицы. /// На этапе Fit вычисляет главные компоненты ковариационной матрицы.
/// На этапе Transform проецирует данные: /// На этапе Transform проецирует данные:
/// Z = (X - μ) · W /// Z = (X - μ) · W
@ -1494,7 +1506,9 @@ type
fFitted: boolean; fFitted: boolean;
public public
/// threshold — минимальная допустимая дисперсия (>= 0) /// Создаёт VarianceThreshold:
/// • threshold — минимально допустимая дисперсия признака.
/// Столбцы с Var(X_j) < threshold удаляются.
constructor Create(threshold: real := 0.0); constructor Create(threshold: real := 0.0);
/// Вычисляет дисперсии признаков и запоминает индексы /// Вычисляет дисперсии признаков и запоминает индексы
@ -1564,12 +1578,12 @@ type
// Multiclass version // Multiclass version
function ComputeChiSquare(feature: Vector; y: Vector): real; function ComputeChiSquare(feature: Vector; y: Vector): real;
public public
/// Создаёт трансформер с использованием встроенного критерия: /// Создаёт трансформер SelectKBest с использованием встроенного критерия:
/// • k — число отбираемых признаков. /// • k — число отбираемых признаков.
/// • score — тип критерия (например, Correlation) /// • score — тип критерия (например, Correlation)
constructor Create(k: integer; score: FeatureScore := FeatureScore.Correlation); constructor Create(k: integer; score: FeatureScore := FeatureScore.Correlation);
/// Создаёт трансформер с пользовательской функцией оценки: /// Создаёт трансформер SelectKBest с пользовательской функцией оценки:
/// • scoreFunc — функция (feature, y) → real /// • scoreFunc — функция (feature, y) → real
constructor Create(k: integer; scoreFunc: (Vector, Vector) -> real); constructor Create(k: integer; scoreFunc: (Vector, Vector) -> real);

View file

@ -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 interface

View file

@ -121,6 +121,9 @@ type
static procedure Limits(xmin,xmax,ymin,ymax: real); static procedure Limits(xmin,xmax,ymin,ymax: real);
static procedure XLim(xmin,xmax: real); static procedure XLim(xmin,xmax: real);
static procedure YLim(ymin,ymax: 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; static procedure Clear;
@ -501,6 +504,30 @@ begin
end); end);
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; static procedure Plot.Clear;
begin begin
RunUI(() -> RunUI(() ->