Пример на Blobs
Поправлены комменты в ML
This commit is contained in:
parent
97da05c508
commit
779dc358b6
|
|
@ -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.
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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(() ->
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue