Skip to content

Commit

Permalink
Merge 6297d76 into 2392c67
Browse files Browse the repository at this point in the history
  • Loading branch information
trechberger committed Aug 18, 2020
2 parents 2392c67 + 6297d76 commit 8b53999
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 5 deletions.
34 changes: 30 additions & 4 deletions coupled_biased_random_walks/detect.py
Original file line number Diff line number Diff line change
Expand Up @@ -91,12 +91,38 @@ def score(self, observation_iterable):

def _score(self, observation):
"""
Computes the weighted anomaly score for an observation
Computes the weighted anomaly score (object_score in the paper) for an observation
:param observation: dict of the form {feature_name: feature_value, ...}
"""
return sum(self._get_feature_relevance(item) * \
self._stationary_prob.get(item, self._unknown_feature_score)
for item in iteritems(observation))
return sum((self._value_scores(observation)).values())

def value_scores(self, observation_iterable):
"""
Compute an anomaly sub-score for each value of the observation in observation_iterable
:param observation_iterable: iterable of dict observations with each dict
of the form {feature_name: feature_value, ...}
Return dict with sub score of each value of the observation/object of the form:
{feature_name: weighted score of value of feature, ...}
(sub-scores sum up to score(self, observation_iterable))
"""
if not (self._feature_relevance and self._stationary_prob):
raise CBRWScoreError()
if isinstance(observation_iterable, dict):
observation_iterable = [observation_iterable]
return [self._value_scores(obs) for obs in observation_iterable]

def _value_scores(self, observation):
"""
Computes the weighted value scores for each feature value of an observation
:param observation: dict of the form {feature_name: feature_value, ...}
"""
score_keys = []
value_scores = []
for item in iteritems(observation):
score_keys.append(get_feature_name(item))
value_scores.append(self._get_feature_relevance(item) * \
self._stationary_prob.get(item, self._unknown_feature_score))
return dict(zip(score_keys, value_scores))

def _get_feature_relevance(self, feature_tuple):
"""
Expand Down
8 changes: 7 additions & 1 deletion example.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

from six.moves import zip

#from coupled_biased_random_walks import CBRW
from coupled_biased_random_walks import CBRW
from data.loading import load_from_csv

Expand All @@ -22,8 +23,13 @@

# fit and score data
detector.fit()
print('Feature weights:\n{}\n'.format(detector.feature_weights))

scores = detector.score(data)

# print scores and observations
for score, datum in zip(scores, data):
print('Score: {} | Data: {}'.format(round(score, 4), datum))

print('\nValue scores per attribute:')
for i, value_score in enumerate(detector.value_scores(data)):
print('Observation {}: {}'.format(i, value_score))

0 comments on commit 8b53999

Please sign in to comment.