贪婪算法可以说是最符合我们人类直觉的算法了,甚至有的时候贪婪算法就可以得到目标的最优解,比如说最小生成树算法。那么我们自然就会想知道,它能达到最优值吗?如何判断?实际上一个叫Matroid的东西是可以帮助我们判断是否能达到最优值的。但是如果不能达到最优,它到底有多近似呢?submodularity optimization对这个问题给予了一个答案。

我们形式化地定义一下这个贪婪算法的问题,对于元素N,我们希望找到一个使得f最大的最优子集

,即
,其中

这样的问题很显然,我们是不可能去遍历所有的子集来找这个最优解的,所以在什么条件下,这样的问题才可以求解?

submodularity condition

接下来,我们会对f做一些约束,赋予他一个叫monotone和submodularity的性质。我们可以把f想象成是一个评价雷达覆盖范围的函数,当我们在不同的点选择放置雷达的时候,他有可能会跟现有的一些雷达的范围有重合,但是可以肯定的是,当我们在不停放置雷达的时候,覆盖范围是肯定不会减少的,只会变得越来越大。即如果有集合

一定有
这称为monotone 单调性。

因此,单调性是我们希望函数拥有的第一个性质,而第二个性质就是submodularity性质。

submodularity

对于同一个地方,在雷达覆盖范围比较小的时候加入一个雷达(左图),它的效果肯定比在雷达覆盖范围比较大的时候加一个雷达的效果要好(右图)。基于此我们可以给出一个定义:

Definition 1函数

称为submodular当且仅当对于所有的子集
和 所有

这里T就是雷达覆盖范围比较大的时候,S就是覆盖范围比较小的时候,显然对S“雪中送炭”的效果要更加好。

Proposition 1

submodular 当且仅当

证明:令

这就是我们上面的定义的式子,实际上因为
根据定义我们可以推出:
在不等号左边,A可以换种写法,是
然后再并上的A,于是我们就得到上面的这条公式。

接下来再介绍几个有用的性质,submodular函数的求和还是submodular函数,submodular函数的加权求和(权重非负)也还是submodular函数。这个性质让我们可以定义一些很简单的submodular函数,然后把他们加起来组成一个复杂的函数。

Submodularity + Monotonicity =

approximation.

现在你的函数有了这两个性质,而且任务找到一个大小为k的子集S使得f达到最大,那么不同大小的k会造成什么影响呢?该理论的一个漂亮的地方是,如果你函数有Submodularity和Monotonicity这两个性质那么至少63%的效果是可以保证的。当然在实际中,常常可以高于这个值。以下定理给出了该描述的一个正式证明,该函数在使用贪婪算法,每一步都选择一个最优的元素来最大化f时,他一定能得到一个1-1/e(63%)的近似。为了证明这个bound,我们给出几个定义以及一些有用的定理。

Definition 2

,
, 对于与S的marginal contribution 定义为一个关于S的函数
这个表示在已有集合S的前提下增加一个T的增量。根据submodular的性质,显然submodular等价于
,
.事实上,这里定义的marginal contribution可以看做是在离散数据上微分的推广,这里测量的正是一种增量。

Proposition 2以下三个命题是等价的:

  1. f is submodular
  2. is submodular
  3. is subadditive

证明:
1⟹ 2: 设

,于是可以推出下面等式成立:

2⟹3: 由上一个条件可知

也是submodular函数,因此我们只需证明

submodular函数都是subadditive就可以了。

上述不等式是因为

3⟹1: 考虑

证毕。
接下来给出一个非常重要的引理

Corollary 1设f是submodular函数,则

如果f是monotone submodular 那么S不需要是T是子集

证明:如果f是submodular的,那么根据其subadditive性质:

因为

,若
显然有
,若
,根据monoton性质,有
,于是
,

证毕。

Cardinality constraint

现在我们第一个想要推的定理就是使用贪婪法得到的长度不超过K的子集与最优子集的差距最少也有

。不妨假设
,(如果不为0,可以减去一个常数让他为0),先来考虑一个最简单的约束条件,我们希望找到长度最多为K的最优子集,使用贪婪算法来搜索:

并使用如下贪婪算法去搜索:

可以证明上述算法

的近似程度为(1- 1/e):

Theorem 1

achieves a (1- 1/e)-approximation of the optimum.

证明:

表示
是由贪婪算法在第i步返回的结果,且
为最优的集合。

第一个不等式来自与推论1。第二个不等式是因为在贪婪算法中,在第i步加入的e一定是最优的,即

,第三个不等于号是因为我们约束
,所以最多只有K个求和。

同时减去

然后我们一直将

往下展开从而有

又因为

,所以

证毕。

Knapsack Constraint

接来下介绍一下另一种约束,有时候,其集合长度不一定是固定的,每将一个元素加进集合都可能导致一些成本,所以,考虑在一定成本下,找到最优的集合就很重要。考虑成本函数

和预算
,考虑如下优化问题:

在这种约束下,有很多种不同的贪婪策略,不同的策略会有不同的界,一个最简单的策略就是从每次选择最大提升的元素加入S,变成每次选择性价比最高元素加入集合S。

Matroid Constraint

