2016-08-21 5 views
1

Я пытаюсь построить интеграл от этого нормального распределения для значений, превышающих й определяются какPython - Интеграция всего списка с гауссовым распределением

enter image description here

где

enter image description here

определение обеих функций в python

import scipy.integrate as integrate 
import numpy as np 

def gaussian(x, mu, sig): 
    norm = 1/np.sqrt(2*np.pi*sig*sig) 
    return norm * np.exp(-np.power(x - mu, 2.)/(2. * sig*sig)) 

def gaussianGreater(x, mu, sig): 
    Integrand = lambda x: gaussian(x, mu, sig) 
    return integrate.quad(Integrand,-np.Inf, x)[0] 

Теперь моя проблема заключается в границах интеграции моей функции gaussianGreater, когда она вычисляется через функцию распределения. При оценке это происходит.

y = gaussianGreater(subdist_1, mu_1, sig_1) 
xd = np.argsort(subdist_1) 

fig = plt.figure(figsize=(8,6)) 
ax = fig.add_subplot(111) 
ax.plot(subdist_1[xd] ,y[xd]) 

ValueError: The truth value of an array with more than one element 
is ambiguous. Use a.any() or a.all() 

Я попытался изменить верхние границы к тому, что дал мне ошибку, но это будет возвращать ошибку 'float' object has no attribute '__getitem__'

Применив для цикла не работает либо

[gaussianGreater(x, mu_1, sig_1) for x in subdist_1] 

TypeError: only integer arrays with one element can be converted to an index 

Как исправить Эта проблема?

+0

Какое поведение вы хотите точно? Вы хотите, чтобы аргумент 'x' для' gaussianGreater' мог быть списком значений и использовать наибольший из них в вызове 'integrrate.quad'? – spruceb

+0

@SpruceBondera Я буду лучше разбираться в редактировании. Я просто пытаюсь исправить границы интеграции, как первая функция, которую я опубликовал. – DarthLazar

ответ

1

Вы можете непосредственно использовать функцию выживания scipy.stats.norm «s 1 - F (х):

import scipy.stats as ss 
x = np.linspace(-3, 3, 100) 
y = ss.norm.sf(x) # you can pass its mean and std. dev. as well 
plt.plot(x, y) 

enter image description here

+0

Благодарим вас за ответ. Так что это фактически функция, которую я определил в своем посте, но как вызываемая функция из scipy? Просто хочу убедиться. – DarthLazar

+0

Это векторизованная версия P (X> x): это означает, что она вычисляет вероятность того, что значение X больше заданного x. Разница в том, что она векторизована, поэтому вы можете передать массив x, и он возвращает массив того же размера с соответствующими вероятностями. Теперь, когда я перечитываю ваш вопрос, интеграция, похоже, для P (X ayhan

+0

Я вижу. Опять же, я ценю помощь! – DarthLazar

1

То, что вы определили, будет работать только тогда, когда x является единственным float. Если вы хотите передать массив numpy, скажите np.array([0.2, 0.3]) и получите [N (> 0,2), N (> 0,3)], то вы можете использовать эту функцию, как вы уже определили, и просто вызвать метод vectorize , Поэтому, если a был массивом numpy, который вы использовали, a.vectorize(gaussianGreater) доставит вам массив с gaussianGreater, применяемым к каждому элементу. Вы можете определить другую функцию, vectorGausssianGreater, которая принимает массив и просто возвращает результат этого векторизованного вызова на нем. Если то, что вы действительно хотите одну функцию, которая может принимать значения массива, можно определить что-то вроде следующего:

def gaussian_greater(values, mean, standard_deviation): 
    def greater_float(upper_bound): 
     integrand = lambda y: gaussian(y, mean, standard_deviation) 
     return integrate.quad(integrand, -np.inf, upper_bound)[0] 
    return values.vectorize(greater) 
+0

Спасибо за ответ. Если посмотреть на уравнение сейчас, я должен попытаться связать значения в каждом списке, интегрируя от отрицательной бесконечности к этому числу, чтобы получить какое-то значение, в то время как то же число по-прежнему оценивается через гауссовую функцию. Любые идеи о том, как это сделать? – DarthLazar