Optimize a Noisy Function¶
Many real-world environments are noisy, where solution evaluations are inaccurate due to the noise. Noisy evaluation can badly injure derivative-free optimization, as it may make a worse solution looks better.
Three noise handling methods are implemented in ZOOpt, respectively are
resampling, value suppression for SRACOS (SSRACOS) and threshold
selection for POSS (PONSS).
In this page, we provide examples of how to use the three noise handling methods in ZOOpt.
Table of Contents
Re-sampling and Value Suppression¶
We define the Ackley function under noise in simple_function.py for minimization.
import numpy as np
def ackley(solution):
"""
Ackley function for continuous optimization
"""
x = solution.get_x()
bias = 0.2
ave_seq = sum([(i - bias) * (i - bias) for i in x]) / len(x)
ave_cos = sum([np.cos(2.0*np.pi*(i-bias)) for i in x]) / len(x)
value = -20 * np.exp(-0.2 * np.sqrt(ave_seq)) - np.exp(ave_cos) + 20.0 + np.e
return value
def ackley_noise_creator(mu, sigma):
"""
Ackley function under noise
"""
return lambda solution: ackley(solution) + np.random.normal(mu, sigma, 1)
Then, define a corresponding objective object.
ackley_noise_func = ackley_noise_creator(0, 0.1)
dim_size = 100 # dimensions
dim_regs = [[-1, 1]] * dim_size # dimension range
dim_tys = [True] * dim_size # dimension type : real
dim = Dimension(dim_size, dim_regs, dim_tys) # form up the dimension object
# dim = Dimension2([(ValueType.CONTINUOUS, [-1, 1], 1e-6)]*dim_size) # another way to form up the dimension object
objective = Objective(ackley_noise_func, dim) # form up the objective function
Re-sampling¶
To use Re-sampling noise handling method, noise_handling and
resampling should be set to True. In addition,
resample_times should be provided by users.
parameter = Parameter(budget=200000, noise_handling=True, resampling=True, resample_times=10)
# This setting is alternative
parameter.set_positive_size(5)
Value Suppression for SRACOS (SSRACOS)¶
To use SSRACOS noise handling method, noise_handling and
suppression should be set to True. In addition,
non_update_allowed, resample_times and balance_rate should
be provided by users.
# non_update_allowed=500 and resample_times=100 means if the best solution doesn't change for 500 budgets, the best solution will be evaluated repeatedly for 100 times
# balance_rate is a parameter for exponential weight average of several evaluations of one sample.
parameter = Parameter(budget=200000, noise_handling=True, suppression=True, non_update_allowed=500, resample_times=100, balance_rate=0.5)
# This setting is alternative
parameter.set_positive_size(5)
Finally, use ExpOpt.min to optimize this function.
solution_list = ExpOpt.min(objective, parameter, repeat=1, plot=True)
Threshold Selection for POSS (PONSS)¶
A sparse regression problem is defined in
example/sparse_regression/sparse_mse.py .
Then define a corresponding objective object.
from sparse_mse import SparseMSE
from zoopt import Objective, Parameter, ExpOpt
from math import exp
# load data file
mse = SparseMSE('sonar.arff')
mse.set_sparsity(8)
# setup objective
objective = Objective(func=mse.loss, dim=mse.get_dim(), constraint=mse.constraint)
To use PONSS noise handling method, algorithm should be set to
'poss' and noise_handling, ponss should be set to True.
In addition, ponss_theta and ponss_b should be provided by
users.
# ponss_theta and ponss_b are parameters used in PONSS algorithm and should be provided by users. ponss_theta stands
# for the threshold. ponss_b limits the number of solutions in the population set.
parameter = Parameter(algorithm='poss', noise_handling=True, ponss=True, ponss_theta=0.5, ponss_b=mse.get_k(),
budget=2 * exp(1) * (mse.get_sparsity() ** 2) * mse.get_dim().get_size())
Finally, use ExpOpt.min to optimize this function.
solution_list = ExpOpt.min(objective, parameter, repeat=1, plot=True)
More concrete examples are available in the
example/simple_functions/opt_under_noise.py and
example/sparse_regression/ponss_opt.py.