2017-10-22 7 views
1

私のウェブサイト上のユーザーのランク付けシステムを作成したいと思います。ランクは、メンバーの長さ、作成した投稿の数など、さまざまな要因によって決まります。すべてのデータ項目も私が決めた「重み」で割り算されます。実際のユーザー活動 - 私は1つの投稿がメンバーとして1日ほど重要であることは望ましくありません。計量の後、すべての統計値が一緒に加算されます。対数スケールを使用したデータのスケーリングと正規化

次に、いくつかのメンバーが数点の活動しか持たず、何人かのベテランメンバーが何千ものポイントを持っているので、1から20までのランクに割り当てられるように合計を正規化しなければなりません。 Iデータを正規化し、この関数で1-20ランク範囲にそれを縮小することによって、この操作を行います。 ノーマライズ(getUserTotal()、0、getHighestTotalOfAllMembers()、1:

function normalize($userTotal, $minOriginalRange, $maxOriginalRange, $minNewRange, $maxNewRange){ 
    return $minNewRange + ((($maxNewRange - $minNewRange) * ($originalValue - $minOriginalRange))/($maxOriginalRange - $minOriginalRange)); 
} 

これは通常、そのように呼ばれています、20)。

そして私は、結果としてこれを持って、鍵はランクがあり、値はそのランクになるだろうメンバーの数です:

Array 
(
    [1] => 7418 
    [2] => 1918 
    [3] => 289 
    [4] => 102 
    [5] => 62 
    [6] => 28 
    [7] => 21 
    [8] => 14 
    [9] => 1 
    [10] => 8 
    [11] => 6 
    [12] => 5 
    [13] => 1 
    [14] => 1 
    [17] => 1 
    [20] => 1 
) 

を、あなたは低く、非常にランク付けされているユーザーのトンがある見ることができるように中位と上位に割り当てられる人はほとんどいません。私は対数尺度を使って割り当てられたランクを計算することでこれを修正したいので、下位層のランクを上がりやすく、高くなるほど難しくなります。そうすれば、より均等に広がるべきであり、より多くのユーザーは中間にランクを持ちます。

しかし、これに近づく方法はわかりませんが、私は対数尺度を使ったことがなく、常にコード内で単純な算術を使用しています。

答えて

0

あなたは、PHPの数学の対数関数を使用して、例えば、最終的な配列、の上にマッピングします:私はlog(1 + number)も正確である方法で計算whichreturns log1p()機能を使用し、上記で

function logfunction($v){ 
return round(log1p($v),2); 
} 

$simple_array = [7418, 1918, 289, 102, 62, 28, 21, 14, 1, 8, 6, 5, 1, 1, 1]; 
$logarithmic_array = array_map(logfunction, $simple_array); 
print_r($logarithmic_array); 

numberの値はゼロに近い値です(http://php.net/manual/en/function.log1p.php参照)。次に、読みやすさのために小数第2位に丸めます。結果の$logarithmic_array出力は、

Array 
    (
     [0] => 8.91 
     [1] => 7.56 
     [2] => 5.67 
     [3] => 4.63 
     [4] => 4.14 
     [5] => 3.37 
     [6] => 3.09 
     [7] => 2.71 
     [8] => 0.69 
     [9] => 2.2 
     [10] => 1.95 
     [11] => 1.79 
     [12] => 0.69 
     [13] => 0.69 
     [14] => 0.69 
    ) 
です。
関連する問題