UNPKG

ml-matrix

Version:

Matrix manipulation and computation library

54 lines (48 loc) 1.26 kB
import { isAnyArray } from 'is-any-array'; import Matrix from './matrix'; export function correlation(xMatrix, yMatrix = xMatrix, options = {}) { xMatrix = new Matrix(xMatrix); let yIsSame = false; if ( typeof yMatrix === 'object' && !Matrix.isMatrix(yMatrix) && !isAnyArray(yMatrix) ) { options = yMatrix; yMatrix = xMatrix; yIsSame = true; } else { yMatrix = new Matrix(yMatrix); } if (xMatrix.rows !== yMatrix.rows) { throw new TypeError('Both matrices must have the same number of rows'); } const { center = true, scale = true } = options; if (center) { xMatrix.center('column'); if (!yIsSame) { yMatrix.center('column'); } } if (scale) { xMatrix.scale('column'); if (!yIsSame) { yMatrix.scale('column'); } } const sdx = xMatrix.standardDeviation('column', { unbiased: true }); const sdy = yIsSame ? sdx : yMatrix.standardDeviation('column', { unbiased: true }); const corr = xMatrix.transpose().mmul(yMatrix); for (let i = 0; i < corr.rows; i++) { for (let j = 0; j < corr.columns; j++) { corr.set( i, j, corr.get(i, j) * (1 / (sdx[i] * sdy[j])) * (1 / (xMatrix.rows - 1)), ); } } return corr; }