2

次のように、「diff」と呼ばれる 2 つのベクトルの差である変数にガウス カーネル密度推定器を当てはめています。

class gaussian_kde_covfact(stats.gaussian_kde):
    def __init__(self, dataset, covfact = 'scotts'):
        self.covfact = covfact
        scipy.stats.gaussian_kde.__init__(self, dataset)

    def _compute_covariance_(self):
        '''not used'''
        self.inv_cov = np.linalg.inv(self.covariance)
        self._norm_factor = sqrt(np.linalg.det(2*np.pi*self.covariance)) * self.n

    def covariance_factor(self):
        if self.covfact in ['sc', 'scotts']:
            return self.scotts_factor()
        if self.covfact in ['si', 'silverman']:
            return self.silverman_factor()
        elif self.covfact:
            return float(self.covfact)
        else:
            raise ValueError, \
                'covariance factor has to be scotts, silverman or a number'

    def reset_covfact(self, covfact):
        self.covfact = covfact
        self.covariance_factor()
        self._compute_covariance()

これは機能しますが、差分がすべて 0 のベクトルであるエッジ ケースがあります。その場合、次のエラーが表示されます。

 File "/srv/pkg/python/python-packages/python26/scipy/scipy-0.7.1/lib/python2.6/site-packages/scipy/stats/kde.py", line 334, in _compute_covariance
    self.inv_cov = linalg.inv(self.covariance)
  File "/srv/pkg/python/python-packages/python26/scipy/scipy-0.7.1/lib/python2.6/site-packages/scipy/linalg/basic.py", line 382, in inv
    if info>0: raise LinAlgError, "singular matrix"
numpy.linalg.linalg.LinAlgError: singular matrix

これを回避する方法は何ですか?この場合、本質的に差が 0 で完全にピークに達し、それ以外の場所に質量がない密度を返すようにしたいと考えています。

ありがとう。

4

1 に答える 1

2

質量が 1 点にある密度のピークはガウス分布ではないため、厳密に言えば、何をしたいかは定義されていません (そして、そのような分布には有限の共分散がありません)。

さて、あなたの場合、すべてゼロのベクトルの場合、インフラストラクチャ全体をバイパスして、それを特別なケースにすることができます。ケースを検出する簡単な方法は、差分の最大値を計算し、これを eps (ベクトル x の numpy.finfo(x.dtype).eps) と比較することです。LinalgError をキャッチして単純に検出することもできますが、共分散が正しく定義されておらず、エントリが 0 の場合を区別するように注意する必要があります。

于 2010-04-22T02:41:43.673 に答える