凸集:定義、凸組合、凸包
為什麼最佳化理論偏愛凸集?從定義、凸組合到凸包,配一個可拖曳的凸包生成互動。
最佳化理論裡,「凸」幾乎是所有好性質的源頭:局部最小就是全域最小、對偶沒有 gap、演算法有收斂保證——這些漂亮的結論幾乎都建立在凸性之上。這篇文章從最基本的**凸集(convex set)**開始。
01 定義:任兩點的連線都留在集合內
集合 稱為凸集,若對任意 與 ,都有
把 想成一塊地:凸集就是「地上任兩點之間直接拉一條線,這條線也完全在地上」——沒有凹進去的地方,不會有兩點連線跑出邊界又繞回來的情形。
球、超平面、多面體都是凸集;甜甜圈(環面內部)、兩個不相交的圓盤聯集則不是。
02 凸組合與凸包
給定點 ,其**凸組合(convex combination)**是
一組點所有凸組合的集合,稱為這組點的凸包(convex hull),記作 ——直觀上就是「把這些點當釘子,繃一條橡皮筋繞一圈,橡皮筋圍出來的區域」。
拖曳任一個點,凸包(磚紅色邊框區域)會即時重新計算。只有落在凸包邊界上的點會被填色——被包在裡面的點,不管怎麼動橡皮筋形狀都不會變,因為它已經是其他點的凸組合。
凸包一定是凸集(可以直接從定義驗證),但反過來一個凸集不一定是「有限多個點」的凸包——例如一整個實心圓盤就不是任何有限點集的凸包。
03 用程式算凸包
真的要算一組點的凸包時不用手刻,scipy.spatial.ConvexHull 幾行就能算出邊界頂點:
import numpy as np
from scipy.spatial import ConvexHull
points = np.random.rand(30, 2)
hull = ConvexHull(points)
print(points[hull.vertices]) # 依序排列的凸包頂點04 凸集的交集仍是凸集
這是一個看似簡單、但在約束最佳化裡極為關鍵的性質:任意多個凸集的交集仍是凸集。這保證了「同時滿足多條凸約束」的可行域仍然是凸的。
▸展開完整證明Proof · 無跳步
設 為一族凸集,令 。
取任意 與 。因為 ,對每個 都有 。
由於每個 都是凸集,故 對所有 成立。
因此 ,即 是凸集。
∎
05 為什麼這件事重要
一個 LP 的可行域 其實是有限多個半空間(都是凸集)的交集,所以可行域必為凸多面體——這正是下一篇要細看的幾何。同理,多條凸約束疊加在一起的 NLP 可行域,也仍然保證是凸的。
「約束是線性的,所以可行域一定是凸的」——方向對了但講法不夠精確:真正的關鍵是每條約束描述的都是一個凸集(半空間、凸函數的下水平集等),交集才會是凸的。如果約束本身非凸(例如 這種等式約束描述一個球面),可行域一般就不是凸集了。
06 延伸閱讀
下一篇會證明「兩個不相交的凸集可以被一個超平面分開」——這是整個對偶理論的幾何起點。