コサイン空間距離
use strict;
use warnings;
my $data1 = { item1 => 2, item2 => 1, item3 => 4 };
my $data2 = { item1 => 2, item2 => 1, item3 => 5 };
my $product = 0;
my $data1_vec = 0;
my $data2_vec = 0;
for (sort keys %{ $data1 }) {
if (defined $data2->{$_}) {
$product += $data1->{$_} * $data2->{$_};
}
$data1_vec += $data1->{$_} ** 2;
}
for (sort keys %{ $data2 }) {
$data2_vec += $data2->{$_} ** 2;
}
print $product / (sqrt($data1_vec) * sqrt($data2_vec));