我最近读到,涉及散列的方法可能是查找浮点数数组模式的好方法。我对哈希或其应用程序知之甚少,而且文本没有进一步解释。
有谁知道这种方法会涉及什么?
答案 0 :(得分:4)
在这个意义上,the mode并不是一个统计数据,似乎被定义为“最常出现的价值”。
根据该描述,使用哈希表实现此功能的显而易见的方法似乎是使用数字作为键,并使用频率计数器作为存储的值。
然后循环遍历每个数字,在Python伪代码中,这将是:
array = [1.0, 1.2, 0.4, ...] # A bunch of numbers
counts = {}
for a in array:
if a in counts:
counts[a] += 1
else:
counts[a] = 1
然后你需要提取最大值,并找到相应的键:
sorted([(v, k) for k, v in counts.items()])[-1][1]
这将创建(值,键)对的排序列表,按值排序,然后从最后一个(1
)对中提取键([-1]
)。
我没有使用defaultdict或等价物,为了说明我认为if
非常有帮助。
注意:我不保证这是解决问题的规范方法。如果有人让我解决问题(也许暗示使用哈希是一个好主意),这就是我所做的,在我的头脑中。
答案 1 :(得分:3)
NB. random array of floating-point numbers
] y =: 10 (?@$%]) 5
0 0.6 0.2 0.4 0.4 0.8 0.6 0.6 0.8 0
NB. count occurrences
({:,#)/.~ y
0 2
0.6 3
0.2 1
0.4 2
0.8 2
NB. order by occurrences
(\:{:"1)({:,#)/.~ y
0.6 3
0 2
0.4 2
0.8 2
0.2 1
NB. pick the most frequent
{.{.(\:{:"1)({:,#)/.~ y
0.6
我建议不要使用散列,因为它假定了精确的比较 - 从来不是对浮点数的好假设。你总是希望做某种epsilon comparison。如果您的数组包含一些0.2(00000000)
和0.2(00000001)
元素,这些元素应该被认为是相同的,但不是因为它们来自不同的计算,该怎么办?
方便的是, J 默认情况下总是进行epsilon比较。太方便了,因为它隐藏在/.~
中,我必须编写更多代码才能演示如何在Python等其他语言中执行此操作...
epsilon = 0.0001
def almost_equal(a, b):
return -epsilon <= a-b <= epsilon
array = [0.0, 0.6, 0.2, 0.4, 0.4, 0.8, 0.6, 0.6, 0.8, 0.0]
# more efficient would be to keep this in sorted order,
# and use binary search to determine where to insert,
# but this is just a simple demo
counts = []
for a in array:
for i, (b, c) in enumerate(counts):
if almost_equal(a, b):
counts[i] = (b, c + 1)
break
else:
counts.append((a, 1))
# sort by frequency, extract key of most frequent
print "Mode is %f" % sorted(counts, key = lambda(a, b): b)[-1][0]