2017-10-22 9 views
1

내 웹 사이트의 사용자에 대한 순위 시스템을 만들고 싶습니다. 순위는 회원이 된 기간, 작성한 게시물 수 등과 같은 여러 요소에 의해 결정됩니다. 모든 데이터 항목 또한 나에 의해 결정되는 "가중치"로 나뉘어져 더 많은 실제 사용자 활동 - 회원 수만큼 1 일 게시물이 중요하지 않습니다. 계량 후 모든 통계가 함께 합산됩니다.대수 눈금을 사용하여 데이터 크기 조정 및 정규화

그런 다음 합계를 정규화하여 1에서 20까지의 순위에 할당해야합니다. 일부 구성원의 활동 점수는 약간이고 일부 베테랑 구성원의 점수는 수천입니다. I 데이터를 정규화하고,이 기능을 갖는 1-20 등급 범위로 다운 스케일링함으로써이를 수행

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

이것은 보통과 같이 호출된다 정규화 (getUserTotal(), 0, getHighestTotalOfAllMembers() 1 , 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 수학 로그 함수를 사용하여 예를 들어, 최종 배열을 통해 매핑 것이다 : 상기에서

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); 

, 나는 log(1 + number)이 경우에도 정확한 방식으로 계산 whichreturns log1p() 기능을 사용 number의 값은 0에 가깝습니다 (http://php.net/manual/en/function.log1p.php 참조). 그런 다음 가독성을 위해 소수점 이하 두 자리로 결과를 반올림합니다. 결과적으로 $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 
    )