KDE не работает с двумя точками?

Следующий тривиальный пример возвращает сингулярную матрицу. Почему? Есть способы побороть?

In: from scipy.stats import gaussian_kde
Out:

In:  points
Out: (array([63, 84]), array([46, 42]))

In:  gaussian_kde(points)
Out: (array([63, 84]), array([46, 42]))

LinAlgError: singular matrix

person Josh    schedule 09.10.2013    source источник


Ответы (2)


Глядя на обратную трассировку, вы можете видеть, что она терпит неудачу при инвертировании ковариационной матрицы. Это связано с точной мультиколлинеарностью ваших данных. На странице у вас есть мультиколлинеарность в ваших данных, если две переменные коллинеарны, т.е. если

корреляция между двумя независимыми переменными равна 1 или -1

В этом случае у двух переменных есть только две выборки, и они всегда коллинеарны (тривиально всегда существует одна линия, проходящая через две различные точки). Мы можем проверить это:

np.corrcoef(array([63,84]),array([46,42]))
[[ 1. -1.]
 [-1.  1.]]

Чтобы не быть обязательно коллинеарными, две переменные должны иметь не менее n=3 отсчетов. Чтобы добавить к этому ограничению, у вас есть ограничение, указанное ali_m, что количество выборок n должно быть больше или равно количеству переменных p. Соединив два вместе,

n>=max(3,p)

в этом случае p=2 и n>=3 - правильное ограничение.

person gg349    schedule 10.10.2013

Ошибка возникает, когда gaussian_kde() пытается получить обратную ковариационную матрицу ваших входных данных. Чтобы ковариационная матрица была невырожденной, количество (неидентичных) точек во входных данных должно быть >= количеству переменных. Попробуйте добавить третью точку, и вы увидите, что она работает.

Этот ответ on Crossvalidated есть правильное объяснение, почему это так.

person ali_m    schedule 09.10.2013
comment
@flebool D'oh - не знаю, как это пропустил! Да, конечно, вы правы. Наличие n >= p является необходимым, но недостаточным условием - ковариационная матрица все еще может иметь дефицит ранга, если у вас есть мультиколлинеарность. - person ali_m; 10.10.2013