hdsp2
Version:
High-Dimensional Space Projections
98 lines • 3.67 kB
JavaScript
"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