2017-12-13 14 views
0

필자는 sklearn을 사용하여 다차원 스케일링 분석을 수행하려고 시도하고있는 16,000x16,000 대칭 행렬을 가지고 있습니다. 고유 한 비평가 계산을 작성했기 때문에 자체 행렬을 사용해야합니다. 계산은 df.pivot을 사용하기 전에 수행되었으며 모든 계산은 np.float64 유형을 사용하여 수행되었습니다. 내가 분석을 실행하면df.pivot에 의해 생성 된 근사 대칭 행렬에서 파이썬 오류를 찾습니다.

, 나는 대칭 오류가 아래 얻을 :

C:\Users\name\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\utils\validation.py in check_symmetric(array=memmap([[ 0.  , 0.0364484 , 0.02794817, ... 0.33687222, 
      1.  , 0.  ]]), tol=1e-10, raise_warning=True, raise_exception=True) 
    633  else: 
    634   symmetric = np.allclose(array, array.T, atol=tol) 
    635 
    636  if not symmetric: 
    637   if raise_exception: 
--> 638    raise ValueError("Array must be symmetric") 
    639   if raise_warning: 
    640    warnings.warn("Array is not symmetric, and will be converted " 
    641       "to symmetric by average with its transpose.") 
    642   if sp.issparse(array): 

ValueError: Array must be symmetric 

데이터를 통해보고 수동으로는 완벽하지만, 너무 많은 행과 열 주어진 보인다 나는 놀라지 않을 것이다 경우가 는받은 초기 데이터에서 처음으로 pairwise 열/행 그룹에서 생성 된 오류 또는 두 개이며 df.pivot 명령에 혼동이있었습니다.

질문은 따라서 np.allclose 오류를 지울 수 있도록이 비대칭 행렬에서 하나 또는 두 개의 비대칭 값을 어떻게 찾을 수 있습니까? 비교가 실패 할 경우

답변

1

디버깅을 위해 이러한 오류가 작은 지 아닌지 알고 싶어합니다.

  • 검사는 절대
  • 을에서 최대 오류 아웃 같은 (내부적으로) 코드에서 사용되는 기능
  • 인쇄를 사용하여 대칭 일부 잘못된 SYM 매트릭스를 만들고 다음과 같은 데모를 사용할 수 있습니다

지금 : 관찰 된 오류가 작은 경우 처리에 따라 fp-math가 원인 일 수 있습니다. 그렇지 않다면 아마도 심각하게 부서진 것이있을 것입니다.

작은 오류가 발생하면 sklearn의 util-function을 사용할 수 있습니다. 실제로는 스택 트레이스에 표시된대로 복구 된 행렬을 제공합니다 (평균화하여, 아마 도메인 별 정보없이 할 수있는 최상의 방법 일 수 있습니다). 이 기능으로 당신을 위해 사용되지 않는 것은 called with입니다 :

dissimilarities = check_symmetric(dissimilarities, raise_exception=True) 

데모 :

import numpy as np 
from sklearn.utils.validation import check_symmetric 

A_ = np.random.random(size=(1000, 1000)) 
A = A_.dot(A_.T) 
A[2,1] += 1e-2 

A_repaired = check_symmetric(A)  # default: raise_warning=True, raise_exception=False) 
print('max error: ', np.amax(np.abs(A - A.T)))   
print('max error repaired: ', np.amax(A_repaired - A_repaired.T)) 

출력 :

01,239,110,163,348,524,369,742,732 10
+1

그건 놀라운 일이되었습니다. 나는 반올림을 시도했지만, 필요한 1e-10에 비해 tol 1e-6으로 돌아왔다. check_symmetric은 거의 모든 데이터를 변경하지 않고 완벽하게 작동했다. 엄청 고마워! – WolVes

0

당신은 이해 np.where을 사용할 수 있습니다 : 물결표 (~)는 논리적 부정이다

np.where(~np.close(array, array.T)) 

.