示例#1
0
    def function_convolution(self, dist_1, dist_2, bins=50):
        a_1, b_1, a_2, b_2 = 0, 0, 0, 0
        if dist_1 in self.bounds:
            a_1, b_1 = self.bounds[dist_1]
        else:
            a_1, b_1 = calculate_bounds_of_probability_distribution(dist_1)
            self.bounds[dist_1] = a_1, b_1
        if dist_2 in self.bounds:
            a_2, b_2 = self.bounds[dist_2]
        else:
            a_2, b_2 = calculate_bounds_of_probability_distribution(dist_2)
            self.bounds[dist_2] = a_2, b_2

        if (type(dist_1.dist), type(dist_2.dist)) == (uniform_gen, uniform_gen):
            return self.function_convolution_uniform((a_1, b_1), (a_2, b_2))

        convolution_bounds_a, convolution_bounds_b = min(a_1, a_2), max(b_1, b_2)

        delta = fabs(convolution_bounds_a - convolution_bounds_b) / bins
        convolution_interval = TimeInterval(convolution_bounds_a, convolution_bounds_b, bins)
        x = [dist_1.pdf(t) for t in convolution_interval]
        y = [dist_2.pdf(t) for t in reversed(convolution_interval)]

        c = convolve(x, y)
        dictionary_convolution = {}
        for t in xrange(len(c)):
            dictionary_convolution[delta * t] = c[t]
        bias = calculateCenterMass(dictionary_convolution)[0] + dist_2.mean() - dist_1.mean()
        dictionary_convolution_biased = {}
        for t in dictionary_convolution:
            dictionary_convolution_biased[t - bias] = dictionary_convolution[t]

        convolution_function = FunctionPiecewiseLinear(dictionary_convolution_biased, FunctionHorizontalLinear(0))
        return convolution_function.normalised()
示例#2
0
    def __init__(self, distribution_beginning, distribution_ending,
                 bins=50, relation_formula=None):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError("'distribution_beginning' should be a scipy frozen distribution")
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError("'distribution_ending' should be a scipy frozen distribution")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(distribution_beginning)
        ending, b = calculate_bounds_of_probability_distribution(distribution_ending)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
        if relation_formula is None:
            relation_formula = RelationFormulaGeometricMean()
        elif not isinstance(relation_formula, BaseRelationFormula):
            raise TypeError("'relation_formula' should be of type 'BaseRelationFormula'")
        relation_formula.bounds[distribution_beginning] = self.a, self.beginning
        relation_formula.bounds[distribution_ending] = self.ending, self.b
        self._formula_creator = FormulaCreator(relation_formula)
示例#3
0
    def function_convolution(self, dist_1, dist_2, bins=50):
        a_1, b_1, a_2, b_2 = 0, 0, 0, 0
        if dist_1 in self.bounds:
            a_1, b_1 = self.bounds[dist_1]
        else:
            a_1, b_1 = calculate_bounds_of_probability_distribution(dist_1)
            self.bounds[dist_1] = a_1, b_1
        if dist_2 in self.bounds:
            a_2, b_2 = self.bounds[dist_2]
        else:
            a_2, b_2 = calculate_bounds_of_probability_distribution(dist_2)
            self.bounds[dist_2] = a_2, b_2

        if (type(dist_1.dist), type(dist_2.dist)) == (uniform_gen, uniform_gen):
            return self.function_convolution_uniform((a_1, b_1), (a_2, b_2))

        convolution_bounds_a, convolution_bounds_b = min(a_1, a_2), max(b_1, b_2)

        delta = fabs(convolution_bounds_a - convolution_bounds_b) / bins
        convolution_interval = TimeInterval(convolution_bounds_a, convolution_bounds_b, bins)
        x = [dist_1.pdf(t) for t in convolution_interval]
        y = [dist_2.pdf(t) for t in reversed(convolution_interval)]

        c = convolve(x, y)
        dictionary_convolution = {}
        for t in xrange(len(c)):
            dictionary_convolution[delta * t] = c[t]
        bias = calculateCenterMass(dictionary_convolution)[0] + dist_2.mean() - dist_1.mean()
        dictionary_convolution_biased = {}
        for t in dictionary_convolution:
            dictionary_convolution_biased[t - bias] = dictionary_convolution[t]

        convolution_function = FunctionPiecewiseLinear(dictionary_convolution_biased, FunctionHorizontalLinear(0))
        return convolution_function.normalised()
