2013-08-01 5 views

답변

6

내가 R을 알고 있지만, 당신은 아마하려는 일반적인 버전 (약간 덜 일반적인 방법이기는하지만)

def scale(y, c=True, sc=True): 
    x = y.copy() 

    if c: 
     x -= x.mean() 
    if sc and c: 
     x /= x.std() 
    elif sc: 
     x /= np.sqrt(x.pow(2).sum().div(x.count() - 1)) 
    return x 

을 트릭을 할 것 다음과 같이 보이는 문서를 읽고에서하지 않는다 몇 가지 유형/길이 검사를해야합니다.

편집 : elif sc: 절 R 워드 프로세서에서

에서 분모의 추가 설명 :

... If ‘scale’ is 
‘TRUE’ then scaling is done by dividing the (centered) columns of 
‘x’ by their standard deviations if ‘center’ is ‘TRUE’, and the 
root mean square otherwise. If ‘scale’ is ‘FALSE’, no scaling is 
done. 

The root-mean-square for a (possibly centered) column is defined 
as sqrt(sum(x^2)/(n-1)), where x is a vector of the non-missing 
values and n is the number of non-missing values. In the case 
‘center = TRUE’, this is the same as the standard deviation, but 
in general it is not. 

라인 np.sqrt(x.pow(2).sum().div(x.count() - 1)) 루트가 처음 x합니다 (pow 방법)을 제곱하여 정의를 사용하여 제곱 평균 계산 행을 따라 합계 한 다음 각 열의 NaN 수가 아닌 숫자로 나누십시오 (count 메소드).

참고로, 센터링 후 RMS를 단순히 계산하지 않은 이유는 std 메서드가 bottleneck 메서드를 호출하여 해당 표현의 빠른 계산을 위해 표준 편차를 계산하고 보다 일반적인 RMS.

대신 센터링 후 RMS를 계산할 수 있습니다. 벤치 마크의 가치가있을 수 있습니다. 지금은이 글을 쓰고 있기 때문에 어느 것이 더 빠르며 실제로 벤치마킹을하지 않았기 때문입니다.

+0

설명 할 수있는'/ = np. sqrt (x.pow (2) .sum(). div (x.count() - 1))'? – user248237dfsf

+0

R docs에 따라 계산 된 제곱근은 중앙에 있으면 표준 편차가되므로 중간 if 문을 제거하고'if c : x - = x.mean(); if sc : x/= np.sqrt (x.pow (2) .sum(). div (x.count() - 1))' – machow

+0

@ 닫힘. 나는 그처럼 논평했다. –

7

스케일링은 기계 학습 작업에서 매우 일반적이므로 scikit-learn의 preprocessing 모듈에서 구현됩니다. pandas DataFrame을 scale 메소드로 전달할 수 있습니다.

유일한 "문제"는 반환 된 객체가 더 이상 DataFrame이 아니라 numpy 배열이라는 것입니다. 어쨌든 기계 학습 모델 (예 : SVM 또는 로지스틱 회귀)에 전달하려는 경우 일반적으로 실제 문제가 아닙니다.

from sklearn.preprocessing import scale 
from pandas import DataFrame 

newdf = DataFrame(scale(df), index=df.index, columns=df.columns) 

here 참조 : 당신이 DataFrame을 유지하려면, 그것은 몇 가지 해결 방법을 필요로한다.

관련 문제