微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何在 Optuna 中建议多变量比率有界?

如何解决如何在 Optuna 中建议多变量比率有界?

我想在 Optuna 中建议比例。

对于所有 X_1,X_2,...,X_k,比率 ∑X_i = 1 有界于 0 <= X_i <= 1i

Optuna 不提供狄利克雷分布。

我试过了,但没有用。

def objective(trial):
    k = 10
    ratios = np.zeros(k)
    
    residual = 1
    for i in range(k - 1):
        ratios[i] = trial.suggest_float(f'ratio_{i}',residual)
        residual -= ratios[i]
        
#     ratios[k - 1] = trial.suggest_float(f'ratio_{k - 1}',residual,residual)
    ratios[k - 1] = residual
    return np.log(ratios).sum()

study = optuna.create_study(direction='maximize')
study.optimize(objective,n_trials=20)

我尝试了这个并完成了没有任何错误。但是,这是不一致的,因为边界的自由度为 k - 1,但建议为 k 次。

def objective(trial):
    k = 10
    ratios = np.zeros(k)
    
    for i in range(k):
        ratios[i] = trial.suggest_float(f'ratio_{i}',1)
    
    ratios /= ratios.sum()
    return np.log(ratios).sum()

study = optuna.create_study(direction='maximize')
study.optimize(objective,n_trials=20)

我如何建议比率或多个有界限的变量?

这是一个简单的例子,所以它是可微的,但我需要更复杂的目标中的变量。

解决方法

这奏效了。

class Objective:
    def __init__(self):
        self.max = 1
    def __call__(self,trial):
        k = 10
        ratios = np.zeros(k)

        for i in range(k):
            ratios[i] = trial.suggest_float(f'ratio_{i}',self.max)

        ratios /= ratios.sum()
        self.max = (self.max + ratios.max()) / 2
        return np.log(ratios).sum()

study = optuna.create_study(direction='maximize')
study.optimize(Objective(),n_trials=100)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。