我创建了一个函数来计算对数函数的参数。
我的目的是预测遵循对数函数的数据点的未来结果。但是最重要的是,我的算法比最后的结果更适合整个数据点,因为重要的是预测。我目前使用均方误差来优化参数,但是我不知道如何加权,因为它使我最近的数据点比第一个重要。
y = C * log(a * x + b)
这是我的代码:
import numpy as np
from sklearn.metrics import mean_squared_error
def approximate_log_function(x, y):
C = np.arange(0.01, 1, step = 0.01)
a = np.arange(0.01, 1, step = 0.01)
b = np.arange(0.01, 1, step = 0.01)
min_mse = 9999999999
parameters = [0, 0, 0]
for i in np.array(np.meshgrid(C, a, b)).T.reshape(-1, 3):
y_estimation = i[0] * np.log(i[1] * np.array(x) + i[2])
mse = mean_squared_error(y, y_estimation)
if mse < min_mse:
min_mse = mse
parameters = [i[0], i[1], i[2]]
return (min_mse, parameters)
您可以在下面的图像中看到橙色曲线是我拥有的数据,蓝线是我的拟合线。我们看到那条线的末端与那条线稍微有些拉长,我想避免这种情况,以改善我的函数的预测能力。
我的问题是双重的:
这实际上是执行此操作的最佳方法,还是最好使用另一个函数(例如指数衰减的递增形式)? (y = C(1-e-kt),k> 0)
如何更改代码,以使最后一个值比第一个更重要。
答案 0 :(得分:0)
通常,在非线性最小二乘法中,将y值的倒数作为权重,从根本上消除了离群值,您可以添加一个函数来基于x位置计算权重,从而扩展该思想。
def xWeightA(x):
container=[]
for k in range(len(x)):
if k<int(0.9*len(x)):
container.append(1)
else:
container.append(1.2)
return container
def approximate_log_function(x, y):
C = np.arange(0.01, 1, step = 0.01)
a = np.arange(0.01, 1, step = 0.01)
b = np.arange(0.01, 1, step = 0.01)
min_mse = 9999999999
parameters = [0, 0, 0]
LocalWeight=xWeightA(x)
for i in np.array(np.meshgrid(C, a, b)).T.reshape(-1, 3):
y_estimation = LocalWeight*i[0] * np.log(i[1] * np.array(x) + i[2])
mse = mean_squared_error(y, y_estimation)
if mse < min_mse:
min_mse = mse
parameters = [i[0], i[1], i[2]]
return (min_mse, parameters)
此外,您似乎正在评估完整的目标函数,这使代码要花很多时间才能找到最小值(至少在我的机器上)。您可以按照建议的方式使用curve_fit或polyfit,但是如果目标是生成优化器,请尝试在网格中添加抢先体验或随机搜索。希望对您有帮助