Spectral clustering is an algorithm used for clustering data points. It treats the data points as points in space connected by edges. The algorithm aims to cut the graph of data points in a way that minimizes the edge weight sum between different subgraphs and maximizes the edge weight sum within each subgraph. It involves a low-dimension embedding of the affinity matrix between samples and then applies k-means clustering on the components of the eigenvectors in the low dimensional space.
------

SET SCHEMA DM_PAL;

DROP TABLE PAL_SPECTRAL_DATA;
CREATE COLUMN TABLE PAL_SPECTRAL_DATA (
    "ID" INTEGER,
    "X1" DOUBLE,
    "X2" DOUBLE
);
INSERT INTO PAL_SPECTRAL_DATA VALUES (0, 0.5, 0.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (1, 1.5, 0.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (2, 1.5, 1.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (3, 0.5, 1.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (4, 1.1, 1.2);
INSERT INTO PAL_SPECTRAL_DATA VALUES (5, 0.5, 15.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (6, 1.5, 15.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (7, 1.5, 16.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (8, 0.5, 16.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (9, 1.2, 16.1);
INSERT INTO PAL_SPECTRAL_DATA VALUES (10, 15.5, 15.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (11, 16.5, 15.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (12, 16.5, 16.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (13, 15.5, 16.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (14, 15.6, 16.2);
INSERT INTO PAL_SPECTRAL_DATA VALUES (15, 15.5, 0.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (16, 16.5, 0.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (17, 16.5, 1.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (18, 15.5, 1.5);
INSERT INTO PAL_SPECTRAL_DATA VALUES (19, 15.7, 1.6);

DROP TABLE #PAL_PARAMETER_TBL;
CREATE LOCAL TEMPORARY COLUMN TABLE #PAL_PARAMETER_TBL(
	"PARAM_NAME" NVARCHAR(256), 
	"INT_VALUE" INTEGER, 
	"DOUBLE_VALUE" DOUBLE, 
	"STRING_VALUE" NVARCHAR(1000)
);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('THREAD_RATIO', NULL, 0.2, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('GROUP_NUMBER', 4, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('N_NEIGHTBOURS', 4, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('INIT_TYPE', 4, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('DISTANCE_LEVEL',2, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('MAX_ITERATION', 100, NULL, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('EXIT_THRESHOLD', NULL, 1.0E-6, NULL);
INSERT INTO #PAL_PARAMETER_TBL VALUES ('CATEGORY_WEIGHTS', NULL, 0.5, NULL);

CALL _SYS_AFL.PAL_SPECTRAL_CLUSTERING(PAL_SPECTRAL_DATA, "#PAL_PARAMETER_TBL", ?,?,?);
