<p>要使用sklearn,可以先将案例<code>y = Aexp(-BX)</code>重新建模为<code>ln(Y) = ln(A) - BX</code>,然后使用LinearRegressor来训练和拟合数据。</p>
<pre><code>import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
### Read Data
df = pd.read_csv('data.csv')
### Prepare X, Y & ln(Y)
X = df.sort_values(by=['x']).loc[:, 'x':'x']
Y = df.sort_values(by=['x']).loc[:, 'y':'y']
ln_Y = np.log(Y)
### Use the relation ln(Y) = ln(A) - BX to fit X to ln(Y)
from sklearn.linear_model import LinearRegression
exp_reg = LinearRegression()
exp_reg.fit(X, ln_Y)
#### You can introduce weights as well to apply more bias to the smaller X values,
#### I am transforming X arbitrarily to apply higher arbitrary weights to smaller X values
exp_reg_weighted = LinearRegression()
exp_reg_weighted.fit(X, ln_Y, sample_weight=np.array(1/((X - 100).values**2)).reshape(-1))
### Get predicted values of Y
Y_pred = np.exp(exp_reg.predict(X))
Y_pred_weighted = np.exp(exp_reg_weighted.predict(X))
### Plot
plt.scatter(X, Y)
plt.plot(X, Y_pred, label='Default')
plt.plot(X, Y_pred_weighted, label='Weighted')
plt.xlabel('X')
plt.ylabel('Y')
plt.legend()
plt.show()
</code></pre>
<p><a href="https://i.stack.imgur.com/aggbk.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/aggbk.png" alt="enter image description here"/></a></p>