UTF8gbsn
n个不同的对象分到k个相同的盒子里面, 要求每个盒子至少有一个对象.
有多少种分法. 这是在k均值聚类里面的一个组合数学问题.
在k均值聚类里面有n个对象各不相同,
要把这个n个对象分到k个类别里面并要求每个类别必须至少含有一个对象.
总共的分法有多少中? 这道题的答案是第二类的stirling number.
我们来看看如何来求解.我们把原问题定义为
P
(
n
,
k
)
P(n,k)
P(n,k)
初探
如果将n个不同的对象放到k个不同的盒子里面总共有多少种方法?
这个问题不再限制每个盒子必须含有一个对象. 我们定义这个事件为
S
S
S,答案是
∣
S
∣
=
k
n
|S|=k^n
∣S∣=kn
接下来,
我们再来定义特殊的几个事件.我们先假设盒子各不相同并且有
k
k
k个盒子.
设
A
i
A_i
Ai表示第
i
,
(
1
⩽
i
⩽
k
)
i, (1\leqslant i\leqslant k)
i,(1⩽i⩽k)个盒子是空的事件.
那么,我们定义下面一个事件
S n , k = A ‾ 1 ∩ A ‾ 2 ∩ ⋯ ∩ A ‾ k S_{n,k}=\overline{A}_1\cap \overline{A}_2 \cap \cdots \cap \overline{A}_k Sn,k=A1∩A2∩⋯∩Ak
事件 S n , k S_{n,k} Sn,k表示, k k k个盒子都非空.
∣ S n , k ∣ = ∣ S ∣ − ∣ A 1 ∪ A 2 ∪ ⋯ ∪ A k ∣ |S_{n,k}|=|S|-|A_1\cup A_2\cup \cdots \cup A_k| ∣Sn,k∣=∣S∣−∣A1∪A2∪⋯∪Ak∣
如果我们能够计算出 ∣ S n , k ∣ |S_{n,k}| ∣Sn,k∣那么 P ( n , k ) = 1 k ! ∣ S n , k ∣ P(n,k)=\frac{1}{k!}|S_{n,k}| P(n,k)=k!1∣Sn,k∣
容斥原理
现在我们剩下的唯一目的就是计算
∣
A
1
∪
A
2
∪
⋯
∪
A
k
∣
|A_1\cup A_2\cup \cdots \cup A_k|
∣A1∪A2∪⋯∪Ak∣.
而这个集合可以使用容斥原理来计算
∣ A 1 ∪ A 2 ∪ ⋯ ∪ A k ∣ = ∑ i = 1 k ∣ A i ∣ − ∑ 1 ⩽ i < j ⩽ n k ∣ A i ∩ A j ∣ + ∑ 1 ⩽ i < j < h ⩽ n k ∣ A i ∩ A j ∩ A h ∣ + ⋯ + ( − 1 ) k ∣ A 1 ∩ A 2 ∩ ⋯ ∩ A k ∣ |A_1\cup A_2\cup \cdots \cup A_k| = \sum_{i=1}^{k}|A_i|-\sum_{1\leqslant i< j \leqslant n}^k|A_i\cap A_j|+\sum_{1\leqslant i< j < h \leqslant n}^{k}|A_i\cap A_j\cap A_h|+\cdots+ (-1)^k|A_1\cap A_2\cap \cdots \cap A_k| ∣A1∪A2∪⋯∪Ak∣=i=1∑k∣Ai∣−1⩽i<j⩽n∑k∣Ai∩Aj∣+1⩽i<j<h⩽n∑k∣Ai∩Aj∩Ah∣+⋯+(−1)k∣A1∩A2∩⋯∩Ak∣
∣ A 1 ∪ A 2 ∪ ⋯ ∪ A k ∣ = ( k 1 ) ( k − 1 ) n − ( k 2 ) ( k − 2 ) n + ( k 3 ) ( k − 3 ) n + ⋯ + ( − 1 ) k − 1 ( k k ) ( k − k ) n |A_1\cup A_2\cup \cdots \cup A_k|=\binom{k}{1}(k-1)^n-\binom{k}{2}(k-2)^n+\binom{k}{3}(k-3)^n+\cdots + (-1)^{k-1}\binom{k}{k}(k-k)^n ∣A1∪A2∪⋯∪Ak∣=(1k)(k−1)n−(2k)(k−2)n+(3k)(k−3)n+⋯+(−1)k−1(kk)(k−k)n
最后可得
∣ S n , k ∣ = ∣ S ∣ − ∣ A 1 ∪ A 2 ∪ ⋯ ∪ A k ∣ = ( k 0 ) ( k − 0 ) n − ( k 1 ) ( k − 1 ) n + ( k 2 ) ( k − 2 ) n + ( k 3 ) ( k − 3 ) n + ⋯ + ( − 1 ) k ( k k ) ( k − k ) n = ∑ i = 0 k ( k i ) ( − 1 ) i ( k − i ) n \left. \begin{aligned} |S_{n,k}|&=|S|-|A_1\cup A_2\cup \cdots \cup A_k|\\ &=\binom{k}{0}(k-0)^n-\binom{k}{1}(k-1)^n+\binom{k}{2}(k-2)^n+\binom{k}{3}(k-3)^n+\cdots + (-1)^{k}\binom{k}{k}(k-k)^n\\ &=\sum_{i=0}^{k}\binom{k}{i}(-1)^i(k-i)^n \end{aligned} \right. ∣Sn,k∣=∣S∣−∣A1∪A2∪⋯∪Ak∣=(0k)(k−0)n−(1k)(k−1)n+(2k)(k−2)n+(3k)(k−3)n+⋯+(−1)k(kk)(k−k)n=i=0∑k(ik)(−1)i(k−i)n
最后得到第二类stirling number为
P ( n , k ) = 1 k ! ∣ S n , k ∣ = 1 k ! ∑ i = 0 k ( k i ) ( − 1 ) i ( k − i ) n P(n,k)=\frac{1}{k!}|S_{n,k}|=\frac{1}{k!}\sum_{i=0}^{k}\binom{k}{i}(-1)^i(k-i)^n P(n,k)=k!1∣Sn,k∣=k!1i=0∑k(ik)(−1)i(k−i)n
测试
使用本算法测试小数据如果
n
=
4
,
k
=
2
n=4,k=2
n=4,k=2,可手算出结果为
P
(
4
,
2
)
=
7
P(4,2)=7
P(4,2)=7.
和我们使用公式计算的结果一样.
另外还有一种验算方法,就是使用软件计算和我们计算的结果进行比对.
通过mathematica对stirling number进行计算我们的算法和软件的结果一样.比如
S t i r l i n g S 2 [ 11 , 4 ] = 145750 StirlingS2[11, 4] = 145750 StirlingS2[11,4]=145750