The Gaussian Mixture Model (GMM) is a model that represents a mixture of Gaussian distributions, each with its own weight, mean, and covariance matrix. The model uses the Expectation Maximization (EM) algorithm to estimate the unknown parameters. The EM algorithm consists of two steps: the expectation step, which calculates the contribution of each training sample to each Gaussian component, and the maximization step, which updates the parameters of the Gaussian components. GMM can be applied in various tasks such as image segmentation and clustering, providing the probability of a sample belonging to each Gaussian component.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_GMM_DATA_TBL;
CREATE COLUMN TABLE PAL_GMM_DATA_TBL (ID INTEGER, X1 DOUBLE, X2 DOUBLE, X3 INTEGER);
INSERT INTO PAL_GMM_DATA_TBL VALUES (0, 0.10, 0.10, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (1, 0.11, 0.10, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (2, 0.10, 0.11, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (3, 0.11, 0.11, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (4, 0.12, 0.11, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (5, 0.11, 0.12, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (6, 0.12, 0.12, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (7, 0.12, 0.13, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (8, 0.13, 0.12, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (9, 0.13, 0.13, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (10, 0.13, 0.14, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (11, 0.14, 0.13, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (12, 10.10, 10.10, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (13, 10.11, 10.10, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (14, 10.10, 10.11, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (15, 10.11, 10.11, 1);
INSERT INTO PAL_GMM_DATA_TBL VALUES (16, 10.11, 10.12, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (17, 10.12, 10.11, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (18, 10.12, 10.12, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (19, 10.12, 10.13, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (20, 10.13, 10.12, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (21, 10.13, 10.13, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (22, 10.13, 10.14, 2);
INSERT INTO PAL_GMM_DATA_TBL VALUES (23, 10.14, 10.13, 2);

DROP TABLE PAL_GMM_INITIALIZE_PARAMETER_TBL;
CREATE COLUMN TABLE PAL_GMM_INITIALIZE_PARAMETER_TBL (ID INTEGER, CLUSTER_NUMBER INTEGER); 
INSERT INTO PAL_GMM_INITIALIZE_PARAMETER_TBL VALUES (0, 2);

DROP TABLE #PAL_PARAMETER_TBL;
CREATE LOCAL TEMPORARY COLUMN TABLE #PAL_PARAMETER_TBL ("PARAM_NAME" VARCHAR(256), "INT_VALUE" INTEGER, "DOUBLE_VALUE" DOUBLE, "STRING_VALUE" VARCHAR(1000));
INSERT INTO #PAL_PARAMETER_TBL VALUES ('COVARIANCE_TYPE', 0, NULL, NULL); -- use full covariance matrices
INSERT INTO #PAL_PARAMETER_TBL VALUES ('SHARED_COVARIANCE', 0, NULL, NULL); -- use different covariance matrices for different clusters
INSERT INTO #PAL_PARAMETER_TBL VALUES ('THREAD_RATIO', NULL, 0.5, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('MAX_ITERATION', 500, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('INIT_MODE', 0, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('ERROR_TOL', NULL, 0.001, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('CATEGORICAL_VARIABLE', NULL, NULL, 'X3');
INSERT INTO #PAL_PARAMETER_TBL VALUES ('SEED', 1, NULL, NULL);
CALL _SYS_AFL.PAL_GMM (PAL_GMM_DATA_TBL, PAL_GMM_INITIALIZE_PARAMETER_TBL, #PAL_PARAMETER_TBL, ?, ?, ?, ?);

