start implementing general precision/recall
This commit is contained in:
parent
ea058c9763
commit
b14e6a38a2
46
src/GEval/PrecisionRecall.hs
Normal file
46
src/GEval/PrecisionRecall.hs
Normal file
@ -0,0 +1,46 @@
|
||||
module GEval.PrecisionRecall
|
||||
where
|
||||
|
||||
f2Measure :: (a -> b -> Bool) -> [a] -> [b] -> Double
|
||||
f2Measure = fMeasure 2.0
|
||||
|
||||
fMeasure :: Double -> (a -> b -> Bool) -> [a] -> [b] -> Double
|
||||
fMeasure beta matchingFun expected got =
|
||||
(1 + betaSquared) * (p + r) / (betaSquared * p + 2)
|
||||
where betaSquared = beta ^ 2
|
||||
(p, r) = precisionAndRecall matchingFun expected got
|
||||
|
||||
precisionAndRecall :: (a -> b -> Bool) -> [a] -> [b] -> (Double, Double)
|
||||
precisionAndRecall matchFun expected got = precisionAndRecallFromCounts cs
|
||||
where cs = counts matchFun expected got
|
||||
|
||||
precisionAndRecallFromCounts :: (Int, Int, Int) -> (Double, Double)
|
||||
precisionAndRecallFromCounts (fp, fn, tp) = (tp / (tp+fp+epsilon), tp / (tp+fn+epsilon))
|
||||
where epsilon = 0.000001
|
||||
|
||||
precision :: (a -> b -> Bool) -> [a] -> [b] -> Double
|
||||
precision = first . precisionAndRecall
|
||||
|
||||
recall :: (a -> b -> Bool) -> [a] -> [b] -> Double
|
||||
recall = second . precisionAndRecall
|
||||
|
||||
counts :: (a -> b -> Bool) -> [a] -> [b] -> (Int, Int, Int)
|
||||
counts matchFun expected got = f
|
||||
|
||||
|
||||
countStep :: ([a], (Int, Int)) -> b -> ([a], (Int, Int))
|
||||
countStep (expectedLeft, fp, tp) itemGot =
|
||||
(rest, case firstMatched of
|
||||
Just _ -> (fp, tp+1)
|
||||
Nothing -> (fp+1, tp))
|
||||
where (rest, firstMatched) = findFirst ((flip matchingFun) itemGot) expectedLeft
|
||||
|
||||
findFirst :: (a -> Bool) -> [a] -> ([a], Maybe a)
|
||||
findFirst _ [] -> ([], Nothing)
|
||||
findFirst condition (x:xs) = if (condition x)
|
||||
then
|
||||
(xs, Just x)
|
||||
else
|
||||
(x:xs', m)
|
||||
where
|
||||
(xs',m) = findFirst condition xs
|
Loading…
Reference in New Issue
Block a user