我有一个图像数据集,这些图像根据它们的趣味性进行排序。我想通过计算候选元素与该子集的所有当前成员之间的成对相似性来创建一个多样化的子集。
我的代码如下。看起来工作正常;但是,您可以猜到它非常慢(需要 6-7 小时)。
我想知道是否有另一种方法可以比此实现更快地创建此子集。
dataset = [a,b,c,d,e,f,g,...] #an example sorted dataset. real size is 20K
subset = [] #my diverse set. Desired size is 200
for ind, element in enumerate(dataset):
if ind == 0:
subset.append(element[ind]) #since the dataset is sorted I can directly add the first element
else:
similarities = []
for member in subset:
similarities.append(compute_similarity(element[ind], member))
if not any(similarities): #if the candidate is not similar to any of the existing members
subset.append(element[ind])
if len(subset) >= 200:
break
请您参考如下方法:
我看到的主要改进是,一旦您发现当前元素与您集合中已有的某个元素相似,就会立即中断。这可以简化您的代码,甚至可以消除对第一个元素进行额外检查的需要。
dataset = [a,b,c,d,e,f,g,...] #an example sorted dataset. real size is 20K
subset = [] #my diverse set. Desired size is 200
for candidate in dataset:
for member in subset:
if compute_similarity(candidate, member):
break
else:
subset.append(candidate)
if len(subset) >= 200:
break
请注意 for-else 结构,如果 for 循环没有中断,它只会执行“else”分支。
任何其他优化将取决于您的实际相似性指标。也许您可以以某种方式对数据进行排序,从而减少需要进行的比较。
