2012-11-20 3 views
0

vq.whitenscipy.cluster에서 사용하여 데이터를 표준화하는 데 문제가 있습니다. 각 피쳐의 평균값으로 채워진 피쳐 값이없는 numpy 배열을 전달 중입니다.AttributeError 받기 : sqrt in vq.whiten

가에 걸리면 라인은 다음과 같습니다

data = scipy.cluster.vq.whiten(self.imputed) 

이 내가 누락 된 데이터를 대체하기 위해 사용하고 코드입니다.

imputed = np.array([self.masked[:,i].filled(self.masked[:,i].mean()) 
        for i in range(np.shape(self.masked)[1])]) 
self.imputed = np.transpose(imputed) 

나는 내 코드를 깨는 것으로 보인다 사실 꽤 떨어져 너무이 부분을 수행하는 더 나은 방법이있을거야. 그것은 추한 방법으로 보입니다. 보통은 파이썬으로 더 좋은 방법이 있다는 뜻입니다.

나는 배열의 얼마를 whiten에 보내지 만 트레이스 백에서 다음을 얻었는지에 관계없이 슬라이싱을 시도했습니다.

Traceback (most recent call last): 
    File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 87, in <module> 
    dataset.cluster() 
    File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 59, in cluster 
    data = scipy.cluster.vq.whiten(self.imputed) 
    File "C:\Enthought\Python27\lib\site-packages\scipy\cluster\vq.py", line 131, in whiten 
    std_dev = std(obs, axis=0) 
    File "C:\Enthought\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 2467, in std 
    return std(axis, dtype, out, ddof) 
AttributeError: sqrt 

클러스터링은 누락 된 데이터가없는 동일한 데이터 세트에서 올바르게 작동하므로 다음에 시도 할 대상이 손실됩니다.

편집 : I 세트의 전체 데이터를 사용하여 누락 된 데이터 하나 모두 imputed 각 항목 유형을 인쇄 시도 :

for item in imputed: 
    print type(item) 

둘 사이의 차이가있을 때 그 평균 대체 및 변환이 없었던 버전은 각 행에 대해 하나의 numpy.ndarray을 갖지만 대체 된 평균값은 각 열에 하나씩 있습니다.

+0

당신이 역 추적을 더 보여줄 수 :

영업의 잘못된 라인

로 대체 할 수 있을까? – tiago

+0

전체 Traceback을 표시하도록 편집되었습니다. 나는 그 문제가 내가'imputed '을 만드는 방법에 있다고 확신한다. 나는 1D numpy 배열의 배열로 나오고, 원하는 것은 2D numpy 배열이다. –

+0

예, imputed를 1D 배열로 설정하면 'vq.whiten'으로 중단됩니다.목록 이해력 ('[a b in c] ')을 없애고 누락 된 데이터를 대체하기위한 루프를 수행하는 것이 좋습니다. – tiago

답변

3

저는 지금 이것을 풀어서 미래의 잃어버린 영혼들을위한 답을 여기에 올릴 것입니다. 문제는 원래 데이터가 numpy.float64으로 저장되었을 때 내 평균 대체가 누락 된 값을 float으로 바꾸는 것이 었습니다.

해결 방법은 목록 이해를 실행하고 dtypenp.float64으로 설정하여이를 따르는 것입니다. whiten은 혼합 데이터 형식을 수신하지 않는 것 같습니다.

또한 목록의 이해 후에 옮겨야한다는 추악함 문제를 해결하기 위해 np.column_stack()을 재발견했습니다. 편집

def mean_impute(self): 
    imputed = np.column_stack(self.masked[:,i].filled(self.masked[:,i].mean()) 
       for i in range(np.shape(self.masked)[1])) 
    self.imputed = np.array(imputed, dtype=np.float64) 

지금 오래 전

을 추가하지만 난 여기에 업데이트 거라고 생각 : 작업 기능은 지금이다. 이제는 데이터 처리에 팬더를 사용하고이 상황에서는 pandasfill_na()을 사용합니다.

imputed = self.masked.fillna(self.masked.mean()) 
관련 문제