#!/usr/bin/env python # -*- coding: utf-8 -*- # The MIT License (MIT) # Copyright (c) 2017 Juan Cabral # Permission is hereby granted, free of charge, to any person obtaining a copy # of this software and associated documentation files (the "Software"), to deal # in the Software without restriction, including without limitation the rights # to use, copy, modify, merge, publish, distribute, sublicense, and/or sell # copies of the Software, and to permit persons to whom the Software is # furnished to do so, subject to the following conditions: # The above copyright notice and this permission notice shall be included in # all copies or substantial portions of the Software. # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR # IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, # FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE # AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER # LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, # OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE # SOFTWARE. # ============================================================================= # DOC # ============================================================================= """""" # ============================================================================= # IMPORTS # ============================================================================= import numpy as np from .core import Extractor # ============================================================================= # EXTRACTOR CLASS # ============================================================================= class Beyond1Std(Extractor): """ **Beyond1Std** Percentage of points beyond one standard deviation from the weighted mean. For a normal distribution, it should take a value close to 0.32: .. code-block:: pycon >>> fs = feets.FeatureSpace(only=['Beyond1Std']) >>> features, values = fs.extract(**lc_normal) >>> dict(zip(features, values)) {'Beyond1Std': 0.317} References ---------- .. [richards2011machine] Richards, J. W., Starr, D. L., Butler, N. R., Bloom, J. S., Brewer, J. M., Crellin-Quick, A., ... & Rischard, M. (2011). On machine-learned classification of variable stars with sparse and noisy time-series data. The Astrophysical Journal, 733(1), 10. Doi:10.1088/0004-637X/733/1/10. """ data = ["magnitude", "error"] features = ["Beyond1Std"] def fit(self, magnitude, error): n = len(magnitude) weighted_mean = np.average(magnitude, weights=1 / error ** 2) # Standard deviation with respect to the weighted mean var = sum((magnitude - weighted_mean) ** 2) std = np.sqrt((1.0 / (n - 1)) * var) count = np.sum( np.logical_or( magnitude > weighted_mean + std, magnitude < weighted_mean - std, ) ) return {"Beyond1Std": float(count) / n}