簡體   English   中英

如何僅擬合曲線直到其最大值?

[英]How to fit a curve only until its maximum?

我正在努力尋找一種適合曲線的智能方法(我使用curve_fit ,如下所示)直到達到其最大值而不必操縱初始數組。

def f_singlecomponent(x, f0, a, k):
    return f0 + a * (1 - np.exp( -k * x ))
popt, pcov = curve_fit(f_singlecomponent, coords[n][0], coords[n][1], p0=init_vals)

使用上面我的評論中提到的簡單 sigma-mask 結果

import matplotlib.pyplot as plt
import numpy as np
from scipy.optimize import curve_fit

def func( x, a, k, y0):
    return a * ( 1- np.exp( -k * x ) ) + y0

def mymask( y ):
    m = np.argmax(y)
    l = len(y)
    return m * [1] + ( l - m )* [ np.infty ]

xlist = np.linspace( 0., 10., 100 )
ylist = np.fromiter( ( func( x, 1.3, .44, 8 ) for x in xlist ), np.float )
ylist2 = np.fromiter( ( func( x, 1.3, .44, 8 ) * ( 0.5 * ( 1 - np.tanh( (x - 7 ) ) ) *.13 + 1-.13 ) for x in xlist ), np.float )

popt_o, _ = curve_fit(func, xlist, ylist, p0=[1.3,.44,8])
popt_w, _ = curve_fit(func, xlist, ylist2, p0=[1.3,.44,8],  maxfev=9000 )
popt_t, _ = curve_fit(func, xlist, ylist, p0=[1.3,.44,8], sigma=mymask( ylist ))

fig = plt.figure()
ax = fig.add_subplot( 1, 1, 1 )
ax.plot( xlist, ylist, linewidth=3 )
ax.plot( xlist, ylist2 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_o ) for x in xlist ), np.float ), ls='--', linewidth=2 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_t ) for x in xlist ), np.float ), ls=':', linewidth=1 )
ax.plot( xlist, np.fromiter( ( func( x,*popt_w ) for x in xlist ), np.float ) )
plt.show()

看起來像在此處輸入圖片說明 ,

這對我來說似乎很不錯。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM