kinjouj.github.io

jaccard & tanimo係数

2010-02-09T00:00:00+09:00 perl

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);
}