Scipy放射基底関数(Rbf)を使用して、2Dサーフェスを表すそれほど大きくない(〜10.000サンプル)点群を内挿しようとしています。いくつかの良い結果が得られましたが、実行中にエラーがほぼ瞬時に表示されたとしても、最後のデータセットでは一貫して取得MemoryError
しています(RAMは明らかに使い果たされていません)。
rbf.py
私はScipyからファイルのコピーをハックすることにしました。まず、いくつかの印刷ステートメントでファイルを埋めることから始めました。これは非常に便利です。_euclidean_norm
次のように、メソッドを1行ずつ分解します。
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、y1]、[x2、y2]、[x3、y3]、...、[xn、yn]]の形式の配列X1と、X1によって置き換えられたX2に対して呼び出されます。クラス内の次のメソッド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でプロットでき、クラウドポイントが視覚的に非常によく形成されているので、条件が整っていると思います。
どんな助けでも大歓迎です。
読んでくれてありがとう。