凸集合与凸函数 以及案例实现

1.凸集合(Convex Set)

定义:假设对于任意x,y ∈ C and 任意参数 α ∈ [0,1],我们有αx + (1-α)y ∈ C ,集合C为凸集合。
凸集合与凸函数 以及案例实现_第1张图片
例子:

  • 所有的R^n
  • 所有的正数集合
  • 范数 ||x|| <= 1
  • affine set:线性方程的所有解 Ax = b
  • halfspace: 不等式的所有解 a^T x <= b

定理:两个凸集的交集也是凸集(intersection of convex set is convex)

2.凸函数(Convex Function)

定义:函数f的定义域dom f为凸集,对于定义域里的任意x,y,函数满足:
f(θx + (1-θ)y) <= θf(x) + (1-θ)f(y)
凸集合与凸函数 以及案例实现_第2张图片
假设f为凸函数,则-f为凹函数

例子:

  • 线性函数为凸/凹函数
  • exp x , -log x ,x log x是凸函数
  • 范数为凸函数
  • x^T * x/t为凸函数(t > 0)
  • (x1x2,…,xn)^(1/n)是凹函数(x > 0)

定理:

  1. First order convexity conditions:
    凸集合与凸函数 以及案例实现_第3张图片
  2. Second order convexity conditions: 凸集合与凸函数 以及案例实现_第4张图片

例子拓展:
3. 对于任意PSD矩阵A,符合以下情况的二次方函数(quadratic function)都是凸函数。在这里插入图片描述

3.案例

最大流问题(Maximum Flow Problem)

计算出从源点到经过的所有路径的最终到达汇点的最大流之和
凸集合与凸函数 以及案例实现_第5张图片

  1. 首先我们可以定义一个 x_ij ,意味着从i点到j点的流量,然后就可以推理出以下限制条件:
    Node1: x_01 = x_14 + x_15 (1点的流量流入和流出相等)
    Node2: x_02 = x_24 + x_25 + x_26
    Node3: x_03 = x_35
    Node4: x_14 + x_24 = x47
    Node5: x_15 + x_25 + x_35 = x_57
    Node6: x_26 = x_67
    另外,每一条管道的值,都应该大于等于0,且小于等于可通过的最大值,例如0 <= x_01 <= 3

然后我们可以将条件带入scipy.optimize.linprog之类的库中进行运算
凸集合与凸函数 以及案例实现_第6张图片
然后直接打印结果

res = linprog(c, A_eq=A, b_eq=b, bounds=(x0_bounds,x1_bounds,x2_bounds,x3_bounds,x4_bounds,x5_bounds,x6_bounds,x7_bounds,x8_bounds,x9_bounds,x10_bounds,x11_bounds), options={"disp": True})
print(res

打印结果如下:
凸集合与凸函数 以及案例实现_第7张图片
可以看到一共循环了11次,找到最小值结果是-6(因为模型是求的最小值,所以做了负数的处理,实际结果就是6)

你可能感兴趣的:(机器学习,自然语言处理)