function dotProduct(a: number[], b: number[]): number { return a.map((x, i) => x * b[i]).reduce((sum, current) => sum + current, 0); } function magnitude(arr: number[]): number { return Math.sqrt(arr.map(x => x * x).reduce((sum, current) => sum + current, 0)); } function cosineSimilarity(arr1: number[], arr2: number[]): number { if (arr1.length !== arr2.length) { throw new Error("Arrays must have the same length"); } const dotProd = dotProduct(arr1, arr2); const magnitudeProd = magnitude(arr1) * magnitude(arr2); if (magnitudeProd === 0) { return 0; } return dotProd / magnitudeProd; } function averageOfArrays(arr: number[][]): number[] { // Get the length of the first sub-array const length = arr[0].length; // Initialize an array to store the sums const sums = Array(length).fill(0); // Loop over each sub-array for (let i = 0; i < arr.length; i++) { // Loop over each element in the sub-array for (let j = 0; j < arr[i].length; j++) { // Add the element to the corresponding sum sums[j] += arr[i][j]; } } // Divide each sum by the number of arrays to get the average const averages = sums.map(sum => sum / arr.length); return averages; } export { cosineSimilarity, averageOfArrays };