2017-12-13 13 views
0

私はsklearnを使って多次元スケーリング解析を実行しようとしている16,000x16,000の対称行列を持っています。私は独特の相違度の計算を作成したので私自身の行列を使う必要があります。計算はdf.pivotを使用する前に実行され、すべての計算はnp.float64タイプを使用して実行されました。Pythonは、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 

手動でデータを見たとき、それは完璧に見えるが、非常に多くの列と行を考えると、私はもしそこに驚きませんdf.pivotコマンドに混乱をもたらした、受け取った初期データから最初のペアごとの列/行グループから作成されたエラーまたは2つでした。

このように、np.allcloseエラーをクリアできるように、この相違度行列の1つまたは2つの非対称値を見つけるにはどうすればよいですか?

答えて

1

デバッグの目的で、おそらくそれらのエラーが小さいかどうかを知ることに興味があります。

  • は、いくつかの誤ったSYM-行列を作成
  • チェックが絶対的にMAX-エラーアウト
  • プリント(内部的に)あなたのコードで使用したのと同じ機能を使用して対称
  • :あなたは、次のデモを使用する場合があります

現在:観測された誤差が小さい場合は、処理によっては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)) 

出力:

C:\Miniconda3\lib\site-packages\sklearn\utils\validation.py:709: 
UserWarning: Array is not symmetric, and will be converted to symmetric by 
average with its transpose. 
    warnings.warn("Array is not symmetric, and will be converted " 
max error: 0.00999999999999 
max error repaired: 0.0 
+1

それは不思議に思った。私は丸めを試みましたが、必要な1e-10と比較してtol 1e-6しか戻っていませんでした。check_symmetricはデータのほとんどを変更することなく完全に機能しました。ありがとう、トン! – WolVes

0

あなたは、比較が失敗したかを理解するためにnp.whereを使用する場合があります:チルダ(〜)は論理否定である

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

関連する問題