2016-07-28 6 views

답변

5

이 기능을 구현하는 Python 패키지는 알 수 없지만 직접 구현을 롤업하는 것은 매우 쉽습니다.

def m(x, w): 
    """Weighted Mean""" 
    return np.sum(x * w)/np.sum(w) 

def cov(x, y, w): 
    """Weighted Covariance""" 
    return np.sum(w * (x - m(x, w)) * (y - m(y, w)))/np.sum(w) 

def corr(x, y, w): 
    """Weighted Correlation""" 
    return cov(x, y, w)/np.sqrt(cov(x, x, w) * cov(y, y, w)) 

나는 기능이 상기와 밀접 가능한 위키 피 디아에서 수식을 일치하도록했지만, 몇 가지 잠재적 인 단순화와 성능 향상이있다 : 위키 피 디아 문서의 이름 지정 규칙을 사용하여. 예를 들어, @Alberto Garcia-Raboso가 지적한 것처럼 m(x, w)은 실제로는 np.average(x, weights=w)이므로 실제 함수를 작성할 필요가 없습니다.

함수는 계산을 수행하는 것만 큼 예쁜 베어 본입니다. 계산을 수행하기 전에 입력을 배열로 강제 적용하는 것을 고려할 수 있습니다 (예 : x = np.asarray(x)). 목록이 전달 된 경우 이러한 함수가 작동하지 않으므로 x = np.asarray(x)입니다. 길이가 같고 널이 아닌 값 등을 갖는 모든 입력을 검증하기위한 추가 점검도 구현 될 수 있습니다.

사용 예제는 :

# Initialize a DataFrame. 
np.random.seed([3,1415]) 
n = 10**6 
df = pd.DataFrame({ 
    'x': np.random.choice(3, size=n), 
    'y': np.random.choice(4, size=n), 
    'w': np.random.random(size=n) 
    }) 

# Compute the correlation. 
r = corr(df['x'], df['y'], df['w']) 

P 값에 대한 토론 here있다. 일반 계산식처럼 보이지 않으며 실제로 가중치를 얻는 방법에 따라 다릅니다.

+1

'np.average'는'weights' 인자를 허용하므로'm (x, w)'를'np.average (x, weights = w)'로 정의 할 수 있습니다. –

+0

@ AlbertoGarcia-Raboso : 고마워, 그것에 관한 발언을 추가했습니다. 일관성을 위해 링크 된 위키 피 디아 문서의 수식과 최대한 일치하도록 코드를 그대로 두었습니다. – root