4

Python で一部のデータを補間して、通常のメッシュに再グリッド化して、部分的に統合できるようにしています。データは、高次元のパラメーター空間 (現在 3、少なくとも 5 に拡張される予定) の関数を表し、オブザーバブルの多値関数 (現在 2、3 に拡張され、その後数十に拡張される可能性があります) を返します。

scipy.interpolate.LinearNDInterpolator他の明らかなオプションがないため、補間を実行しています(griddataとにかくそれを呼び出すだけだと理解しているため)。小規模なデータ セット (15,000 行の列データ) では問題なく動作します。より大きなセット (60,000 以上) では、コマンドは無期限に実行されるように見えます。topは、iPython が 100% の CPU を使用しており、端末が を含めて完全に応答していないことを示しC-cます。これまでのところ、何時間も無駄に放置してきましたが、最終的には数百万のエントリを渡したいと思っています.

問題はこのチケットに関連していると思われますが、昨日アップグレードした SciPy 0.10.0 でパッチが適用されたと思われます。

私の質問は基本的に、大規模なデータセットで多次元補間を実行するにはどうすればよいですか? 私が試したことに基づいて、解決策が得られる可能性のある場所がいくつかありますが、それらを見つけることができませんでした. (私の検索は、scipy のサブドメインのいくつかがダウンしているように見えるという事実によって助けられません...)

  • の何が問題になっていLinearNDInterpolatorますか? または、少なくとも、問題が何であるかを調べて、ハングを回避するにはどうすればよいですか?
  • それが機能するように補間を再定式化する方法はありLinearNDInterpolatorますか? おそらく、データを慎重にチャンクアップして、部分的に再グリッド化することでしょうか?
  • 問題により適した他の高次元補間器はありますか? (SciPy の代替手段のほとんどは <2D パラメータ空間に制限されていることに注意してください。)
  • 通常のユーザー定義グリッドに多次元データを取得する他の方法はありますか? 補間してやろうとしているのはそれだけです...
4

1 に答える 1

5

この問題は、データ セットが単に大きすぎて、その Delaunay 三角形分割の計算が適切な時間内に終了しない可能性が最も高いです。scipy.spatial.Delaunayユニバースが終了する前に完全なデータ セットの計算が終了するかどうかを推定するために、完全なデータ セットからランダムに選択された小さなデータ サブセットを使用する時間スケーリングを確認します。

元のデータが次のような長方形のグリッド上にある場合

v[i,j,k,l] = f(x[i], y[j], z[k], u[l])

その場合、三角測量ベースの補間を使用するのは非常に非効率的です。テンソル積補間を使用することをお勧めします。つまり、各次元を 1 次元補間法で連続して補間します。

import numpy as np
from scipy.interpolate import interp1d

def interp3(x, y, z, v, xi, yi, zi, method='cubic'):
    """Interpolation on 3-D. x, y, xi, yi should be 1-D
    and z.shape == (len(x), len(y), len(z))"""
    q = (x, y, z)
    qi = (xi, yi, zi)
    for j in range(3):
        v = interp1d(q[j], v, axis=j, kind=method)(qi[j])
    return v

def somefunc(x, y, z):
    return x**2 + y**2 - z**2 + x*y*z

# some input data
x = np.linspace(0, 1, 5)
y = np.linspace(0, 2, 6)
z = np.linspace(0, 3, 7)
v = somefunc(x[:,None,None], y[None,:,None], z[None,None,:])

# interpolate
xi = np.linspace(0, 1, 45)
yi = np.linspace(0, 2, 46)
zi = np.linspace(0, 3, 47)
vi = interp3(x, y, z, v, xi, yi, zi)

import matplotlib.pyplot as plt
plt.subplot(121)
plt.pcolor(xi, yi, vi[:,:,12])
plt.title('interpolated')
plt.subplot(122)
plt.pcolor(xi, yi, somefunc(xi[:,None], yi[None,:], zi[12]))
plt.title('exact')
plt.show()

データ セットが散らばっており、三角形分割ベースの方法には大きすぎる場合は、別の方法に切り替える必要があります。一部のオプションは、少数の最近傍を一度に処理する補間方法です (この情報は、kd ツリーを使用して高速に取得できます)。逆距離重み付けはこれらの 1 つですが、悪いものの 1 つかもしれません --- より良いオプションが考えられます (これについては、さらに調査しないとわかりません)。

于 2012-09-30T16:13:25.423 に答える