@@ -28,7 +28,7 @@ type JSDivergence <: SemiMetric end
28
28
29
29
type SpanNormDist <: SemiMetric end
30
30
31
- typealias UnionMetrics @compat (Union{Euclidean, SqEuclidean, Chebyshev, Cityblock, Minkowski, Hamming, CosineDist, CorrDist, ChiSqDist, KLDivergence, JSDivergence, SpanNormDist})
31
+ typealias UnionMetrics @compat (Union{Euclidean, SqEuclidean, Chebyshev, Cityblock, Minkowski, Hamming, Jaccard, RogersTanimoto, CosineDist, CorrDist, ChiSqDist, KLDivergence, JSDivergence, SpanNormDist})
32
32
33
33
# ##########################################################
34
34
#
@@ -157,7 +157,7 @@ js_divergence(a::AbstractArray, b::AbstractArray) = evaluate(JSDivergence(), a,
157
157
158
158
# SpanNormDist
159
159
function eval_start (:: SpanNormDist , a:: AbstractArray , b:: AbstractArray )
160
- a[1 ] - b[1 ], a[1 ]- b[1 ]
160
+ a[1 ] - b[1 ], a[1 ] - b[1 ]
161
161
end
162
162
@compat @inline eval_op (:: SpanNormDist , ai, bi) = ai - bi
163
163
@compat @inline function eval_reduce (:: SpanNormDist , s1, s2)
@@ -248,46 +248,44 @@ end
248
248
249
249
# Jaccard
250
250
251
- function evaluate (dist:: Jaccard , a:: AbstractVector , b:: AbstractVector )
252
- n = get_common_len (a, b):: Int
253
- numerator = 0
254
- denominator = 0
255
- for i = 1 : n
256
- @inbounds ai = a[i]
257
- @inbounds bi = b[i]
258
- if ai > bi
259
- numerator += bi
260
- denominator += ai
261
- else
262
- numerator += ai
263
- denominator += bi
264
- end
265
- end
266
- 1 - (numerator / denominator)
251
+ @compat @inline eval_start (:: Jaccard , a:: AbstractArray , b:: AbstractArray ) = 0 , 0
252
+ @compat @inline function eval_op (:: Jaccard , s1, s2)
253
+ denominator = max (s1, s2)
254
+ numerator = min (s1, s2)
255
+ numerator, denominator
267
256
end
268
-
269
- jaccard (a:: AbstractVector , b:: AbstractVector ) = evaluate (Jaccard (), a, b)
257
+ @compat @inline function eval_reduce (:: Jaccard , s1, s2)
258
+ a = s1[1 ] + s2[1 ]
259
+ b = s1[2 ] + s2[2 ]
260
+ a, b
261
+ end
262
+ @compat @inline eval_end (:: Jaccard , a) = 1 - (a[1 ]/ a[2 ])
263
+ jaccard (a:: AbstractArray , b:: AbstractArray ) = evaluate (Jaccard (), a, b)
270
264
271
265
# Tanimoto
272
266
273
- function evaluate {T <: Bool} (dist:: RogersTanimoto , a:: AbstractVector , b:: AbstractVector )
274
- n = get_common_len (a, b):: Int
275
- tt = 0
276
- tf = 0
277
- ft = 0
278
- ff = 0
279
- for i = 1 : n
280
- @inbounds tt += (a[i] && b[i])
281
- @inbounds tf += (a[i] && ! b[i])
282
- @inbounds ft += (! a[i] && b[i])
283
- @inbounds ff += (! a[i] && ! b[i])
284
- end
285
- numerator = 2 (tf + ft)
286
- denominator = ntt + nff + 2 (ntf + nft)
267
+ @compat @inline eval_start (:: RogersTanimoto , a:: AbstractArray , b:: AbstractArray ) = 0 , 0 , 0 , 0
268
+ @compat @inline function eval_op (:: RogersTanimoto , s1, s2)
269
+ tt = s1 && s2
270
+ tf = s1 && ! s2
271
+ ft = ! s1 && s2
272
+ ff = ! s1 && ! s2
273
+ tt, tf, ft, ff
274
+ end
275
+ @compat @inline function eval_reduce (:: RogersTanimoto , s1, s2)
276
+ a = s1[1 ] + s2[1 ]
277
+ b = s1[2 ] + s2[2 ]
278
+ c = s1[3 ] + s2[3 ]
279
+ d = s1[4 ] + s1[4 ]
280
+ a, b, c, d
281
+ end
282
+ @compat @inline function eval_end (:: RogersTanimoto , a)
283
+ numerator = 2 (a[2 ] + a[3 ])
284
+ denominator = a[1 ] + a[4 ] + 2 (a[2 ] + a[3 ])
287
285
numerator / denominator
288
286
end
287
+ rogerstanimoto {T <: Bool} (a:: AbstractArray{T} , b:: AbstractArray{T} ) = evaluate (RogersTanimoto (), a, b)
289
288
290
- rogerstanimoto (a:: AbstractVector , b:: AbstractVector ) = evaluate (RogersTanimoto (), a, b)
291
289
292
290
function pairwise! (r:: AbstractMatrix , dist:: CosineDist , a:: AbstractMatrix , b:: AbstractMatrix )
293
291
m:: Int , na:: Int , nb:: Int = get_pairwise_dims (r, a, b)
0 commit comments