-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathdistance.lua
More file actions
133 lines (99 loc) · 2.48 KB
/
Copy pathdistance.lua
File metadata and controls
133 lines (99 loc) · 2.48 KB
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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
-- module setup
local M = {}
-- Import Section
local pow=math.pow
local huge=math.huge
local abs=math.abs
local ceil=math.ceil
local mini=math.min
local sort=table.sort
local print=print
local pairs=pairs
local next=next
-- Local Variables for module-only access
local tolerance=1e-3
-- No more external access after this point
_ENV = nil -- or M
-- Function definitions
-- Public function definitions
function M.similarity(points,dfun)
local size = #points
local sims = {}
for i=1,size do
sims[i] = {}
end
for i=1,size do
for j=i+1,size do
local d = dfun(points[i], points[j])
sims[i][j] = -d -- similarity is negative of distance metric
sims[j][i] = -d
end
end
return sims
end
function M.similarities(points,dfun)
local size = #points
local sims = {}
for i=1,size do
sims[i] = {}
end
for i=1,size do
for j=i+1,size do
sims[i][j] = -dfun(points[i], points[j]) -- similarity is negative of distance metric
sims[j][i] = -dfun(points[j], points[i])
end
end
return sims
end
-- Method's function definitions
function M.extrema(sims)
local ret = {}
for _,v in pairs(sims) do
for _,vv in pairs(v) do
ret[#ret+1] = vv
end
end
local N = #ret
sort(ret)
local mdn = N%2==1 and ret[ceil(N/2)] or (ret[N/2]+ret[N/2+1])/2
return {size=N, min=ret[1], max=ret[N], median=mdn}
end
function M.euclidean(x,y)
local ssq = 0.0
for i,v in pairs(x) do
ssq = ssq + (y[i] and pow(v-y[i],2) or 0) -- allow for sparse vectors
end
return ssq
end
function M.taxicab(x, y)
local sum=0
for i,v in pairs(x) do
sum = sum + (y[i] and abs(v - y[i]) or 0) -- allow for sparse vectors
end
return sum
end
function M.intersection(x, y)
local sum=0
local xsum=0
for i,v in pairs(x) do
sum = sum + (y[i] and mini(v,y[i]) or 0) -- allow for sparse vectors
xsum = xsum + v
end
--print(sum,xsum)
return 1-sum/xsum
end
function M.bintersection(x,y)
local sum = 0
local xsum = 0
-- local ysum = 0
-- for _ in pairs(y) do
-- ysum = ysum + 1 -- when N(x) ~= N(y) choose the greatest
-- end
for i,_ in pairs(x) do
sum = sum + (y[i] and 1 or 0)
xsum = xsum + 1
end
-- return 1-sum/(xsum>ysum and xsum or ysum)
return 1-sum/xsum
end
return M