稀疏约束优化求解器#

当前支持的稀疏约束优化求解器。这些求解器继承自BaseSolver

#

ScopeSolver

通过稀疏约束优化拼接迭代(SCOPE)算法获取凸目标函数的稀疏最优解,该算法也可用于变量选择。

HTPSolver

通过梯度硬阈值追踪(GraHTP)算法获取凸目标函数的稀疏最优解。

IHTSolver

通过迭代硬阈值(IHT)算法获取凸目标函数的稀疏最优解。

GraspSolver

通过梯度支持追踪(GraSP)算法获取凸目标函数的稀疏最优解。

FobaSolver

通过前向-后向贪婪(FoBa)算法获取凸目标函数的稀疏最优解。

ForwardSolver

通过前向选择算法获取凸目标函数的稀疏最优解。

OMPSolver

通过正交匹配追踪(OMP)算法获取凸目标函数的稀疏最优解。

PDASSolver

通过原始-对偶活动集(PDAS)算法解决具有子集大小\(k\)的最佳子集选择问题。

class skscope.solver.FobaSolver(dimensionality, sparsity=None, sample_size=1, *, use_gradient=True, threshold=0.0, foba_threshold_ratio=0.5, strict_sparsity=True, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过前向-后向贪心(FoBa)算法获取凸目标函数的稀疏最优解。 具体来说,FobaSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以被视为一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • use_gradient (bool, default=True) – 是否使用梯度信息来衡量变量的重要性。 使用梯度信息将加速算法,但解决方案可能不准确。

  • threshold (float, default=0.0) – 用于确定是否选择变量的阈值。

  • foba_threshold_ratio (float, default=0.5) – 用于确定是否删除变量的阈值将设置为 threshold * foba_threshold_ratio

  • strict_sparsity (bool, default=True) – 是否严格控制稀疏级别为sparsity

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。FobaSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

刘杰, 叶杰, 藤卷亮. 针对基数约束下的一般凸光滑函数的前后向贪心算法[C]//国际机器学习会议. PMLR, 2014: 503-511.

class skscope.solver.ForwardSolver(dimensionality, sparsity=None, sample_size=1, *, threshold=0.0, strict_sparsity=True, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过前向选择算法获取凸目标函数的稀疏最优解。 具体来说,ForwardSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • threshold (float, default=0.0) – 用于确定是否选择变量的阈值。

  • strict_sparsity (bool, default=True) – 是否严格控制稀疏级别为sparsity

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。ForwardSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

class skscope.solver.GraspSolver(dimensionality, sparsity=None, sample_size=1, *, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过梯度支持追踪(GraSP)算法获取凸目标函数的稀疏最优解。 具体来说,GraspSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • numeric_solver (callable, optional) – 用于解决凸优化问题的求解器。GraspSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

Bahmani S, Raj B, Boufounos P T. 贪婪稀疏约束优化[J]. 机器学习研究杂志, 2013, 14(1): 807-841.

class skscope.solver.HTPSolver(dimensionality, sparsity=None, sample_size=1, *, preselect=[], step_size=0.005, numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过梯度硬阈值追踪(GraHTP)算法获取凸目标函数的稀疏最优解。 具体来说,HTPSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • step_size (float, default=0.005) – 梯度下降的步长。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。HTPSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

袁晓彤, 李平, 张涛. 梯度硬阈值追踪[J]. 机器学习研究杂志, 2017, 18(1): 6027-6069.

class skscope.solver.IHTSolver(dimensionality, sparsity=None, sample_size=1, *, preselect=[], step_size=0.005, numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过迭代硬阈值(IHT)算法获取凸目标函数的稀疏最优解。 具体来说,IHTSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • step_size (float, default=0.005) – 梯度下降的步长。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。IHTSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

袁晓彤, 李平, 张涛. 梯度硬阈值追踪[J]. 机器学习研究杂志, 2017, 18(1): 6027-6069.

class skscope.solver.OMPSolver(dimensionality, sparsity=None, sample_size=1, *, threshold=0.0, strict_sparsity=True, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, ic_method=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

通过正交匹配追踪(OMP)算法获取凸目标函数的稀疏最优解。 具体来说,OMPSolver旨在解决这个问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • threshold (float, default=0.0) – 用于确定是否选择变量的阈值。

  • strict_sparsity (bool, default=True) – 是否严格控制稀疏级别为sparsity

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。OMPSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

Shalev-Shwartz S, Srebro N, Zhang T. 在稀疏约束优化问题中以精度换取稀疏性[J]. SIAM Journal on Optimization, 2010, 20(6): 2807-2832.Shalev-Shwartz S, Srebro N, Zhang T. 在稀疏约束优化问题中以精度换取稀疏性[J]. SIAM Journal on Optimization, 2010, 20(6): 2807-2832.

class skscope.solver.PDASSolver(dimensionality, sparsity=None, sample_size=1, *, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=100, group=None, cv=1, cv_fold_id=None, split_method=None, random_state=None)[来源]#

使用原始-对偶活动集(PDAS)算法解决子集大小为\(k\)的最佳子集选择问题。 具体来说,PDASSolver旨在解决这个问题:\(\min_{\beta \in R^p} l(\beta) \text{ s.t. } ||\beta||_0 = k\),其中\(l(\beta)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • step_size (float, default=0.005) – 梯度下降的步长。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。HTPSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=100) – 收敛所需的最大迭代次数。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。 - 如果 cv = 1,稀疏级别将通过信息准则选择。 - 如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • random_state (int, optional) – 用于交叉验证的随机种子。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

参考文献

Wen C H, Zhang A J, Quan S J, Wang X Q. BeSS: 一个用于线性、逻辑和Cox比例风险模型中最优子集选择的R包[J]. 统计软件杂志, 2020, 94(4): 1-24.

class skscope.solver.ScopeSolver(dimensionality, sparsity=None, sample_size=1, *, preselect=[], numeric_solver=convex_solver_LBFGS, max_iter=20, ic_method=None, cv=1, split_method=None, cv_fold_id=None, group=None, important_search=128, screening_size=-1, max_exchange_num=5, is_dynamic_max_exchange_num=True, greedy=True, splicing_type='halve', path_type='seq', gs_lower_bound=None, gs_upper_bound=None, thread=1, random_state=None, console_log_level='off', file_log_level='off', log_file_name='logs/skscope.log')[来源]#

通过拼接迭代的稀疏约束优化(SCOPE)算法获取凸目标函数的稀疏最优解,该算法也可用于变量选择。 具体来说,ScopeSolver旨在解决以下问题:\(\min_{x \in R^p} f(x) \text{ s.t. } ||x||_0 \leq s\),其中\(f(x)\)是一个凸目标函数,\(s\)是稀疏水平。\(x\)的每个元素可以看作一个变量,\(x\)的非零元素是选定的变量。

Parameters:
  • dimensionality (int) – 优化问题的维度,也是将被考虑选择或不选择的总变量数,表示为 \(p\)

  • sparsity (intarrayint, 可选) – 稀疏度级别,即最优解中非零元素的数量,表示为 \(s\)。 默认值为 range(int(p/log(log(p))/log(p)))。 仅在 path_type 为“seq”时使用。

  • sample_size (int, default=1) – 样本大小,表示为 \(n\)

  • preselect (array of int, default=[]) – 一个包含必须选择的变量索引的数组。

  • numeric_solver (callable, optional) – 用于凸优化问题的求解器。ScopeSolver 将在每次迭代中调用此函数来解决凸优化问题。 它应具有与 skscope.convex_solver_LBFGS 相同的接口。

  • max_iter (int, default=20) – 收敛所需的最大迭代次数。

  • ic_method (callable, optional) – 用于计算信息准则以选择稀疏度级别的函数。 ic(loss, p, s, n) -> ic_value,其中 loss 是目标函数的值,p 是维度,s 是稀疏度级别,n 是样本大小。 仅在 sparsity 为数组且 cv 为 1 时使用。 请注意,使用 ic_method 时必须提供 sample_size

  • cv (int, default=1) – 使用交叉验证方法时的折叠次数。如果 cv = 1,稀疏级别将通过信息准则选择。如果 cv > 1,稀疏级别将通过交叉验证方法选择。

  • split_method (callable, optional) – 一个用于获取交叉验证每一折中使用的数据部分的函数。 其接口应为 (data, index) -> part_data,其中 index 是一个整数数组。

  • cv_fold_id (array of shape (sample_size,), optional) – 一个数组,表示交叉验证中的不同折叠,同一折叠中的样本应赋予相同的编号。 不同元素的数量应等于cv。 仅在cv > 1时使用。

  • group (array of shape (dimensionality,), default=range(dimensionality)) – 每个变量的组索引,它必须是一个从0开始且没有间隔的递增整数数组。 同一组中的变量必须是相邻的,它们将一起被选择或不选择。 以下是一些错误的例子:[0,2,1,2](不是递增的),[1,2,3,3](不是从0开始),[0,2,2,3](有间隔)。 值得一提的是,“一个变量”的概念实际上意味着“一组变量”。例如,``sparsity=[3]`` 意味着将选择3组变量而不是3个变量, 而 always_include=[0,3] 意味着第0组和第3组必须被选择。

  • important_search (int, default=128) – 需要拼接的重要变量的数量。 这用于减少计算成本。如果它太大,将大大增加运行时间。

  • screening_size (int, default=-1) – 筛选后剩余的变量数量,筛选用于减少计算成本。 screening_size 应该是一个小于 p 但大于 sparsity 中任何值的非负数。如果 screening_size 为 -1,则不使用筛选。如果 screening_size 为 0,screening_size 将被设置为 int(p/log(log(p))/log(p))

  • max_exchange_num (int, optional, default=5) – 拼接时的最大交换次数。

  • is_dynamic_max_exchange_num (bool, default=True) – 如果 is_dynamic_max_exchange_num 为 True,max_exchange_num 将根据上一次迭代中交换的变量数量动态减少。

  • greedy (bool, default=True,) – 如果 greedy 为 True,将选择第一个能够减少目标函数值的交换编号。 否则,将选择能够最大程度减少目标函数值的交换编号。

  • splicing_type ({"halve", "taper"}, default="halve") – 每次迭代中减少交换次数的类型,从max_exchange_num开始。 “halve”表示每次减少一半,“taper”表示每次减少一个。

  • path_type ({"seq", "gs"}, default="seq") – 用于选择最佳稀疏度水平的方法。对于 path_type = “seq”,我们依次解决 sparsity 中所有大小的问题。对于 path_type = “gs”,我们解决稀疏度水平在 gs_lower_boundgs_upper_bound 之间的问题,其中要考虑的具体稀疏度水平由黄金分割法确定。

  • gs_lower_bound (int, default=0) – 用于稀疏搜索的黄金分割搜索的下限。 仅在 path_type = "gs" 时使用。

  • gs_upper_bound (int, optional) – 用于稀疏搜索的黄金分割搜索的上界。 默认值为 int(p/log(log(p))/log(p))。 仅在 path_type = “gs” 时使用。

  • thread (int, default=1) – 用于交叉验证的最大多线程数。如果 thread = 0,将使用设备支持的最大线程数。

  • random_state (int, optional) – 用于交叉验证的随机种子。

  • console_log_level (str, default="off") – 控制台输出日志的级别,可以是“off”、“error”、“warning”、“debug”。 例如,如果 console_log_level 是“warning”,则只有错误和警告日志会输出到控制台。

  • file_log_level (str, default="off") – 输出日志到文件的级别,可以是“off”、“error”、“warning”、“debug”。 例如,如果 file_log_level 是“off”,则不会将日志输出到文件。

  • log_file_name (str, default="logs/skscope.log") – 日志文件的名称(相对路径),用于存储日志信息。

params#

稀疏最优解。

Type:

形状为(dimensionality,)的数组

objective_value#

解的目标函数值。

Type:

浮点数

support_set#

所选变量的索引,按升序排序。

Type:

整数数组

information_criterion#

信息准则的值。

Type:

浮点数

cross_validation_loss#

交叉验证的平均损失。

Type:

浮点数

参考文献

  • 朱俊贤,温灿红,朱进,张和平,王雪琴。 最佳子集选择问题的多项式算法。 美国国家科学院院刊, 117(52):33117-33123, 2020.

get_config(deep=True)[来源]#

获取此求解器的参数。

Parameters:

deep (bool, default=True) – 如果为True,将返回此求解器的参数以及包含的子对象(如果它们是估计器)。

Returns:

params – 参数名称映射到它们的值。

Return type:

字典

get_estimated_params()[来源]#

获取目标函数的最优参数。

Returns:

parameters – 优化的最优解。

Return type:

形状为(维度,)的数组

get_result()[来源]#

获取优化的结果。

Returns:

results – 优化的结果,包括以下键:

  • params形状为 (dimensionality,) 的数组

    最优参数。

  • support_set整数数组

    最优参数的支持集。

  • objective_value浮点数

    在最优参数处的目标函数值。

  • information_criterion浮点数

    信息准则的值。

  • cross_validation_loss浮点数

    交叉验证的平均损失。

Return type:

字典

get_support()[来源]#

获取最优参数的支持集。

Returns:

support_set – 所选变量的索引,按升序排序。

Return type:

整数数组

set_config(**params)[来源]#

设置此求解器的参数。

Parameters:

**params (dict) – 求解器参数。

Returns:

求解器实例。

Return type:

自身

solve(objective, data=None, layers=[], init_support_set=None, init_params=None, gradient=None, jit=False)[来源]#

优化优化目标函数。

Parameters:
  • 目标 (可调用) – 需要最小化的目标函数:objective(params, data) -> loss 其中 params 是一个形状为 (dimensionality,) 的一维数组, data 是完全指定函数所需的固定参数。 如果未提供 gradient,则 objective 必须使用 JAX 库编写。

  • data (可选) – 传递给目标函数及其导数(如果存在)的额外参数。

  • layers (list of Layer objects, default=[]) – Layer 是目标函数的“装饰器”。 参数在进入目标函数之前会由 Layer 进行处理。 不同的层可以实现不同的效果, 并且它们可以顺序连接在一起形成一个更大的层, 从而实现更复杂的功能。 Layer 对象可以在 skscope.layers 中找到。 如果 layers 不为空,objective 必须用 JAX 库编写。

  • init_support_set (array of int, default=[]) – 初始活动集中变量的索引。

  • init_params (array of shape (dimensionality,), optional) – 参数的初始值,默认是一个全零向量。

  • gradient (callable, optional) – 一个返回参数梯度向量的函数:gradient(params, data) -> array of shape (dimensionality,), 其中 params 是一个形状为 (dimensionality,) 的一维数组,data 是完全指定函数所需的固定参数。 如果未提供 gradient,则 objective 必须用 JAX 库编写。

  • jit (bool, default=False) – 如果 objectivegradient 是用 JAX 编写的,可以将 jit 设置为 True 以加速优化。

Returns:

parameters – 优化的最优解。

Return type:

形状为(维度,)的数组