对数函数逼近算法

时间:2019-02-06 17:05:36

标签: python mathematical-optimization

我创建了一个函数来计算对数函数的参数。

我的目的是预测遵循对数函数的数据点的未来结果。但是最重​​要的是,我的算法比最后的结果更适合整个数据点,因为重要的是预测。我目前使用均方误差来优化参数,但是我不知道如何加权,因为它使我最近的数据点比第一个重要。

  • 这是我的等式:

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)
    

您可以在下面的图像中看到橙色曲线是我拥有的数据,蓝线是我的拟合线。我们看到那条线的末端与那条线稍微有些拉长,我想避免这种情况,以改善我的函数的预测能力。

logarithm function graph

我的问题是双重的:

  • 这实际上是执行此操作的最佳方法,还是最好使用另一个函数(例如指数衰减的递增形式)? (y = C(1-e-kt),k> 0)

  • 如何更改代码,以使最后一个值比第一个更重要。

1 个答案:

答案 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,但是如果目标是生成优化器,请尝试在网格中添加抢先体验或随机搜索。希望对您有帮助