【问题标题】:How to measure the consistence of a sequence?如何衡量一个序列的一致性?
【发布时间】:2014-10-17 00:43:59
【问题描述】:

免责声明:我在数学方面非常陌生。所以也许我要问的是非常基本的。或者也许我需要帮助来重新提出问题。

我想用数字测量几个序列的一致性,这样我就可以根据这个一致性数对它们进行比较和排序。

这些是一些可能的示例 os 序列(根据我的意见)从不太一致到更一致排序,这些示例使用二进制值,但也可以是任意数量的选项:

  • 10101
  • 1010
  • 101
  • 10
  • 0 (*)
  • 1 (*)
  • 110
  • 11
  • 111
  • 1111

(*) 相等一致性

还有一些其他的场景我真的不知道怎么排序,看看下面几对,我真的不知道哪个会被定义为更一致:

对 1:

  • 111111111111101
  • 11

第 2 对:

  • 110
  • 1100

第 3 对:

  • 1010101010
  • 1111100000

我希望了解我应该如何继续计算此测量值:公式、文档链接、建议,欢迎提供任何信息。

【问题讨论】:

标签: math statistics sequence


【解决方案1】:

我可以计算“变化”的数量(从 0 到 1,反之亦然),然后除以序列中的元素总数。

如果序列可以有不同于 1 和 0 的东西,我会计算每个元素之间的“距离”。所以从 0 和 1 的变化“成本” 1,但从 0 到 2 的变化“成本” 2,等等。

def get_consistency(sequence)
  change = 0
  count = 0
  previous = nil
  sequence.each do |element|
    if previous then
      # define distance as whatever you want. For numbers, its abs(element-previous)
      change += distance(element, previous)
      count += 1
    end
    previous = element
  end
  count == 0 ? 0 : change / count
end

【讨论】:

  • 看起来不错.. 我有点喜欢这个实验的第 3 版:labs.codecademy.com/C6Rh/1#:workspace 你觉得怎么样?
  • 我看到你没有包括我的距离示例,使用差异的绝对值。我已将其包含在此处(第 4 步):labs.codecademy.com/C6Rh/2#:workspace。此外,我意识到“计数”是“计算应该的另一个元素”(它应该计算转换,而不是元素)。我已经在 codeacadam 和我的回答中解决了这个问题
  • 我看到了您的距离示例,但我想使用 分类变量 这是因为它们相等或不相等,与实际值无关。我喜欢count 的先前版本,因为如果不是序列1,21,2,3,4 具有相同的值.. 对于序列1,11,1,1,1.. 和(恕我直言)他们不应该。您示例的 VERSION 4 对我来说并不令人困惑,因为最一致的版本价值较小,11,1,1 之间没有区别。
  • 检查版本 5 labs.codecademy.com/C6Rh/3#:workspace 如果您允许,我想使用该版本修改您的代码。
  • 我认为我更喜欢“完全恒定”序列的一致性为 0,然后随着变化的发生而上升。我不喜欢有负值,那里;它们会使分类变得更加困难。你不能用两个数字来排序吗?首先按一致性排序,然后按长度对具有相同一致性的序列进行排序。
【解决方案2】:

基于@kikito 实现,但具有另一种风格:

def get_consistency(sequence)
  proximity =
    sequence.each_with_index.map do |element, index|
      index > 0 ? distance(element, sequence[index-1]) : 0
    end.reduce(:-)

  proximity / sequence.length.to_f
end

def distance(value1, value2)
  value1 == value2 ? -1 : 1 # Categorical variable
end

结果:

0.7500 <- 1,1,1,1
0.4000 <- 1,1,1,1,2
0.5714 <- 1,1,1,1,2,2,2
0.2857 <- 1,1,1,1,2,2,3
0.0000 <- 1
0.0000 <- 2
-0.5000 <- 1,2
-0.7500 <- 1,2,3,4
-0.2500 <- 1,2,2,3
0.9000 <- 1,1,1,1,1,1,1,1,1,1
0.9900 <- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1
0.9703 <- 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,2
-0.9000 <- 1,2,3,4,5,6,7,8,9,10
-0.9000 <- 1,0,1,0,1,0,1,0,1,0
0.7000 <- 1,1,1,1,1,0,0,0,0,0
0.2500 <- 1,1,0,0

【讨论】:

  • 我正在使用我的答案,但我的算法的原始学分用于@kikito 的答案。
猜你喜欢
  • 1970-01-01
  • 2020-05-08
  • 2017-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多