jaccard係数
use strict;
use warnings;
use Data::Dumper;
my $data1 = {
as3 => 2.0,
python => 2.0,
perl => 2.5,
php => 3.0,
'c++' => 4.5,
java => 2.5
};
my $data2 = {
scheme => 4.0,
python => 3.0,
perl => 4.0,
'c++' => 5.0
};
my $data3 = {
java => 3.5,
as3 => 3.5,
'c++' => 2.0,
perl => 1.0
};
print Dumper(jaccard($data1, $data2));
print Dumper(jaccard($data1, $data3));
print Dumper(jaccard($data2, $data3));
sub jaccard {
my ($data1, $data2) = @_;
my $vec1 = 0;
my $vec2 = 0;
for (keys %{ $data1 }) {
if(defined $data2->{$_}) {
$vec1 += $data1->{$_} + $data2->{$_};
}
}
for (keys %{ $data1 },keys %{ $data2 }) {
if(defined $data1->{$_}) {
$vec2 += $data1->{$_};
} elsif(defined $data2->{$_}) {
$vec2 += $data2->{$_};
}
}
return $vec1 / $vec2;
}
tanimono係数
use strict;
use warnings;
use Data::Dumper;
my $data1 = {
as3 => 2.0,
python => 2.0,
perl => 2.5,
php => 3.0,
'c++' => 4.5,
java => 2.5
};
my $data2 = {
scheme => 4.0,
python => 3.0,
perl => 4.0,
'c++' => 5.0
};
my $data3 = {
java => 3.5,
as3 => 3.5,
'c++' => 2.0,
perl => 1.0
};
print Dumper(tanimoto($data1, $data2));
print Dumper(tanimoto($data1, $data3));
print Dumper(tanimoto($data2, $data3));
sub tanimoto {
my ($data1, $data2) = @_;
my $product = 0;
my $vec1 = 0;
my $vec2 = 0;
for (keys %{ $data1 }) {
if(defined $data2->{$_}) {
$product += $data1->{$_} * $data2->{$_};
}
$vec1 += $data1->{$_} ** 2;
}
for (keys %{ $data2 }) {
$vec2 += $data2->{$_} ** 2;
}
return $product / ($vec1 + $vec2 - $product);
}