-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathlisttest.rb
65 lines (62 loc) · 1.93 KB
/
listtest.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
def relative_position(item, array)
# returns a value between 1 and -1
# 1 for first item, 0 for last item
# equal distances between items
if array.size <= 1
return 0
elsif array.size.odd?
median = array.size / 2
increment = 1.0 / median
value = (array.index(item) - median) * (- increment)
value
else
increment = 2.0 / (array.size - 1)
value = 1 - (array.index(item) * increment)
end
end
def relative_diff(item, array1, array2)
# calculates the difference of index between item in two arrays
# if item not in one array, gives the index in the other
# if item not in any array, returns 0
if array1.include?(item) && array2.include?(item)
return (relative_position(item, array1) - relative_position(item, array2)).abs
elsif array1.include?(item)
return relative_position(item, array1)
elsif array2.include?(item)
return relative_position(item, array2)
else
return nil
end
end
def euclidean_distance(array1, array2)
# gives the vector distance of two arrays
# item is axis, index is value
if array1 & array2 == []
return nil
else
all_distances = []
array1.each do |item|
# calculates distance for all items in array 1
distance = relative_diff(item, array1, array2)
all_distances << distance
end
(array2 - array1).each do |item|
distance = relative_diff(item, array1, array2)
all_distances << distance
end
sum_of_squared_distances = 0
all_distances.each do |distance|
sum_of_squared_distances += distance**2
end
return Math.sqrt(sum_of_squared_distances)
end
end
def relevance(array1, array2)
distance = euclidean_distance(array1, array2)
intersection_size = (array1 & array2).size
unless distance == nil
relevance = intersection_size / distance
return relevance
end
return nil
end