Algorytm wyliczający różnice liczb

0

Mam taki problem mam napisany w PHP algorytm wyliczający różnicę w zbiorze liczb czyli jak mamy tablicę liczb -20,20 to dla tego zbioru wyliczy różnicę 400 a dla zbioru 10,10 już będzie 0 i teraz mam napisane dwie funkcje o różnych algorytmach

    public function sortMoodOld($list) {

        $sort = $list;
        if (count($sort) % 2 == 1) {
            $average = array_sum($sort)/count($sort);
            array_push($sort, $average);
        }
        asort($sort);
        $count = count($sort)-1;
        $tmp = 0;
        $tmp2 = 0;

        for ($i=0;$i < count($sort) / 2;$i++) {
            $tmp = $sort[$count] - $sort[$i];

            //}
            $count--;
            if ($tmp < 0) {
                $tmp = -$tmp;
            }
            $tmp2 += $tmp;
        }
        if (count($sort) == 0)  {
            return 0;
        }      
        return ((($tmp2 / count($sort)) * 5));
        
    }
    
    public function sortMood($list) {
        
        $tmp = 0;
        $tmp2 = 0;       
        for ($i=0;$i < count($list)-1;$i++) {
            //if (count($list)-1 == $i) {
                //break;
            //}
            
            //if ($list[$i+1] == 0) {
                //$tmp  =100;
            //}
             
            //else {
           
                $tmp = ((((($list[$i]) ) / 20)  * 100) -  ((($list[$i+1] ) / 20) * 100 ));
            //}
            if ($tmp < 0) {
                $tmp = -$tmp;
            }
            $tmp2 += $tmp;
        }
        return ((($tmp2 / count($list))) );
    }

No i teraz te dwie funkcje działają dobrze tylko mi chodzi o taki algorytm, który będzie wykazywał większą różnicę między liczbą np. 0 i 0.2 niż w liczbie 0.3 0.7. Chodzi mi o to, że jak liczba jest bliższa 0 to ma być wieksza różnica i tego nie wiem jak to zrobić.

7

Nie wiem jak inni ale ja nie rozumiem w ogóle co chcesz osiągnąć. Twoje przykłady też nie są jasne w żadnym stopniu a kod to nawet nie będę komentować z tymi tmp, tmp2 :D
Piszesz o różnicy w zbiorze liczb, ale podajesz jako przykład 10, 10 co zbiorem nie jest, bo zbiór nie ma powtarzających się elementów. Potem mówisz że różnica w zbiorze -20, 20 to 400 to jest dla mnie dość ciekawym wynikiem. No i w ogóle nie wiadomo co dokładnie chcesz dostać jakby liczb było wiecej niż 2.

0

No chodzi o to, że mam tabelę nastrojów i chodzi o to, że np danego dnia miałem wartości nastrojów -20,20 czyli jeden nastrój był bardzo zły a drugi był bardzo dobry a ta funkcja nam wylicza w jaka była hustawka nastrojów a te dwie funkcje działają dobrze, ale według tych dwóch funkcji nastoje o wartościach -0.1 i 0.1 jest mniejsza hustawka niż np. 0.3 i 0.7 czyli im bleżej 0 tym ma być większa róŻnica.

0

Brzmi trochę tak jakbyś chciał obliczyć max(lista) - min(lista), tylko nie wiem czemu tak bardzo chcesz to zrobić na okrętkę :D

0

Sprobuj takiego wzoru:
a - minimum zakresu
b - maksimum zakresu
d - arbitralnie mala liczba, np. 0.001

c1 = max(a, b) - min(a, b)
c2 = d + max(abs(a), abs(b)) - min(abs(a), abs(b))
c = c1 / c2

-20, 20 => 40 / 0.001 = 40000
10, 50 => 40 / 40.001 = ca. 1
-10, 30 => 40 / 20.001 = ca 2
0, 40 => 40 / 40.001 = ca. 1
-5, 35 = 40 / 30.001 = ca 1.33

0

o_o no ale CZEMU ta różnica ma być większa? W jaki sposób chesz to kwalifikować?

ale według tych dwóch funkcji nastoje o wartościach -0.1 i 0.1 jest mniejsza hustawka niż np. 0.3 i 0.7

Bo jest.

czyli im bleżej 0 tym ma być większa róŻnica

No dobra ale w jakim stopniu ta bliskość zera ma potęgować efekt? Jeśli masz np. dane 0, 0.1 oraz 0.2, 10.2 to która ma być "większa"? Pierwsza jest bliżej 0 a druga ma różnicę 100 razy większą. Co wygrywa i czemu?

2

chodzi o to, że różnica między 0.3 a 0.7 ma być mniejsza niż między -0.1 a 0.1, ale już z kolei różnica między 1 a 4 ma być większa niż 0.5 a 1 coś w tym stylu.
Bardziej bym porywał do procentu liczby.

A może MRSE/NMRSE albo odchylenie standardowe?

0

Ja to teraz zrobiłem tak, że zastosowałem ten mój stary algorytm i dodatkowo podzieliłem to przez średnią arytmetyczną.

0
pol90 napisał(a):

Ja to teraz zrobiłem tak, że zastosowałem ten mój stary algorytm i dodatkowo podzieliłem to przez średnią arytmetyczną.

Przecież nawet w jednym z Twoich przykładów średnia wynosi zero :D

0

Opisz dokładnie jak wygląda ta skala jakiej używasz. Skala dotyczy poziomu nastroju tak?
Czy ten współczynnik ma być liczony zawsze z 2 liczb?
Próbujesz tworzyć jakieś wzory a wygląda na to, że nie wiesz co chcesz uzyskać. Tym bardziej nikomu nie uda się zgadnąć jaki wzór użyć.
Wszystko dokładnie opisz i może ktoś wpadnie na pomysł jak Ci pomóc, a może podchodząc do problemu na spokojnie i opisując nam jak krowie na miedzy sam nawet wpadniesz na rozwiązanie.

2

Już wiem gdzie był mój błąd ja miałem odchelenie standardowe napisane po mojemu i nie miałem wywołanej funkcji sqrt

zobaczyłem na tym przykładzie http://forum.php.pl/Obliczanie_sredniej_i_odchylenia_standardowego_t129174.html

1 użytkowników online, w tym zalogowanych: 0, gości: 1