很多时候一个模型或是一个算法需要确定很多参数.这些参数的取值或许是个问题.
确定参数最好的办法是有理论支持,这样我们可以非常自信的增大或是减小某个参数.
如果你没有支持你增大或者减小参数的理由的话,可以试试扫描某个区域中的所有值,获取最优的参数.直接上代码:
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有些类似牛顿法,每次只调整一个值,是一种很有效的最优参数搜索方法.