示例#4
0
    def __init__(self,
                 distribution_beginning,
                 distribution_ending,
                 bins=50,
                 distribution_integral_limit=DISTRIBUTION_INTEGRAL_LIMIT):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError(
                "'distribution_beginning' should be a scipy frozen distribution"
            )
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError(
                "'distribution_ending' should be a scipy frozen distribution")
        if not 0 < distribution_integral_limit <= 1:
            raise TypeError(
                "'distribution_integral_limit' should be within (0, 1]")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(
            distribution_beginning, distribution_integral_limit)
        ending, b = calculate_bounds_of_probability_distribution(
            distribution_ending, distribution_integral_limit)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
示例#5
0
    def bounds_of(self, dist):
        # if dist in self.bounds:
        #     return self.bounds[dist]

        bounds = calculate_bounds_of_probability_distribution(dist)
        self.bounds[dist] = bounds
        return bounds
示例#6
0
    def bounds_of(self, dist):
        # if dist in self.bounds:
        #     return self.bounds[dist]

        bounds = calculate_bounds_of_probability_distribution(dist)
        self.bounds[dist] = bounds
        return bounds
示例#7
0
 def duration(self, dist):
     a, b = 0, 0
     if dist in self.bounds:
         a, b = self.bounds[dist]
     else:
         a, b = calculate_bounds_of_probability_distribution(dist)
         self.bounds[dist] = a, b
     return b - a
示例#8
0
 def duration(self, dist):
     a, b = 0, 0
     if dist in self.bounds:
         a, b = self.bounds[dist]
     else:
         a, b = calculate_bounds_of_probability_distribution(dist)
         self.bounds[dist] = a, b
     return b - a
示例#9
0
def fn_before_point(dist, time_step):
    a, b = calculate_bounds_of_probability_distribution(dist)
    p = dist.pdf(a)
    if time_step < a:
        return 1
    if a <= time_step <= b:
        value = p * (b - time_step) - p * (time_step - a)
        if value < 0:
            return 0
        return value
    return 0
示例#10
0
def fn_before_point(dist, time_step):
    a, b = calculate_bounds_of_probability_distribution(dist)
    p = dist.pdf(a)
    if time_step < a:
        return 1
    if a <= time_step <= b:
        value = p * (b - time_step) - p * (time_step - a)
        if value < 0:
            return 0
        return value
    return 0
示例#11
0
    def function_cosine(self, dist_1, dist_2, bins=50):
        a1, b1, a2, b2 = 0, 0, 0, 0
        if dist_1 in self.bounds:
            a1, b1 = self.bounds[dist_1]
        else:
            a1, b1 = calculate_bounds_of_probability_distribution(dist_1)
            self.bounds[dist_1] = a1, b1
        if dist_2 in self.bounds:
            a2, b2 = self.bounds[dist_2]
        else:
            a2, b2 = calculate_bounds_of_probability_distribution(dist_2)
            self.bounds[dist_2] = a2, b2

        cosine_bounds_a, cosine_bounds_b = min(a1, a2), max(b1, b2)

        delta = fabs(cosine_bounds_a - cosine_bounds_b) / bins
        convolution_interval = TimeInterval(cosine_bounds_a, cosine_bounds_b, bins)
        #convolution_interval = linspace(cosine_bounds_a, cosine_bounds_b, bins)
        x = [dist_1.pdf(t) for t in convolution_interval]
        y = [dist_2.pdf(t) for t in convolution_interval]

        return cosine(x, y)
