UNPKG

hdsp2

Version:

High-Dimensional Space Projections

98 lines 3.67 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.MDSSGD = void 0; var Utils_1 = require("./Utils"); var seedrandom_1 = __importDefault(require("seedrandom")); var MDSSGD = (function () { function MDSSGD() { } MDSSGD.project = function (featureVectors, D, threshold, max_iter, maxmax_iter, seed) { if (threshold === void 0) { threshold = 1e-5; } if (max_iter === void 0) { max_iter = 10; } if (maxmax_iter === void 0) { maxmax_iter = 50; } if (seed === void 0) { seed = 42; } if (featureVectors == null) { return null; } var rng = (0, seedrandom_1.default)(seed.toString()); var N = featureVectors.length; if (N == 0) { return []; } var distances = Utils_1.Utils.distance(featureVectors); var result = Utils_1.Utils.random2D(N, D, rng); var constraints = []; var w; var w_min = Number.MAX_VALUE; var w_max = Number.MIN_VALUE; var eps = Number.EPSILON; for (var i = 0; i < N; i++) { for (var j = i + 1; j < N; j++) { w = 1 / (Math.pow(distances[i][j], 2) + eps); w_min = Math.min(w_min, w); w_max = Math.max(w_max, w); constraints.push([i, j, w]); } } var epsilon = 0.1; var eta_max = 1 / (w_min + eps); var eta_min = epsilon / (w_max + eps); var eta_switch = 1.0 / (w_max); var lambda = Math.log((eta_max + eps) / (eta_min + eps)) / (max_iter - 1); var schedule = []; var tau = 0; for (var t = 0; t < maxmax_iter; t++) { var eta = eta_max * Math.exp(-lambda * t); if (eta <= eta_switch) { tau = t; break; } schedule.push(eta); } for (var t = tau; t < maxmax_iter; t++) { var eta = eta_switch / (1 + lambda * (t - tau)); schedule.push(eta); } var wc; var pq; var mag; var r; var m; for (var _i = 0, schedule_1 = schedule; _i < schedule_1.length; _i++) { var c = schedule_1[_i]; constraints = Utils_1.Utils.fisheryates_shuffle(constraints, rng); var Delta_max = 0; for (var _a = 0, constraints_1 = constraints; _a < constraints_1.length; _a++) { var _b = constraints_1[_a], i = _b[0], j = _b[1], w_1 = _b[2]; wc = w_1 * c; if (wc > 1) { wc = 1; } pq = Utils_1.Utils.sub(result[i], result[j]); mag = Utils_1.Utils.norm(pq); r = (mag - distances[i][j]) / (2 * mag + eps); if (threshold != null) { var Delta = Math.abs(wc * (mag - distances[i][j]) / 2); if (Delta > Delta_max) { Delta_max = Delta; } } m = Utils_1.Utils.mult(pq, Utils_1.Utils.fillArray(D, wc * r)); result[i] = Utils_1.Utils.sub(result[i], m); result[j] = Utils_1.Utils.add(result[j], m); } if (threshold != null) { if (Delta_max < threshold) { return result; } } } return result; }; return MDSSGD; }()); exports.MDSSGD = MDSSGD; //# sourceMappingURL=MDSSGD.js.map