Пример на 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
|
||||
|
||||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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(() ->
|
||||
|
|
|
|||
Loading…
Reference in a new issue