2010-12-30 2 views
2

ここでは、私がしようとしていることのやや単純な例です。 クレジットポイントを計算する式がありますが、式に制約がない(たとえば、スコアが1〜5000の場合など)とします。スコアは100人に割り当てられます。ベルカーブガウスアルゴリズム(Pythonおよび/またはC#)

ここで、ベルカーブに基づいて、各人に200と800の間の「正規化」スコアを割り当てる必要があります。例えば、1人の男が5000ポイントを持っていれば、新しいスケールで800ポイントを得るかもしれません。私のポイント範囲の真ん中にいる人は、500近くのスコアを取得します。言い換えれば、500は中央値ですか?

同様の例は、大部分の学生がおそらくCまたはC +を取得するという、「曲線の等級付け」という古いシナリオかもしれません。

私は、ライブラリ、アルゴリズムブック、または参照するWebサイトのいずれかを要求していません....私はおそらくこれをPythonで書いています(しかし、C#も興味深いです)。ベルカーブをグラフ化する必要はありません。私のデータはおそらくデータベースにあり、このスコアを割り当てる百万人もいるかもしれないので、スケーラビリティは問題です。

ありがとうございました。

+0

「ベルカーブに基づいて」 - 入力データが{50人2000ポイント、50人4000ポイント}の場合はどうなりますか?あなたの正規化された得点はどのように見えるでしょうか?確かに「それはおそらくそうではありません」しかし、変換を実行するアルゴリズムを見つける前に、*すべての種類の入力データに何が起こるべきかを決める必要があります。入力データの正規性を仮定したい場合は、その平均と分散を見つけて、それをスケールしますが、あなたが望むものが得られないかもしれません... – AakashM

+0

ポイントは時間とともに、何年にも亘って蓄積し続けます。しかし、私は報告された得点を常に200〜800のクレジットスコアのようにしたいと思っています。だから、基本的に1人の得点が上がると、彼は他の人に下降する可能性があります。 – NealWalters

答えて

4

ベルカーブの重要な特性は、多くの自然現象の単純なモデルである正規分布を表すことです。どのような「正規化」を行うのかよく分かりませんが、現在のスコアは正規分布に準拠しているように見えます。その特性(平均と分散)を決定し、それに応じて各結果をスケールする必要があります。

+0

「曲線の等級付け」のシナリオと同様に、私は100人の生徒がいるとします。私は、例えば2 A +、4 A、7 A-、12 B +、18 B、24 B-などしか望んでいません – NealWalters

+0

ここでは平均と分散を行っているとします:http://wiki.answers.com/Q/How_to_find_the_variance_of_a_set_of_numbers。さて、それを200から800のスケールでどのようにスケールするのですか? – NealWalters

1

参考文献: 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単位になります。したがって、入力平均より1標準偏差の入力クレジットスコアを取得した人は、599.7の正規化されたクレジットスコアを取得します。だから今

:これは必ずしもこのアプローチは、あなたの入力は、多かれ少なかれ正規分布であると仮定し、単に500にご入力のスコアの中央値をマッピングしません

# 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 

平均とストレッチを変換しますあなたの範囲にフィットする入力ベルカーブ。ベルカーブの形状ではない入力に対しては、入力カーブがひどく歪むことがあります。

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

これはあなたの入力の形状を保持しますが、あなたの新しい範囲内:

第2のアプローチは、単に私たちの出力範囲に、あなたの入力範囲をマップすることです。

第3のアプローチは、正規分布を表現するのではなく、目標範囲が百分位数を表すようにすることです。人々の1%が200と205の間でスコアをつけます。 1%は794と800の間のスコアになります。ここで入力スコアをランク付けし、そのランクを200 ... 600の範囲の値に変換します。これはあなたの目標範囲を十分に活用し、解釈を理解しやすくします。

関連する問題