StackGenVis: Alignment of Data, Algorithms, and Models for Stacking Ensemble Learning Using Performance Metrics
https://doi.org/10.1109/TVCG.2020.3030352
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
68 lines
1.3 KiB
68 lines
1.3 KiB
4 years ago
|
"use strict"
|
||
|
|
||
|
var dup = require("dup")
|
||
|
var solve = require("robust-linear-solve")
|
||
|
|
||
|
function dot(a, b) {
|
||
|
var s = 0.0
|
||
|
var d = a.length
|
||
|
for(var i=0; i<d; ++i) {
|
||
|
s += a[i] * b[i]
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
function barycentricCircumcenter(points) {
|
||
|
var N = points.length
|
||
|
if(N === 0) {
|
||
|
return []
|
||
|
}
|
||
|
|
||
|
var D = points[0].length
|
||
|
var A = dup([points.length+1, points.length+1], 1.0)
|
||
|
var b = dup([points.length+1], 1.0)
|
||
|
A[N][N] = 0.0
|
||
|
for(var i=0; i<N; ++i) {
|
||
|
for(var j=0; j<=i; ++j) {
|
||
|
A[j][i] = A[i][j] = 2.0 * dot(points[i], points[j])
|
||
|
}
|
||
|
b[i] = dot(points[i], points[i])
|
||
|
}
|
||
|
var x = solve(A, b)
|
||
|
|
||
|
var denom = 0.0
|
||
|
var h = x[N+1]
|
||
|
for(var i=0; i<h.length; ++i) {
|
||
|
denom += h[i]
|
||
|
}
|
||
|
|
||
|
var y = new Array(N)
|
||
|
for(var i=0; i<N; ++i) {
|
||
|
var h = x[i]
|
||
|
var numer = 0.0
|
||
|
for(var j=0; j<h.length; ++j) {
|
||
|
numer += h[j]
|
||
|
}
|
||
|
y[i] = numer / denom
|
||
|
}
|
||
|
|
||
|
return y
|
||
|
}
|
||
|
|
||
|
function circumcenter(points) {
|
||
|
if(points.length === 0) {
|
||
|
return []
|
||
|
}
|
||
|
var D = points[0].length
|
||
|
var result = dup([D])
|
||
|
var weights = barycentricCircumcenter(points)
|
||
|
for(var i=0; i<points.length; ++i) {
|
||
|
for(var j=0; j<D; ++j) {
|
||
|
result[j] += points[i][j] * weights[i]
|
||
|
}
|
||
|
}
|
||
|
return result
|
||
|
}
|
||
|
|
||
|
circumcenter.barycenetric = barycentricCircumcenter
|
||
|
module.exports = circumcenter
|