pdist 0.0.3 → 0.0.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/lib/pdist.rb +32 -29
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8f6118cbd2a20a7657698ccb221e3eca96f0b06c
|
4
|
+
data.tar.gz: 595fa6bc50c46f3ea10c70236b3a6e3a47e39012
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: d0f6b88bdd1b539087fa21eefffd16eb382e3b5879dbf3573fcfc08e07488a0296693824d8e3c6a6f9be14aedcbcf4879002c25ec4b9726f8173d1324e9b68c4
|
7
|
+
data.tar.gz: de356c84860ba351714b360bc88dc833632feb4802bf186b797b639971fbff39929b6bf3a8de5854328c18d98f2f66ff3f5eb0d71edc8e01608f2bef552c9f8c
|
data/lib/pdist.rb
CHANGED
@@ -3,38 +3,41 @@ class PDist
|
|
3
3
|
|
4
4
|
require 'diff/lcs'
|
5
5
|
|
6
|
+
# Returns array of values for each object's deviation in permutation, from original
|
6
7
|
def self.distances(original, permutation)
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
difference =
|
11
|
-
difference.
|
12
|
-
return difference_abs
|
8
|
+
indices = []
|
9
|
+
indices << original.map{|x| permutation.index(x)} # indices of original values in permutation
|
10
|
+
indices << Array(0..(original.length - 1)) # indices of original values in original
|
11
|
+
difference = indices.transpose.map {|x| x.reduce(:-)} # subtracting each object's index in original, from it's index in permutation, to find deviation
|
12
|
+
return difference.map! {|i| i.abs } # the deviation's, as absolute values (direction does not matter)
|
13
13
|
end
|
14
14
|
|
15
|
+
# Returns float of the deviation distance between original and permutation, normalized between 0.0 and 1.0
|
15
16
|
def self.deviation(original, permutation)
|
16
|
-
s = distances(original, permutation).inject(:+)
|
17
|
+
s = distances(original, permutation).inject(:+) # sum of each object's deviation, is the deviation distance between original and permutation
|
17
18
|
n = permutation.length
|
18
|
-
if n % 2 == 0
|
19
|
-
|
19
|
+
if n % 2 == 0
|
20
|
+
distance = (2.0 / (n ** 2).to_f) * s
|
20
21
|
else
|
21
|
-
|
22
|
+
distance = (2.0 / ((n ** 2) - 1).to_f) * s
|
22
23
|
end
|
23
|
-
return
|
24
|
+
return distance # if/else block normalizes the deviation distance
|
24
25
|
end
|
25
26
|
|
27
|
+
# Returns float of the squared deviation distance between original and permutation, normalized between 0.0 and 1.0
|
26
28
|
def self.square(original, permutation)
|
27
29
|
sq_dists = []
|
28
|
-
distances(original, permutation).each{|d| sq_dists << d**2}
|
29
|
-
s = sq_dists.inject(:+)
|
30
|
+
distances(original, permutation).each{|d| sq_dists << d**2} # each object's deviation is squared
|
31
|
+
s = sq_dists.inject(:+) # sum of each object's squared deviation, is the squared deviation distance between original and permutation
|
30
32
|
n = permutation.length
|
31
|
-
return (3.0 / (n**3 - n).to_f) * s
|
33
|
+
return (3.0 / (n**3 - n).to_f) * s # normalizes the squared deviation distance
|
32
34
|
end
|
33
35
|
|
34
|
-
|
36
|
+
# Returns float of the generalized hamming distance between original and permutation, normalized between 0.0 and 1.0
|
37
|
+
def self.hamming(original, permutation)
|
35
38
|
x = 0
|
36
39
|
hds = [] # hamming distances
|
37
|
-
permutation.each do |frag_id|
|
40
|
+
permutation.each do |frag_id| # hamming distances are 0 when object's have same index in original and permutation, and 1 when not
|
38
41
|
if frag_id == original[x]
|
39
42
|
hds << 0
|
40
43
|
else
|
@@ -42,18 +45,16 @@ class PDist
|
|
42
45
|
end
|
43
46
|
x+=1
|
44
47
|
end
|
45
|
-
|
48
|
+
total_hd = hds.inject(:+).to_f # total hamming distance is the sum of the hamming distances
|
49
|
+
return total_hd / permutation.length.to_f # normalizes by dividing the total hamming distance by the maximum possible total, which == number of objects
|
46
50
|
end
|
47
51
|
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
|
52
|
-
def self.rdist(original, permutation) # reverse R distance (since higher scores = bad)
|
52
|
+
# Returns float of the compliment R distance between original and permutation, normalized between 0.0 and 1.0
|
53
|
+
def self.rdist(original, permutation)
|
53
54
|
x = 0
|
54
|
-
r = []
|
55
|
+
r = [] # compliment of R distance == number of times two objects consecutive in original, are consectutive in permutation
|
55
56
|
n = permutation.length
|
56
|
-
(n - 1).times do
|
57
|
+
(n - 1).times do
|
57
58
|
y = permutation.index(original[x])
|
58
59
|
if original[x+1] == permutation[y+1]
|
59
60
|
r << 0
|
@@ -62,14 +63,16 @@ class PDist
|
|
62
63
|
end
|
63
64
|
x+=1
|
64
65
|
end
|
65
|
-
return r.inject(:+).to_f / (n - 1).to_f
|
66
|
+
return r.inject(:+).to_f / (n - 1).to_f # normalized: dividing by maximum number of consecutive occurences
|
66
67
|
end
|
67
68
|
|
69
|
+
# Returns float of the longest common sub-sequence between original and permutation, normalized between 0.0 and 1.0
|
68
70
|
def self.lcs(original, permutation)
|
69
|
-
lcs = Diff::LCS.LCS(original, permutation)
|
70
|
-
return (permutation.length - lcs.length).to_f / (permutation.length - 1).to_f
|
71
|
+
lcs = Diff::LCS.LCS(original, permutation) # diff-lcs gem used to calculate longest common sub-sequence
|
72
|
+
return (permutation.length - lcs.length).to_f / (permutation.length - 1).to_f # normalized: dividing by longest possible common sub-sequence
|
71
73
|
end
|
72
74
|
|
75
|
+
# Returns float of the kendall's tau distance between original and permutation, normalized between 0.0 and 1.0
|
73
76
|
def self.kendalls_tau(original, permutation)
|
74
77
|
n = permutation.length
|
75
78
|
x = 0
|
@@ -86,7 +89,7 @@ class PDist
|
|
86
89
|
end
|
87
90
|
x+=1
|
88
91
|
end
|
89
|
-
s = kt.inject(:+)
|
90
|
-
return 2 * (s.to_f / (n**2 - n).to_f)
|
92
|
+
s = kt.inject(:+) # the number of pairwise adjacent permutations required to transform original into permutation
|
93
|
+
return 2 * (s.to_f / (n**2 - n).to_f) # normalized kendall's tau distance
|
91
94
|
end
|
92
95
|
end
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: pdist
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.4
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Edward Chalstrey
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-04-
|
11
|
+
date: 2014-04-28 00:00:00.000000000 Z
|
12
12
|
dependencies: []
|
13
13
|
description: 'Ruby gem to compare permutations using distance measures/metrics. github:
|
14
14
|
https://github.com/edwardchalstrey1/pdist'
|