【问题标题】:Python 3.4 calculating the mode,median reading through a filePython 3.4计算模式,通过文件读取中位数
【发布时间】:2017-01-14 15:28:41
【问题描述】:

我想知道是否有另一种编码方式 这个问题的核心是解决这个问题的最简单的方法是读取一个文件并将值保存在列表中。那么你会在哪里:

a = [1,2,3,4,5,6,1,1,1,1]
import statistics
listMode = statistics.mode(a) # median, average, etc...

我想知道,不必将这些值保存在 a 中(因此内存可能会很大),我是否可以在读取文件时即时计算模式并在每次读取时更新单个值一条新线,即增量计算模式、中位数和平均值。所以最后我会有a = [mode,median,average]

【问题讨论】:

  • 即使在非常大的数据集上,我也看不到如此简单的操作需要很长时间,因此我认为没有理由尝试“即时”计算,而是在最后完成所有操作
  • 如何“增量”?如果文件只被读取一次,您将需要为数据集中的每个唯一值存储至少一个值和一个计数。如果读取文件的次数与文件中值的数量相同,则所需的存储空间会减少,但执行时间会急剧增加。
  • 我有一个相当水平的嵌套字典,并且不希望有一个巨大的列表,出于同样的原因,我想对许多变量执行此操作,它会使生活更清洁。如果性能成为一个重要问题,那么这使得选项变得清晰。但是,我在制作模式和中值工作方面没有成功。平均要容易得多,并且经历了改进。

标签: python python-3.x


【解决方案1】:

如果输入数字集来自一个相当小的值域(如您的示例中所示),您可以使用 Counter 来计算每个值经过时您看到的数量。从那个Counter 你可以很容易地得到模式,并且只需一点​​工作就可以得到中位数。即时计算平均值很容易,不需要Counter:只需保持运行总数和运行计数即可。

【讨论】:

  • 它很大,这只是一个简单的例子。计数器会有所改善,但增量方法会更好。商定的平均值是微不足道的甚至加权平均值。
  • 我看不到在不计算每个值的情况下获得精确模式的希望。一旦您放弃某个值的计数,对手就会通过生成一堆具有该值的条目来将您搞砸。但是,这篇文章讨论的是计算近似模式:stackoverflow.com/questions/1058813/…
  • 如果您对数据的分布有所了解,您可以对其进行分桶并计算每个桶中的条目数。然后你可以通过最重的桶的中点得到一个近似的模式。
  • 不幸的是,这在这种情况下不起作用,否则近似值会起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-29
  • 2017-10-26
  • 1970-01-01
相关资源
最近更新 更多