很多时候一个模型或是一个算法需要确定很多参数.这些参数的取值或许是个问题.

确定参数最好的办法是有理论支持,这样我们可以非常自信的增大或是减小某个参数.

如果你没有支持你增大或者减小参数的理由的话,可以试试扫描某个区域中的所有值,获取最优的参数.直接上代码:

def twiddle(tol=0.2): 
    params = [0, 0, 0]
    dp = [1, 1, 1]
    best_err = run(params)


    while sum(dp) > tol:
        print("best error = {},sum dp = {}".format(best_err,sum(dp)))

        for i in range(len(params)):
            params[i] += dp[i]
            err = run(params)

            if err < best_err:    #增大参数可以优化模型,并增大dp
                best_err = err
                dp[i] *= 1.1
            else:
                params[i] -= 2 * dp[i]
                err = run(params)

                if err < best_err: #减小参数可以优化模型,并增大dp
                    best_err = err
                    dp[i] *= 1.1
                else:
                    params[i] += dp[i]  #增大减小参数都不能优化模型,降低dp
                    dp[i] *= 0.9

    return params,best_err

代码中params参数初始值列表,dp为对应参数初始每次调整参数的幅度.run函数返回模型使用该参数时的误差.

Twiddle有些类似牛顿法,每次只调整一个值,是一种很有效的最优参数搜索方法.

posted @ 2018-08-22 22:41:03
评论加载中...

发表评论