Как ведут ведущий параметр "epsilon" в scipy.interpolate.rbfinterpolator?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Как ведут ведущий параметр "epsilon" в scipy.interpolate.rbfinterpolator?

Сообщение Anonymous »

Я пытался перенести код с использования scipy.interpolate.rbf в scipy.interpolate.rbfinterpolator. Однако у меня сложилось впечатление, что параметр epsilon имеет другое поведение в последнем - на самом деле в моих тестах, кажется, по крайней мере с мультикдадрическим ядром я могу варьировать этот параметр на несколько порядков. без заметных изменений в выводе - и из существующей документации Scipy для меня неясно, как это должно работать (он очень хорошо описывает сглаживание для RBFinterPolator, но только Документация RBF, по -видимому, явно показывает Как Эпсилон входит в функции ядра в виде параметра масштаба). Не MWE, так как я использовал root для визуализации вывода. < /p>
import sys
import numpy as np
import scipy
import ROOT as rt

def true_func(x,y,sigma,zscale):

# first Gaussian, at center
g1 = zscale * np.exp(-0.5 * (np.square(x) + np.square(y)) / np.square(sigma))

# second Gaussian, offset
height_scale = 0.5
xp = x - 3. * sigma
g2 = height_scale * zscale * np.exp(-0.5 * (np.square(xp) + np.square(y)) / np.square(sigma))

# add a couple sharper peaks
positions = [(0,-2 * sigma), (0, -1 * sigma), (0, 2 * sigma)]
spikes = 0
pow = 1.1
sig = sigma / 10
height_scale = 2.
for pos in positions:
xp = x - pos[0]
yp = y - pos[1]
spikes += height_scale * zscale * np.exp(-0.5 * (np.power(np.abs(xp),pow) + np.power(np.abs(yp),pow)) / np.power(sig,pow))
return g1 + g2 + spikes

def test(new=False):
N = 15
xscale = 100
xlin = np.linspace(-xscale*N,xscale*N,2 * N)
ylin = np.linspace(-xscale*N,xscale*N,2 * N)
x,y = np.meshgrid(xlin,ylin)

# generate our z values
rng = np.random.default_rng()
zscale = 10
sigma = xscale * N / 4
z = true_func(x,y,sigma,zscale)
z += 0.1 * zscale * rng.uniform(size=z.shape)

xf = x.flatten()
yf = y.flatten()
zf = z.flatten()

# Create two interpolators with different values of epsilon,
# keep everything else the same between them.
basis = 'multiquadric'

rbf_dict = {}
epsilon_vals = [0.1, 1000]

if(new):
for epsilon in epsilon_vals:
rbf_dict[epsilon] = scipy.interpolate.RBFInterpolator(
np.vstack((xf,yf)).T,
zf,
kernel=basis,
epsilon=epsilon
)
else:
for epsilon in epsilon_vals:
rbf_dict[epsilon] = scipy.interpolate.Rbf(
xf,yf,
zf,
kernel=basis,
epsilon=epsilon
)

# now evaluate the two interpolators on the grid
points = np.stack((x.ravel(), y.ravel()), axis=-1)

if(new):
evals = {key:val(points) for key,val in rbf_dict.items()}
else:
evals = {key:val(x,y) for key,val in rbf_dict.items()}

diffs = {}
for i,(key,val) in enumerate(evals.items()):
if(i == 0): continue
diffs[key] = (val - evals[epsilon_vals[0]])
print(np.max(diffs[key]))

# now plot things
dims = (1600,1200)
c = rt.TCanvas('c1','c1',*dims)
c.Divide(2,2)

c.cd(1)
true_graph = rt.TGraph2D(len(zf),xf,yf,zf)
true_graph.SetName('true_graph')
true_graph.Draw('SURF2Z')
if(new):
true_graph.SetTitle("scipy.interpolate.RBFInterpolator Test")
else:
true_graph.SetTitle("scipy.interpolate.Rbf Test")
true_graph.GetXaxis().SetTitle("x")
true_graph.GetYaxis().SetTitle("y")
true_graph.GetZaxis().SetTitle("z")
true_graph.SetNpx(80)
true_graph.SetNpy(80)

# now draw the two interpolations with the largest difference in epsilon
interp1 = rt.TGraph2D(len(zf),xf,yf,evals[epsilon_vals[0]])
interp1.SetName('interp1')

interp2 = rt.TGraph2D(len(zf),xf,yf,evals[epsilon_vals[-1]])
interp2.SetName('interp2')

interp1.SetLineColor(rt.kRed)

interp2.SetLineColor(rt.kGreen)
# interp2.SetLineWidth(2)
interp2.SetLineStyle(rt.kDotted)

for g in (interp1, interp2):
g.SetNpx(80)
g.SetNpy(80)

interp1.Draw('SAME SURF1')
interp2.Draw('SAME SURF1')

c.cd(2)
diff_graph = rt.TGraph2D(len(zf),xf,yf,diffs[epsilon_vals[-1]])
diff_graph.SetName('diff_graph')
diff_graph.SetTitle('Difference between interpolations, epsilon #in [{}, {}]'.format(epsilon_vals[0],epsilon_vals[-1]))
diff_graph.Draw('SURF1')
rt.gPad.SetLogz()

c.cd(3)
interp1.Draw('CONTZ')
interp1.SetTitle('Interpolation with epsilon = {}'.format(epsilon_vals[0]))

c.cd(4)
interp2.Draw('CONTZ')
interp2.SetTitle('Interpolation with epsilon = {}'.format(epsilon_vals[-1]))

c.Draw()
if(new):
c.SaveAs('c_new.pdf')
else:
c.SaveAs('c_old.pdf')
return

def main(args):
test(new=False)
test(new=True)

if(__name__=='__main__'):
main(sys.argv)
< /code>
Это создает следующие графики вывода: < /p>
Выход при использовании scipy.interpolate.rbf
вывод при использовании scipy.interpolate.rbfinterpolator < /p>
Может быть scipy.interpolate.rbfinterpolator, я не вижу в основном нет различий между двумя интерполяциями, используя очень разные значения Epsilon. Я взглянул на то, что, я думаю, является соответствующим исходным кодом Scipy, но до сих пор не выяснил, что происходит. Спасибо!

Подробнее здесь: https://stackoverflow.com/questions/794 ... terpolator
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Python Pickle Scipy.interpolate.rbfinterpolator в рамках операционных систем (Windows, Mac)
    Anonymous » » в форуме Python
    0 Ответы
    6 Просмотры
    Последнее сообщение Anonymous
  • Значение для использования для сглаживания для rbfinterpolator от scipy.interpolate
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Значение для использования для сглаживания для rbfinterpolator от scipy.interpolate
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Значение для использования для сглаживания для rbfinterpolator от scipy.interpolate
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Значение для Epsilon в Python
    Anonymous » » в форуме Python
    0 Ответы
    10 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»