【发布时间】:2018-04-30 10:33:04
【问题描述】:
上下文:我正在尝试加快 k-means 的执行时间。为此,我在 k-means 执行之前预先计算了均值。这些均值存储在一个名为 mean_dict 的字典中,该字典具有一个按升序排列的点 id 序列作为键,然后用下划线连接,作为值是这些点的均值。 当我想在 k-means 执行期间访问 dict_mean 字典中给定点集的平均值时,我必须生成该点集的键,即按升序排列 id 点并通过下划线连接它们。 密钥生成指令需要很长时间,因为我的密钥可能包含数千个整数。
对于每个键,我在字典中都有一个由下划线“-”分隔的整数序列。为了使键唯一,我必须先对整数序列进行排序,然后再用下划线连接它们,我最终获得了一个字符串键。问题是这个过程太长了。我想使用另一种类型的键来避免对序列进行排序,并且该键类型在访问、比较和搜索方面应该比字符串类型更快。
# means_dict is the dictionary containing as a key a string (sequence of
# integers joined by underscore "-", for example key="3-76-45-78-344")
# points is a dictionary containing for each value a list of integers
for k in keys:
# this joining instruction is so long
key = "_".join([ str(c) for c in sorted(points[k])])
if( key in means_dict ):
newmu.append( means_dict[key] )
【问题讨论】:
-
你能给我们更多的背景信息吗?你想达到什么目的?当点作为整数列表给出时,为什么means_dict的字典键以给定的方式给出?
-
@IonicSolutions 我添加了上下文,请参阅问题。 Points 是一个集合或类的点 id 的列表。字典 mean_dict 有 k:v 格式,v 是字符串键 k 表示的集合的均值。
-
感谢您编辑您的问题!我只是模糊地熟悉 k-means 算法,但我怀疑预先计算所有可能点集的平均值会加速算法。如果我正确理解了算法,最初会选择 k 个随机点集,然后对其进行更改,因此对于大多数可能的点集,永远不需要计算平均值。您是否检查过预计算计算的均值比原始 k-means 少?由于您的问题旨在改进潜在改进的实现细节:您是否尝试过改进您的手段()方法?
-
一般来说,“哪个更快”问题的答案是“自己试试看”。在你的情况下,我建议你试试
frozenset,因为它不需要排序(由你——我不知道它是否在内部排序)。 -
@IonicSolutions 我预计算只意味着那些有很大机会被 k-means 使用。我使用 Voronoi 来获取 k 个集合以预先计算均值。我看到 k-means 使用了一些预先计算的方法。当我将 k-means 的执行时间与标准 k-means 进行比较时,我发现我的 k-means 有点差,因为在 mean() method.means 和标准 k-means 中生成密钥的时间很长,我看到了由于 mean() 方法中的密钥生成时间较长,我的 k-means 稍差。
标签: python sorting data-structures cluster-analysis k-means