num_combinations: 创建 k 元素的子序列的组合数
一个用于计算从包含 n 个元素的序列中创建 k 个元素的子序列的组合数的函数。
> 从 mlxtend.math 导入 num_combinations
概述
组合是从一个集合中选择项目的方式,不考虑它们出现的顺序(与排列相对)。例如,我们考虑从一个包含5个元素(n=5)的集合中选取3个元素(k=3)的组合:
- 集合:{1, 2, 3, 4, 5}
- 组合 1a:{1, 3, 5}
- 组合 1b:{1, 5, 3}
- 组合 1c:{3, 5, 1}
- ...
- 组合 2:{1, 3, 4}
在以上例子中,组合1a、1b和1c被视为“相同的组合”,并计算为“组合项目1、3和5的1种可能方式”——在组合中,顺序并不重要。
从大小为 n 的集合中组合元素(不放回)成大小为 k 的子集的方法数是通过二项式系数 ("n 选择 k") 计算的:
$$ \begin{pmatrix} n \ k \end{pmatrix} = \frac{n(n-1)\ldots(n-k+1)}{k(k-1)\dots1} = \frac{n!}{k!(n-k)!} $$
为了计算有重复的组合的数量,使用以下替代方程("n 多重选择 k"):
$$\begin{pmatrix} n \ k \end{pmatrix} = \begin{pmatrix} n + k -1 \ k \end{pmatrix}$$
参考文献
示例 1 - 计算组合的数量
from mlxtend.math import num_combinations
c = num_combinations(n=20, k=8, with_replacement=False)
print('Number of ways to combine 20 elements'
' into 8 subelements: %d' % c)
Number of ways to combine 20 elements into 8 subelements: 125970
from mlxtend.math import num_combinations
c = num_combinations(n=20, k=8, with_replacement=True)
print('Number of ways to combine 20 elements'
' into 8 subelements (with replacement): %d' % c)
Number of ways to combine 20 elements into 8 subelements (with replacement): 2220075
示例 2 - 进度跟踪用例
跟踪计算密集型任务的进度,以估计其运行时间,通常是非常有用的。在这里,num_combination
函数用于计算 itertools 中 combinations
可迭代对象的最大循环次数:
import itertools
import sys
import time
from mlxtend.math import num_combinations
items = {1, 2, 3, 4, 5, 6, 7, 8}
max_iter = num_combinations(n=len(items), k=3,
with_replacement=False)
for idx, i in enumerate(itertools.combinations(items, r=3)):
# 对项集i进行一些计算
time.sleep(0.1)
sys.stdout.write('\rProgress: %d/%d' % (idx + 1, max_iter))
sys.stdout.flush()
Progress: 56/56
API
num_combinations(n, k, with_replacement=False)
Function to calculate the number of possible combinations.
Parameters
-
n
:int
Total number of items.
-
k
:int
Number of elements of the target itemset.
-
with_replacement
:bool
(default: False)Allows repeated elements if True.
Returns
-
comb
:int
Number of possible combinations.
Examples
For usage examples, please see https://rasbt.github.io/mlxtend/user_guide/math/num_combinations/