【问题标题】:Bell Curve Gaussian Algorithm (Python and/or C#)钟形曲线高斯算法(Python 和/或 C#)
【发布时间】:2010-12-30 06:36:50
【问题描述】:

这是我正在尝试做的一个稍微简化的示例。 假设我有一个计算学分的公式,但该公式没有约束(例如,分数可能是 1 到 5000)。并为 100 人分配一个分数。

现在,我想根据钟形曲线为每个人分配 200 到 800 之间的“标准化”分数。例如,如果一个人有 5000 分,他可能会在新的量表上得到 800 分。我的分数范围中间的人会得到接近500的分数。换句话说,500是中位数?

类似的例子可能是“曲线评分”的旧场景,其中大部分学生可能获得 C 或 C+。

我不是要代码,无论是库、算法书还是要参考的网站……我可能会用 Python 编写这个(但 C# 也很有趣)。无需绘制钟形曲线。我的数据可能会在数据库中,甚至可能有一百万人要分配这个分数,所以可扩展性是一个问题。

谢谢。

【问题讨论】:

  • "基于钟形曲线" - 如果您的输入数据是 { 50 people with 2000 points, 50 people with 4000 points } 怎么办?那么你的标准化分数应该是什么样的?当然,“它可能不会那样”,但您需要先确定所有种输入数据会发生什么,然后才能找到执行转换的算法。如果您想假设输入数据的正态性,只需找到它的均值和方差,然后对其进行缩放 - 但您可能无法得到想要的结果...
  • 积分会随着时间的推移不断积累,甚至是几年。但我希望报告的分数像信用分数一样,始终在 200 到 800 之间。所以基本上,当一个人的分数上升时,他可以导致其他人下降。

标签: c# python algorithm


【解决方案1】:

钟形曲线的重要特性是它描述了正态分布,这是许多自然现象的简单模型。我不确定你打算做什么样的“标准化”,但在我看来,当前分数已经符合正态分布,你只需要确定它的属性(均值和方差)并相应地缩放每个结果。

【讨论】:

  • 就像“曲线评分”场景一样,假设我有 100 名学生,我只想要例如 2 A+、4 A、7 A-、12 B+、18B、24 B-等。 ..(只是为了这篇文章而估计数字..)
  • 好的,假设我确实按照这里的意思和方差:wiki.answers.com/Q/How_to_find_the_variance_of_a_set_of_numbers。现在,如何将其扩展到 200 到 800 的范围?
【解决方案2】:

参考资料: https://en.wikipedia.org/wiki/Grading_on_a_curve https://en.wikipedia.org/wiki/Percentile (另见:高斯函数)

我认为我会尝试的方法是计算平均值(平均值)和标准差(与平均值的平均距离)。然后我会选择适合我的目标范围的参数。具体来说,我会选择输入值的平均值映射到值 500,并且我会选择 6 个标准差占用我目标范围的 99.7%。或者,单个标准差将占据我目标范围的大约 16.6%。

由于您的目标范围是 600(从 200 到 800),因此单个标准差将涵盖 99.7 个单位。因此,获得高于输入平均值一个标准差的输入信用评分的人将获得 599.7 的标准化信用评分。

那么现在:

# mean and standard deviation of the input values has been computed.
for score in input_scores:
  distance_from_mean = score - mean
  distance_from_mean_in_standard_deviations = distance_from_mean / stddev
  target = 500 + distance_from_mean_in_standard_deviations * 99.7
  if target < 200:
    target = 200
  if target > 800:
    target = 800

这不一定会将您的输入分数的中位数映射到 500。这种方法假定您的输入或多或少是正态分布的,并简单地转换平均值并拉伸输入钟形曲线以适应您的范围。对于明显不是钟形曲线形状的输入,这可能会严重扭曲输入曲线。

第二种方法是简单地将您的输入范围映射到我们的输出范围:

for score in input_scores:
  value = (score - 1.0) / (5000 - 1)
  target = value * (800 - 200) + 200

这将保留您输入的形状,但在您的新范围内。

第三种方法是让您的目标范围代表百分位数,而不是尝试代表正态分布。 1% 的人得分在 200 到 205 之间; 1% 的分数在 794 到 800 之间。在这里,您可以对输入分数进行排名,并将排名转换为 200..600 范围内的值。这充分利用了您的目标范围,并提供了易于理解的解释。

【讨论】: