首页 > 解决方案 > 如何在 Optuna 中建议多元比率(有界)?

问题描述

我想建议 Optuna 中的比例。

该比率是X_1, X_2, ..., X_k有界的,∑X_i = 1并且0 <= X_i <= 1适用于所有i

Optuna 不提供 Dirichlet 分发。

我试过这个,但它不起作用。

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}', 0, 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}', 0, 1)
    
    ratios /= ratios.sum()
    return np.log(ratios).sum()

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

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

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

标签: pythonmachine-learningoptimizationdata-scienceoptuna

解决方案


这行得通。

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}', 0, 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)

推荐阅读