44 lines
1.3 KiB
TypeScript
44 lines
1.3 KiB
TypeScript
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 }; |