那么什么时候,贪婪算法可以得到最优解呢? 答案是,如果我们在搜索子集的时候,搜索空间中所有的子集都是“独立”的,那么我们是有可能用贪婪算法找到最优解的。而Matriod定义了这么一种独立的性质.

想要进一步了解可以访问以下参考资料。

参考资料

When Greedy Algorithms are Good Enough: Submodularity and the (1 – 1/e)-Approximation

When Greedy Algorithms are Perfect: the Matroid

Notes on Greedy Algorithms for Submodular Maximization

Submodular Function Maximization

子集和问题 算法_贪婪算法有多好?Submodularity告诉你相关推荐

  1. 子集和问题 算法_子集问题 主要是去重算法

    给定一个可能包含重复元素的整数数组 nums,返回该数组所有可能的子集(幂集).说明:解集不能包含重复的子集.示例: 输入: [1,2,2] 输出: [ [2], [1], [1,2,2], [2,2 ...

  2. 判断大小简单算法_优化 | 贪婪算法有多好?Submodularity告诉你

    文章作者:乔杰 责任编辑:苏向阳 本文转载自知乎专栏 贪婪算法有多好?Submodularity告诉你 原文链接:https://zhuanlan.zhihu.com/p/52512602 文章发表于 ...

  3. 深度学习算法和机器学习算法_啊哈! 4种流行的机器学习算法的片刻

    深度学习算法和机器学习算法 Most people are either in two camps: 大多数人都在两个营地中: I don't understand these machine lea ...

  4. JS数据结构与算法_链表

    上一篇:JS数据结构与算法_栈&队列 下一篇:JS数据结构与算法_集合&字典 写在前面 说明:JS数据结构与算法 系列文章的代码和示例均可在此找到 上一篇博客发布以后,仅几天的时间竟然 ...

  5. 算法_深度LSTM笔记[博]

    原创博客链接:算法_深度LSTM笔记 本文适合有一定基础同学的复习使用,不适合小白入门,入门参考本文参考文献第一篇 结构_静态综合图 结构_分步动图 进一步,向量化参数和引入问题 1, cell 的状 ...

  6. LeetCode_初级算法_数组

    LeetCode|初级算法_数组 题目如下: 1.1 从排序数组中删除重复项 给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度. 不要使用额外的数组空间 ...

  7. 数据挖掘经典十大算法_条件熵、信息增益介绍

    数据挖掘经典算法_条件熵.信息增益介绍 一.条件熵 首先与信息熵进行类比,从信息熵的计算公式中我们知道它是考虑到该随机变量的所有可能取值,即所有可能发生事件所带来信息量的期望.由此顾名思义 条件熵的定 ...

  8. cb32a_c++_STL_算法_查找算法_(5)adjacent_find

    cb32a_c++_STL_算法_查找算法_(5)adjacent_find adjacent_find(b,e),b,begin(),e,end() adjacent_find(b,e,p),p-p ...

  9. Python_机器学习_算法_第4章_4.决策树算法

    Python_机器学习_算法_第4章_4.决策树算法 文章目录 Python_机器学习_算法_第4章_4.决策树算法 决策树算法 学习目标 4.1 决策树算法简介 学习目标 小结 4.2 决策树分类原 ...

最新文章

  1. ROM、PROM、EPROM、EEPROM、RAM、SRAM、DRAM的区别
  2. java jtabbedpane 关闭_JTabbedPane实现关闭按钮 | 学步园
  3. 中国汽车电器运营现状与十四五发展规划报告2022-2028年版
  4. Promise用法总结
  5. Linux检查镜像,Shell脚本实现检测Cygwin最快的镜像站点
  6. 重要接口—NavigableSet接口
  7. 使用IShellView接口函数CreateViewWindow
  8. hp-ux 单用户 启动_UX备忘单:搜索与浏览
  9. java 6 update 3_Java(TM) 6 Update(java运行环境) V 6.0.450.6 官方版
  10. Ubuntu安装搭建Clion环境
  11. Struts2源码阅读(六)_ActionProxyActionInvocation
  12. QT4 designer的使用 QT国际化
  13. 2014 Red Hat Summit(红帽峰会)PPT合集
  14. Hadoop CapacitySchedule配置
  15. android快牙原理,快牙的使用原理是什么_快牙怎么使用_3DM手游
  16. FANUC机器人基础学习_示教器详解(图文)
  17. Vue.js快速原型开发问题汇总
  18. 梁宁产品思维学习笔记
  19. Android中图片压缩方式总结
  20. 浅谈编程(肺腑之言)

热门文章

  1. springboot 接口文档 请求 enum_Spring Boot集成SpringFox 3:生成Swagger接口文档
  2. java 反射 泛型 构造函数_Java复习——反射和泛型的复习
  3. 设计模式(二)--里氏替换原则(Java的继承规范)
  4. oracle linux内存推荐分配,[20191114]linux内存分配的讨论.txt
  5. 内存分析_Redis内存爆炸增长?你需要知道这一套Redis内存分析方法
  6. 启动子级时出错_WHO I级脑膜瘤手术或放射外科治疗后的恶性转变
  7. 【项目调研+论文阅读】Lattice LSTM神经网络医学文本命名实体识别 | day7
  8. win7计算机无法最大化,主编教您win7游戏无法全屏怎么办
  9. python中的一些基础
  10. 在计算机组成原理中x,计算机组成原理xu2.ppt