-1

所以我意识到这既是一个理论问题,也是一个编码问题,但是如果我有一个包含 10 个标签(x1、x2、...、x10)的列表以及它们对应的“位置”向量(v1、v2、... , v10)。

我想根据它们彼此之间的 L2 范数距离来折叠它们。例如,如果 v1 接近 v10,则将所有 x10 重新标记为 x1,依此类推。

所以最终结果可能看起来像新标签:(x1, x3, x7, x8)。有没有办法巧妙地将它变成 (x1', x2', x3', x4')?,这样人们就不会感到困惑并假设新标签是相同的。

给定:标签 = Nx1 的向量,包含所有标签 (1,2,3...,10)

示例代码:

epsilon = 0.2  # defines distance
change = [] # initialize vector of labels to change

# matrix is NxN matrix of the pairwise distances between all our vectors (v1,..,v10)
for i in range(0, distancematrix): 
    for j in range(0, distancematrix):
        # add all pairs of labels that are "close", so that we may relabel
        if i!=j and distancematrix[i, j] < epsilon:
            change.append((i,j))

这将生成我要重新标记的对列表。是否有一种重写“标签”的聪明方法,以便它合并我要合并的所有对并保留不属于任何合并的标签。如果我合并 6 对数字 (10-6 = 4),则将其重组为从 (1,2,3,4) 开始。

谢谢你。我意识到这是一个奇怪的问题,所以如果您有任何问题,请告诉我!

4

2 回答 2

0

这实际上为我完成了这项工作。

# creates a list of numbers from 0 to the length of your newlabels vector
changeto = [i for i in range(0, len(np.unique(newlabels)))]

# get the unique values of your newlabels (e.g. 0, 3, 4, 5, 10)
currentlabels = np.unique(newlabels)

# change all your labels to your new mapping (e.g. 0 -> 0, 3 -> 1, 4 -> 2, etc.)
for i in range(0, len(changeto)):
    if currentlabels[i] != changeto[i]:
        # change the 'states' in newlabels to new label
        newlabels = [changeto[i] if x==currentlabels[i] else x for x in newlabels]

也许它不漂亮,但是您将新标签映射到第 0、1、2、...x 行,其中 x 是新压缩标签向量的长度。

于 2015-09-10T20:02:48.103 回答
-1

如果标签不参与任何合并怎么办?你想保留原来的标签吗?如果是这样,如果该标签超出新范围怎么办?

总的来说,我认为这只是在给定标签数量的情况下生成新标签:

new_label_list = ["x"+str(n+1)+"'" for n in range(len(change))]

对于长度 4 的更改,这会给你 ["x1'", "x2'", "x3'", "x4'"]

你看到新标签是如何构建的吗?

leading "x"
string version of the index, 1 .. length
trailing prime character
于 2015-09-10T18:54:49.383 回答