示例#12
0
    def function_cosine(self, dist_1, dist_2, bins=50):
        a1, b1, a2, b2 = 0, 0, 0, 0
        if dist_1 in self.bounds:
            a1, b1 = self.bounds[dist_1]
        else:
            a1, b1 = calculate_bounds_of_probability_distribution(dist_1)
            self.bounds[dist_1] = a1, b1
        if dist_2 in self.bounds:
            a2, b2 = self.bounds[dist_2]
        else:
            a2, b2 = calculate_bounds_of_probability_distribution(dist_2)
            self.bounds[dist_2] = a2, b2

        cosine_bounds_a, cosine_bounds_b = min(a1, a2), max(b1, b2)

        delta = fabs(cosine_bounds_a - cosine_bounds_b) / bins
        convolution_interval = TimeInterval(cosine_bounds_a, cosine_bounds_b,
                                            bins)
        #convolution_interval = linspace(cosine_bounds_a, cosine_bounds_b, bins)
        x = [dist_1.pdf(t) for t in convolution_interval]
        y = [dist_2.pdf(t) for t in convolution_interval]

        return cosine(x, y)
示例#13
0
    def __init__(self, distribution_beginning, distribution_ending,
                 bins=50, distribution_integral_limit=DISTRIBUTION_INTEGRAL_LIMIT):
        if not isinstance(distribution_beginning, rv_frozen):
            raise TypeError("'distribution_beginning' should be a scipy frozen distribution")
        if not isinstance(distribution_ending, rv_frozen):
            raise TypeError("'distribution_ending' should be a scipy frozen distribution")
        if not 0 < distribution_integral_limit <= 1:
            raise TypeError("'distribution_integral_limit' should be within (0, 1]")
        self._distribution_beginning = distribution_beginning
        self._distribution_ending = distribution_ending

        a, beginning = calculate_bounds_of_probability_distribution(distribution_beginning, distribution_integral_limit)
        ending, b = calculate_bounds_of_probability_distribution(distribution_ending, distribution_integral_limit)

        self._beginning = UnixTime(beginning)
        self._ending = UnixTime(ending)
        self.membership_function = MembershipFunction(self)
        bins_beginning = bins / 2
        bins_ending = bins - bins_beginning
        self.interval_beginning = TimeInterval(a, beginning, bins_beginning)
        self.interval_ending = TimeInterval(ending, b, bins_ending)
        list.__init__(self, self.interval_beginning + self.interval_ending)
        TimeInterval.__init__(self, a, b, bins)
示例#14
0
 def before_integral_bounds(self, dist_1, dist_2):
     return calculate_bounds_of_probability_distribution(dist_1)
示例#15
0
 def same_integral_bounds(self, dist_1, dist_2):
     dist_1_a, dist_1_b = calculate_bounds_of_probability_distribution(dist_1)
     dist_2_a, dist_2_b = calculate_bounds_of_probability_distribution(dist_2)
     return max(dist_1_a, dist_2_a), min(dist_1_b, dist_2_b)
示例#16
0
 def same_integral_bounds(self, dist_1, dist_2):
     dist_1_a, dist_1_b = calculate_bounds_of_probability_distribution(
         dist_1)
     dist_2_a, dist_2_b = calculate_bounds_of_probability_distribution(
         dist_2)
     return max(dist_1_a, dist_2_a), min(dist_1_b, dist_2_b)
示例#17
0
 def after_integral_bounds(self, dist_1, dist_2):
     return calculate_bounds_of_probability_distribution(dist_2)
示例#18
0
def fn_after(dist_1, dist_2):
    a1, b1 = calculate_bounds_of_probability_distribution(dist_1)
    a2, b2 = calculate_bounds_of_probability_distribution(dist_2)
    return integral(lambda z: dist_2.pdf(z) * fn_before_point(dist_1, z),
                    min(a1, a2), max(b1, b2))
示例#19
0
def fn_after(dist_1, dist_2):
    a1, b1 = calculate_bounds_of_probability_distribution(dist_1)
    a2, b2 = calculate_bounds_of_probability_distribution(dist_2)
    return integral(lambda z: dist_2.pdf(z) * fn_before_point(dist_1, z), min(a1, a2), max(b1, b2))