num_permutations: 创建 k 元素子序列的排列数
一个计算从 n 个元素的序列中创建 k 元素的子序列的排列数量的函数。
> from mlxtend.math import num_permutations
概述
排列是从一个集合中选择项目时考虑它们出现顺序的方式(与组合不同)。例如,让我们考虑从一个包含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是“相同的组合”,但却是不同的排列——在组合中,顺序无关紧要,但在排列中,顺序是重要的。
从大小为 n 的集合中组合元素(不重复)成大小为 k 的子集的方式数通过二项式系数(“n 选择 k”)来计算:
$$ k!\begin{pmatrix} n \ k \end{pmatrix} = k! \cdot \frac{n!}{k!(n-k)!} = \frac{n!}{(n-k)!} $$
要计算带替换的排列数,我们只需计算 $n^k$。
参考文献
示例 1 - 计算排列数
from mlxtend.math import num_permutations
c = num_permutations(n=20, k=8, with_replacement=False)
print('Number of ways to permute 20 elements'
' into 8 subelements: %d' % c)
Number of ways to permute 20 elements into 8 subelements: 5079110400
from mlxtend.math import num_permutations
c = num_permutations(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): 25600000000
示例 2 - 进度跟踪用例
通常跟踪计算开销大的任务的进度是非常有用的,以便估算其运行时间。在这里,可以使用 num_combination
函数来计算来自 itertools 的 permutations
可迭代对象的最大循环次数:
import itertools
import sys
import time
from mlxtend.math import num_permutations
items = {1, 2, 3, 4, 5, 6, 7, 8}
max_iter = num_permutations(n=len(items), k=3,
with_replacement=False)
for idx, i in enumerate(itertools.permutations(items, r=3)):
# 对项集i进行一些计算
time.sleep(0.01)
sys.stdout.write('\rProgress: %d/%d' % (idx + 1, max_iter))
sys.stdout.flush()
Progress: 336/336
API
num_permutations(n, k, with_replacement=False)
Function to calculate the number of possible permutations.
Parameters
-
n
:int
Total number of items.
-
k
:int
Number of elements of the target itemset.
-
with_replacement
:bool
Allows repeated elements if True.
Returns
-
permut
:int
Number of possible permutations.
Examples
For usage examples, please see https://rasbt.github.io/mlxtend/user_guide/math/num_permutations/