web-dev-qa-db-ja.com

「ValueError:x_newの値は補間範囲を超えています。」-値が昇順でない以外の理由は何ですか?

Scipy interp1d関数でこのエラーを受け取りました。通常、xが単調に増加していない場合、このエラーが生成されます。

_import scipy.interpolate as spi
def refine(coarsex,coarsey,step):
    finex = np.arange(min(coarsex),max(coarsex)+step,step)
    intfunc = spi.interp1d(coarsex, coarsey,axis=0)
    finey = intfunc(finex)
    return finex, finey

for num, tfile in enumerate(files):
    tfile = tfile.dropna(how='any')
    x = np.array(tfile['col1'])
    y = np.array(tfile['col2'])
    finex, finey = refine(x,y,0.01)
_

コードが正しいのは、6つのデータファイルで正常に機能し、7日間エラーをスローしたためです。そのため、データに何か問題があるはずです。しかし、私が知る限り、データはずっと下がっていきます。例のエラーを再現できないため、例を提供しないで申し訳ありません。

私を助けることができる2つのことがあります:

  1. ブレインストーミング-データが実際に単調に増加している場合、他にこのエラーが発生する可能性があるものはありますか?小数に関する別のヒントは この質問 にありますが、私の解決策(xの最小値と最大値)はそれを回避するのに十分な堅牢性があると思います。それともそうではありませんか?
  2. _ValueError: A value in x_new is above the interpolation range._をスローするときにx_newとそのインデックスの値を返すことは(どのように?)可能であるため、ファイルのどこに問題があるかを実際に確認できますか?

[〜#〜] update [〜#〜]

したがって、問題は、何らかの理由で、max(finex)max(coarsex)よりも大きいことです(一方は.x39で、もう一方は.x4です)。元の値を有効数字2桁に丸めることで問題が解決することを期待していましたが、表示されませんが、表示される桁数は少なくなりますが、表示されないままカウントされます。私はそれについて何ができますか?

8
durbachit

Scipy v。0.17.0以降を実行している場合、 _fill_value='extrapolate'_を_spi.interp1d_ に渡すと、これらの値が補間範囲。したがって、次のように補間関数を定義します。

intfunc = spi.interp1d(coarsex, coarsey,axis=0, fill_value="extrapolate")

ただし、ご注意ください!

データの外観と実行する補間のタイプによっては、外挿された値が誤っている可能性があります。これは、ノイズの多いデータまたは非単調なデータがある場合に特に当てはまります。あなたの場合、x_new値は補間範囲を超えているslighlyだけなので大丈夫かもしれません。

以下に、この機能がうまく機能するだけでなく、誤った結果をもたらす方法の簡単なデモンストレーションを示します。

_import scipy.interpolate as spi
import numpy as np

x = np.linspace(0,1,100)
y = x + np.random.randint(-1,1,100)/100
x_new = np.linspace(0,1.1,100)
intfunc = spi.interp1d(x,y,fill_value="extrapolate")
y_interp = intfunc(x_new)

import matplotlib.pyplot as plt
plt.plot(x_new,y_interp,'r', label='interp/extrap')
plt.plot(x,y, 'b--', label='data')
plt.legend()
plt.show()
_

enter image description here

したがって、補間された部分(赤)はうまく機能しましたが、外挿された部分は、明らかにノイズのために、このデータの線形トレンドに明らかに従っていません。したがって、データをある程度理解し、注意して進めてください。

22
saintsfan342000

finex calcの簡単なテストは、(常に?)外挿領域に入ることができることを示しています。

In [124]: coarsex=np.random.Rand(100)
In [125]: max(coarsex)
Out[125]: 0.97393109991816473
In [126]: step=.01;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max(
     ...: finex),max(coarsex))
Out[126]: (0.98273730602114795, 0.97393109991816473)
In [127]: step=.001;finex=np.arange(min(coarsex), max(coarsex)+step, step);(max
     ...: (finex),max(coarsex))
Out[127]: (0.97473730602114794, 0.97393109991816473)

繰り返しますが、これは簡単なテストであり、いくつかの重要なステップまたは値が欠落している可能性があります。

1
hpaulj