2016-06-29 8 views
0

A Neural Bayesian Estimator for Conditional Probability Densities이라는 문맥에서 변수의 일부 전처리를 구현 중입니다.통합 Chi^2 함수의 역함수를 구현하는 방법은 무엇입니까?

상태 : 1.) 비선형 일 때, s가 균일하게 분포하는 단조 변수 변환 F : t-> s가 적용됩니다. 하여 용지에 언급이 달성 될 수

>>> sorting the target vector in ascending order 
>>> fitting the spline to data, e.g. using interpolate from scipy 

2)는 그 후이 interp 달성 될 수 -1과 1 사이에 놓여 스케일링 S :

>>> from numpy import interp 
>>> interp(256,[1,512],[5,10]) 

3) 마지막으로 평면 분포는 표준 1을 사용하여 0을 중심으로 한 가우스 분포로 변환해야합니다.

구현 방법에 대한 첫 번째 두 단계는 분명하지만 세 번째 단계는 어려움을 겪고 있습니다.

3)에 관해서는 저자는 통합 X^2 (X ... chi) 함수의 역함수를 사용할 수 있다고 말합니다. 이 작업에 적합한 라이브러리, 특히 Python이 있습니까?

업데이트 1 :

X^2 = P *

다시 용지를 판독 한 결과, 다음과 같이 X^2 직접 치에 관련되지 않고, 오히려 계산 보인다 (O-1)^2 + (P-1) * ((- 1) -O)^2

순도와 같은 P

(쉽게 어떤 변수를 소정의 계산 될 수있다) 및 o 변수 자체.

-1과 1 사이의 비율로 주어진 s에 대해 나는 lower bound = -1 및 upper bound = s로 적분을 계산 한 다음 그 역함수를 구할 수 있습니다.

질문 : 수치로 표시하는 방법은 무엇입니까? 당신이 설명 here로 PDF와 X 2 분포를 의미하는 경우

답변

1

는, 당신은 무엇을 찾고 있는지 X 2 CDF입니다. 그것은 불완전한 감마 함수를 통해 표현됩니다. 동일한 참조를 참조하십시오. Scipy를 사용하여 계산하면 this 또는 that이 적합합니다. 분모 안에 전체 감마 함수를 잊지 마라.

불완전한 감마의 역함수를 찾으려면 SciPy의 역함수를 볼 수 있습니다 : this 또는 that.

따라서, 당신이 모든 보간 물건

표현 that 같은 온라인 통합 를 사용하여, 말, 분석적으로 계산 될 수 있다는 UPDATE

필요합니다 생각하지 않습니다.그냥 상한에 resulat 사이의 차이를 계산하고 하한에 결과 당신은 당신이 간격을 설정해야

UPDATE II

을 설정하고 자신

다음

(절대 안된!) 코드는 당신이 시도 할 수있다 사용. 그냥 cubic equation

def intgrl(x): 
    return x*(x*(3.0 + x - 6.0*p) + 3.0)/3.0 

def CDF(x, norm): 
    return (intgrl(x) - intgrl(-1.0))/norm 

def f(x, norm, rn): 
    return CDF(x, norm) - rn 

norm = intgrl(1.0) - intgrl(-1.0) 

rn = 0.12345 
res = scipy.optimize.brentq(f, -1.0, 1.0, args=(norm, rn)) 

업데이트입니다 - 참고, 나는 적분 다항식이기 때문에하지만, 더 최적의 방법은 here에서 다항식의 뿌리를 사용하는, 또는 코드를 스스로 할 수 일반 루트 찾는 루틴을 사용 III

변수 rn 0에서 업데이트를 얻었다 1.

from scipy.optimize import brentq 
import numpy as np 
import matplotlib.pyplot as plt 

def denormPDF(x, p): 
    return p*(1.0-x)**2 + (1.0-p)*((-1.0)-x)**2 

def intgrl(x, p): 
    return x*(x*(3.0 + x - 6.0*p) + 3.0)/3.0 

def CDF(x, p, norm): 
    return (intgrl(x, p) - intgrl(-1.0, p))/norm 

def PDF(x, p, norm): 
    return denormPDF(x, p)/norm 

def f(x, p, norm, rn): 
    return CDF(x, p, norm) - rn 

p = 0.25 

norm = intgrl(1.0, p) - intgrl(-1.0, p) 

x = np.linspace(-1.0, 1.0, 100) 
y = [PDF(x, p, norm) for x in x] 
z = [CDF(x, p, norm) for x in x] 

# plot PDF 
plt.plot(x, y) 
plt.show() 

# plot CDF 
plt.plot(x, z) 
plt.show() 

rn = np.linspace(0.000001, 1.0-0.000001, 50) 
iCDF = [brentq(f, -1.0, 1.0, args=(p, norm, rn)) for rn in rn] 

# plot inverse CDF 
plt.plot(rn, iCDF) 
plt.show() 
+0

일부 (임의 U (0,1)) 번호로 정의 하였다 ... – Scholle

+0

@Scholle 업데이트보기 –

+0

유망! 온라인 계산기에서 위/아래 경계를 설정할 위치는 어디입니까? 적분의 역함수를 구하는 차분 계산에 관해서 : 아마도 -1에서 1까지의 적분 A와 -1에서 O까지의 (0 = -1과 1 사이의 어떤 값의 변수) 계산을 의미 할 것입니다. 역 C는 C = AB입니다. 당신이 programatically 할 필요가있는 모든 파이썬 lib coz 알아요. – Scholle