首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >对数函数逼近算法

对数函数逼近算法
EN

Stack Overflow用户
提问于 2019-02-06 17:05:35
回答 1查看 745关注 0票数 1

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

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

  • 这是我的方程式:

Y=C* log( a*x+b)

  • 这是我的代码: 从sklearn.metrics mean_squared_error def approximate_log_function(x,y):C=np.arange(0.0 1,1,step =0.0 1)a=np.arange(0.0 1,1,step =0.0 1)b=np.arange( 0,1,step =0.0 1) min_mse = 0,0,0,0对于np.array(np.meshgrid(C,a,b)).T.reshape(-1,3):y_estimation =i* np.log(i1 * np.array(x) + i2) mse = mean_squared_error(y,y_estimation)如果mse < min_mse: min_mse = mse参数= [i,i1,i2]返回(min_mse,参数)

你可以在下面的图像中看到橙色曲线是我所拥有的数据,蓝线是我的拟合线。我们看到这条线在末端有点偏离线,我想避免这样做,以改进我的函数的预测。

对数函数图

我的问题有两个:

  • 这实际上是最好的方法吗?还是最好使用另一个函数(例如指数衰减的增长形式)?(y =C(1-E-kt ),k> 0)
  • 如何更改代码,使最后一个值比第一个值更重要。
EN

回答 1

Stack Overflow用户

发布于 2019-02-06 20:17:12

通常,在非线性最小二乘中,y值的逆值作为权重,基本上消除了离群值,你可以通过增加一个函数来计算基于x位置的权重来扩展这个概念。

代码语言:javascript
复制
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,但是如果目标是生成优化器,请尝试在网格中添加一个早期中断或随机搜索。希望它能帮上忙

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54558936

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档