Я пытаюсь интерполировать не -так -большое (~10 000 выборок )облако точек, представляющее 2D-поверхность, используя Scipy Radial Basis Function (Rbf ). У меня есть хорошие результаты, но с моими последними наборами данных я постоянно получаю MemoryError
, хотя ошибка появляется почти мгновенно во время выполнения (, ОЗУ явно не съедается ).
Я решил взломать копию файла rbf.py
из Scipy, начав с заполнения его некоторыми операторами печати, которые оказались очень полезными. Разлагая метод _euclidean_norm
построчно, вот так:
def _euclidean_norm(self, x1, x2):
d = x1 - x2
s = d**2
su = s.sum(axis=0)
sq = sqrt(su)
return sq
Я получаю ошибку в первой строке:
File "C:\MyRBF.py", line 68, in _euclidean_norm
d = x1 - x2
MemoryError
Эта норма вызывается для массива X1 в виде [[x1, y1], [x2, y2], [x3, y3],..., [xn, yn]] и X2, который представляет собой X1, транспонированный следующий метод внутри класса Rbf
, уже взломанный мной с целью отладки:
def _call_norm(self, x1, x2):
print x1.shape
print x2.shape
print
if len(x1.shape) == 1:
x1 = x1[newaxis, :]
if len(x2.shape) == 1:
x2 = x2[newaxis, :]
x1 = x1[..., :, newaxis]
x2 = x2[..., newaxis, :]
print x1.shape
print x2.shape
print
return self._euclidean_norm(x1, x2)
Обратите внимание, что я печатаю формы входных данных. Вот что я получаю с моим текущим набором данных (Я добавил комментарии вручную):
(2, 10744) ## Input array of 10744 x,y pairs
(2, 10744) ## The same array, which is to be "reshaped/transposed"
(2, 10744, 1) ## The first "reshaped/transposed" form of the array
(2, 1, 10744) ## The second "reshaped/transposed" form of the array
Обоснование, согласно документации, состоит в том, чтобы получить «матрицу расстояний от каждой точки в x1 до каждой точки в x2», что означает, поскольку массивы одинаковы, матрица расстояний между каждой парой входного массива (, который содержит размеры X и Y ).
Я проверил операцию вручную с гораздо меньшими массивами (формы (2,5,1 )и (2,1,5 ), например ), и вычитание работает.
Как я могу узнать, почему он не работает с моим набором данных? Есть ли другая очевидная ошибка? Должен ли я проверить некоторую форму неправильной -обработки моего набора данных или выполнить некоторую предварительную -его обработку?Я думаю, что она хорошо -обусловлена, так как я могу изобразить ее в 3D, а точка облака визуально очень хорошо сформирована.
Любая помощь будет очень высоко ценится.
Спасибо за чтение.