UNPKG

@ai-on-browser/data-analysis-models

Version:

Data analysis model package without any dependencies

52 lines (49 loc) 1.36 kB
/** * Returns Co-Ranking Matrix. * @param {Array<Array<number>>} x Reduced values * @param {Array<Array<number>>} z Original values * @param {number} ks Rank significance * @param {number} kt Failure tolerance * @returns {number} Co-Ranking Matrix value */ export function coRankingMatrix(x, z, ks, kt) { // https://qiita.com/ZoneTsuyoshi/items/1c532a3a7bfaf5393e55 const n = x.length const dx = [] const dz = [] for (let i = 0; i < n; i++) { dx[i] = Array(n).fill(0) dz[i] = Array(n).fill(0) } for (let i = 0; i < n; i++) { for (let j = i + 1; j < n; j++) { dx[i][j] = dx[j][i] = Math.sqrt(x[i].reduce((s, v, k) => s + (v - x[j][k]) ** 2, 0)) dz[i][j] = dz[j][i] = Math.sqrt(z[i].reduce((s, v, k) => s + (v - z[j][k]) ** 2, 0)) } } const rx = [] const rz = [] for (let i = 0; i < n; i++) { rx[i] = Array(n).fill(0) rz[i] = Array(n).fill(0) for (let j = 0; j < n; j++) { for (let k = 0; k < n; k++) { if (dx[i][k] < dx[i][j] || (dx[i][k] === dx[i][j] && k < j)) { rx[i][j]++ } if (dz[i][k] < dz[i][j] || (dz[i][k] === dz[i][j] && k < j)) { rz[i][j]++ } } } } let q = 0 for (let i = 0; i < n; i++) { for (let j = 0; j < n; j++) { const ws = rx[i][j] > ks && rz[i][j] > ks ? 0 : 1 const wt = Math.abs(rx[i][j] - rz[i][j]) > kt ? 0 : 1 q += ws * wt } } return q / (ks * n) }