【发布时间】:2020-10-04 01:36:06
【问题描述】:
问题描述:
我正在制作一个函数,它为我提供了基于单个索引的多个描述符的特定组合的定义。我的输入是一组原始特征X = [feat0,feat1,feat2,feat3,feat4],一个要使用的权力列表pow = [1,2,3],以及一个组大小列表sizes = [1,3,5]。有效的输出可能如下所示:
feat0^2 * feat4^3 * feat1^1
此输出有效,因为 feat0、feat4 和 feat1 存在于 X 中,它们的幂存在于 pow 中,并且组合的特征数在 sizes 中。
无效的边缘情况包括:
-
X中不存在的值,pow中不存在的幂,sizes中不存在组合大小 - 与另一个相同的组合无效:
feat0^2 * feat1^3和feat1^3 * feat0^2相同 - 包含多个相同特征的组合无效:
feat0^1 * feat0^3 * feat2^2无效
在后台,我将这些分组编码为元组列表。所以feat0^2 * feat4^3 * feat1^1 将表示为[(0,2), (4,3), (1,1)],其中元组中的第一个元素是特征索引,第二个元素是幂。
问题:
我的问题是,如何创建特定组合到索引i 的一对一映射?我想获得可能组合的数量,并能够将整数 i 插入函数,并让该函数生成特定组合。像这样的:
X = [0.123, 0.111, 11, -5]
pow = [1,2,3]
sizes = [1,3]
#getting total number of combinations
numCombos = get_num_combos(X,pow,sizes)
#getting a random index corresponding to a grouping
i = random.randint(0, numCombos)
#getting grouping
grouping = generate_grouping(i, X, pow, sizes)
print(grouping)
导致类似
[(0,1), (1,2), (3,1)]
到目前为止,弄清楚不考虑各种边缘情况的一代并不太难,但我不知道如何解释边缘情况 2 和 3;确保i 的任何值在代数上都不会与i 的任何其他值等价,并且同一特征不会在分组中多次出现。
当前进展
#computes the n choose k of a list and a size
def get_num_groupings(n, k):
return int(math.factorial(n)/(math.factorial(k)*math.factorial(n-k)))
import numpy as np
import bisect
i = 150
n = 5
m = 3
sizes = [1, 3, 5]
#computing the number of elements in each group length
numElements = [m**k * get_num_groupings(n, k) for k in sizes]
#index bins for each group size
bins = list(np.cumsum(numElements))[:-1]
#getting the current group size
binIdx = bisect.bisect_left(bins,i)
curSize = sizes[binIdx]
#adding idx 0 to bins
bins = [0]+bins
#getting the location of i in the bin
z = i - bins[binIdx]
#getting the product index and combination rank
pi = z // m**k
ci = z % m**k
#getting the indexes of the powers
pidx = [(pi // m**(curSize - (num+1)))%m for num in range(curSize)]
#getting the indexes of the features
#TODO cidx = unrank(i, range(n))
这是基于Mad Physicist 的回答。虽然我还没有弄清楚如何获得cidx。为了我自己的理解,重写了一些变量名。据我所知,这种实现是通过在逻辑上分离变量组合以及它们各自拥有的权力来实现的。到目前为止,我可以从索引i 获得权力,一旦unrank 被熨平,我应该能够获得使用特征的索引。
【问题讨论】:
-
显示你到目前为止的发现。您可能需要自定义排名和取消排名功能
-
完成。哇,这是一个非常长的条目
标签: python algorithm data-science combinatorics