Standaryzuj próbki (Oblicz wynik Z)


14

Biorąc pod uwagę listę liczb zmiennoprzecinkowych, ujednolic ją .

Detale

  • Lista x1,x2,,xn jest standaryzowana, jeśli średnia wszystkich wartości wynosi 0, a odchylenie standardowe wynosi 1. Jednym ze sposobów obliczenia tego jest najpierw obliczenie średniej μ i odchylenia standardowego σ jako
    μ=1ni=1nxiσ=1ni=1n(xiμ)2,
    a następnie obliczeniowej standaryzację zastępując każdyxizxiμσ .
  • Możesz założyć, że dane wejściowe zawierają co najmniej dwa różne wpisy (co oznacza σ0 ).
  • Zauważ, że niektóre implementacje wykorzystują przykładowe odchylenie standardowe, które nie jest równe odchyleniu standardu populacji σ którego tutaj używamy.
  • Istnieje odpowiedź CW na wszystkie trywialne rozwiązania .

Przykłady

[1,2,3] -> [-1.224744871391589,0.0,1.224744871391589]
[1,2] -> [-1,1]
[-3,1,4,1,5] -> [-1.6428571428571428,-0.21428571428571433,0.8571428571428572,-0.21428571428571433,1.2142857142857144]

(Te przykłady zostały wygenerowane za pomocą tego skryptu ).

Odpowiedzi:





4

MATL , 10 bajtów

tYm-t&1Zs/

Wypróbuj online!

Wyjaśnienie

t       % Implicit input
        % Duplicate
Ym      % Mean
-       % Subtract, element-wise
t       % Duplicate
&1Zs    % Standard deviation using normalization by n
/       % Divide, element-wise
        % Implicit display

4

APL + WIN, 41,32 30 bajtów

9 bajtów zapisanych dzięki Erikowi + 2 więcej dzięki ngn

x←v-(+/v)÷⍴v←⎕⋄x÷(+/x×x÷⍴v)*.5

Monituje o wektor liczb i oblicza średnie odchylenie standardowe i znormalizowane elementy wektora wejściowego


Nie możesz przypisać, x←v-(+/v)÷⍴v←⎕a następnie zrobić x÷((+/x*2)÷⍴v)*.5?
Erik the Outgolfer,

Naprawdę mogę. Dzięki.
Graham

czy apl + win robi rozszerzenie singleton ( 1 2 3+,4← → 1 2 3+4)? jeśli tak, możesz przepisać (+/x*2)÷⍴vjako+/x×x÷⍴v
ngn

@ngn To działa na kolejne 2 bajty. Dzięki.
Graham

3

R + pryr, 53 52 bajty

-1 bajt sum(x|1)zamiast zamiast length(x)jak widać w rozwiązaniu @Robert S.

pryr::f((x-(y<-mean(x)))/(sum((x-y)^2)/sum(x|1))^.5)

Będąc językiem zbudowanym dla statystyk, dziwi mnie to, że nie ma ono wbudowanej funkcji. Przynajmniej nie taki, który mogłem znaleźć. Nawet funkcja mosaic::zscorenie daje oczekiwanych rezultatów. Jest to prawdopodobnie spowodowane użyciem standardowego odchylenia populacji zamiast odchylenia standardowego próbki.

Wypróbuj online!


2
Możesz zmienić <-na a, =aby zapisać 1 bajt.
Robert S.

@ J.Doe nope, użyłem metody, którą skomentowałem rozwiązanie Roberta S. scalejest schludne!
Giuseppe,

2
@ J.Doe, ponieważ używasz go tylko nraz, gdy możesz użyć go bezpośrednio dla 38 bajtów
Giuseppe,

2
@RobertS. tutaj, na PPCG, zachęcamy do umożliwienia elastycznego wejścia i wyjścia, w tym generowania więcej niż jest to wymagane, z wyjątkiem wyzwań, w których dokładny układ wyników jest sednem wyzwania.
ngm

6
Oczywiście wbudowane R nie używałyby „wariancji populacji”. Tylko zdezorientowani inżynierowie używaliby czegoś takiego (tutaj odpowiedzi na Python i Matlab;))
ngm


2

Galaretka , 10 bajtów

_ÆmµL½÷ÆḊ×

Wypróbuj online!

Nie jest krótszy, ale funkcja determinująca Jelly ÆḊoblicza również normę wektorową.

_Æm             x - mean(x)
   µ            then:
    L½          Square root of the Length
      ÷ÆḊ       divided by the norm
         ×      Multiply by that value

Hej, fajna alternatywa! Niestety nie widzę sposobu na jego skrócenie.
Erik the Outgolfer,

2

Mathematica, 25 bajtów

Mean[(a=#-Mean@#)a]^-.5a&

Czysta funkcja. Pobiera dane liczbowe jako dane wejściowe i zwraca listę liczb dokładności maszynowych jako dane wyjściowe. Zauważ, że wbudowana Standardizefunkcja domyślnie używa wariancji próbki.


2

J , 22 bajty

-1 bajt dzięki kwakowi Krowy!

(-%[:%:1#.-*-%#@[)+/%#

Wypróbuj online!

J , 31 23 bajtów

(-%[:%:#@[%~1#.-*-)+/%#

Wypróbuj online!

                   +/%# - mean (sum (+/) divided (%) by the number of samples (#)) 
(                 )     - the list is a left argument here (we have a hook)
                 -      - the difference between each sample and the mean
                *       - multiplied by 
               -        - the difference between each sample and the mean
            1#.         - sum by base-1 conversion
          %~            - divided by
       #@[              - the length of the samples list
     %:                 - square root
   [:                   - convert to a fork (function composition) 
 -                      - subtract the mean from each sample
  %                     - and divide it by sigma

1
Zmiana [:(%[:%:1#.*:%#)]-+/%# układu daje 22 tio.run/##y/qfVmyrp2CgYKVg8D/… , myślę, że jedną z tych czapek można usunąć, ale jak dotąd nie miałem szczęścia, EDYCJA: bardziej bezpośrednie wygaszanie jest (-%[:%:1#.-*-%#@[)+/%#również na 22
użytkownik41805

@Cows quack Thanks!
Galen Iwanow,

2

APL (Dyalog Unicode) , 33 29 bajtów

{d÷.5*⍨l÷⍨+/×⍨d←⍵-(+/⍵)÷l←≢⍵}

-4 bajty dzięki @ngn

Wypróbuj online!


możesz przypisać ⍵-mdo zmiennej i usunąć w m←następujący sposób:{d÷.5*⍨l÷⍨+/×⍨d←⍵-(+/⍵)÷l←≢⍵}
ngn

@ngn Ah, fajnie, dziękuję, jakoś nie widziałem tego powielania
Quintec

2

Haskell, 80 75 68 bajtów

t x=k(/sqrt(f$sum$k(^2)))where k g=g.(-f(sum x)+)<$>x;f=(/sum(1<$x))

Dzięki @flawr za sugestie do użycia sum(1<$x)zamiastsum[1|_<-x] i aby wstawić średnią, @xnor za wprowadzenie odchylenia standardowego i innych redukcji.

Rozszerzony:

-- Standardize a list of values of any floating-point type.
standardize :: Floating a => [a] -> [a]
standardize input = eachLessMean (/ sqrt (overLength (sum (eachLessMean (^2)))))
  where

    -- Map a function over each element of the input, less the mean.
    eachLessMean f = map (f . subtract (overLength (sum input))) input

    -- Divide a value by the length of the input.
    overLength n = n / sum (map (const 1) input)

1
Można wymienić [1|_<-x]z (1<$x)zaoszczędzić kilka bajtów. To świetny sposób na uniknięcie tego fromIntegral, czego do tej pory nie widziałem!
flawr

Przy okazji: lubię używać tryitonline , możesz uruchomić tam swój kod, a następnie skopiować wstępnie sformatowaną odpowiedź do opublikowania tutaj!
flawr


Możesz napisać (-x+)dla, (+(-x))aby uniknąć parens. Wygląda frównież na bezcelowy: f=(/sum(1<$x))i smożna go zastąpić jego definicją.
xnor

@xnor Ooh, (-x+)jest przydatny, jestem pewien, że użyję tego w przyszłości
Jon Purdy

2

MathGolf , 7 bajtów

▓-_²▓√/

Wypróbuj online!

Wyjaśnienie

Jest to dosłownie odtwarzanie bajt po bajcie odpowiedzi 05AB1E Kevina Cruijssena, ale oszczędzam kilka bajtów od MathGolf, który ma 1 bajt na wszystko, co jest potrzebne do tego wyzwania. Moim zdaniem odpowiedź również wygląda całkiem dobrze!

▓         get average of list
 -        pop a, b : push(a-b)
  _       duplicate TOS
   ²      pop a : push(a*a)
    ▓     get average of list
     √    pop a : push(sqrt(a)), split string to list
      /   pop a, b : push(a/b), split strings

1

JavaScript (ES7),  80  79 bajtów

a=>a.map(x=>(x-g(a))/g(a.map(x=>(x-m)**2))**.5,g=a=>m=eval(a.join`+`)/a.length)

Wypróbuj online!

Skomentował

a =>                      // given the input array a[]
  a.map(x =>              // for each value x in a[]:
    (x - g(a)) /          //   compute (x - mean(a)) divided by
    g(                    //   the standard deviation:
      a.map(x =>          //     for each value x in a[]:
        (x - m) ** 2      //       compute (x - mean(a))²
      )                   //     compute the mean of this array
    ) ** .5,              //   and take the square root
    g = a =>              //   g = helper function taking an array a[],
      m = eval(a.join`+`) //     computing the mean
          / a.length      //     and storing the result in m
  )                       // end of outer map()


1

Haskell , 59 bajtów

(%)i=sum.map(^i)
f l=[(0%l*y-1%l)/sqrt(2%l*0%l-1%l^2)|y<-l]

Wypróbuj online!

Nie korzysta z bibliotek.

Funkcja pomocnicza %oblicza sumę imocy listy, co pozwala uzyskać trzy przydatne wartości.

  • 0%ljest długością l(nazwij to n)
  • 1%ljest sumą l(nazwij tos )
  • 2%ljest sumą kwadratów l(nazwij to m)

Możemy wyrazić wynik Z elementu yjako

(n*y-s)/sqrt(n*v-s^2)

(To wyrażenie zostało (y-s/n)/sqrt(v/n-(s/n)^2)nieco uproszczone poprzez pomnożenie góry i dołu przez n).

Możemy wstawić wyrażeń 0%l, 1%l, 2%lbez parens ponieważ %definiujemy ma wyższy priorytet niż arytmetycznych operatorów.

(%)i=sum.map(^i)ma taką samą długość jak i%l=sum.map(^i)l. Zwiększenie bezcelowości nie pomaga. Zdefiniowanie go jak g i=...utratę bajtów, gdy go nazwiemy. Chociaż %działa na dowolnej liście, ale wywołujemy ją tylko z listą problemów, nie wywołuje to utraty bajtu w wywoływaniu jej za pomocą argumentu za lkażdym razem, ponieważ wywołanie z dwoma argumentami i%lnie jest dłuższe niż z jednym argumentem g i.


Mamy L.ZAT.miXtutaj :)
flawr

Naprawdę podoba mi się ten %pomysł! Wygląda jak dyskretna wersja momentów statystycznych .
flawr

1

K (oK) , 33 23 bajtów

-10 bajtów dzięki ngn!

{t%%(+/t*t:x-/x%#x)%#x}

Wypróbuj online!

Pierwsza próba kodowania (nie odważę się nazywać go „golfem”) w K. Jestem całkiem pewien, że da się to zrobić znacznie lepiej (tutaj zbyt wiele nazw zmiennych ...)


1
ładny! można zastąpić początkowy (x-m)z t( tio )
NGN

1
wewnętrzna { }jest niepotrzebna - jej domyślna nazwa parametru to xi została przekazana xjako argument ( tio )
ngn

1
kolejny -1 bajt, zastępując x-+/xgo x-/x. lewy argument -/służy jako wartość początkowa redukcji ( tio )
ngn

@ngn Dziękujemy! Teraz widzę, że pierwsze 2 golfa są oczywiste; ostatni jest poza moim obecnym poziomem :)
Galen Iwanow


1

TI-Basic (seria 83), 14 11 bajtów

Ans-mean(Ans
Ans/√(mean(Ans²

Wprowadza dane wejściowe Ans . Na przykład, jeśli wpiszesz powyższe w prgmSTANDARD, wtedy {1,2,3}:prgmSTANDARDwróci {-1.224744871,0.0,1.224744871}.

Wcześniej próbowałem użyć 1-Var Statspolecenia, które przechowuje odchylenie standardowe populacji σx, ale obliczenie go ręcznie jest mniej trudne.


1

05AB1E , 9 bajtów

ÅA-DnÅAt/

Port @Arnauld JavaScript odpowiedź „s , więc upewnij się, aby go upvote!

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

ÅA          # Calculate the mean of the (implicit) input
            #  i.e. [-3,1,4,1,5] → 1.6
  -         # Subtract it from each value in the (implicit) input
            #  i.e. [-3,1,4,1,5] and 1.6 → [-4.6,-0.6,2.4,-0.6,3.4]
   D        # Duplicate that list
    n       # Take the square of each
            #  i.e. [-4.6,-0.6,2.4,-0.6,3.4] → [21.16,0.36,5.76,0.36,11.56]
     ÅA     # Pop and calculate the mean of that list
            #  i.e. [21.16,0.36,5.76,0.36,11.56] → 7.84
       t    # Take the square-root of that
            #  i.e. 7.84 → 2.8
        /   # And divide each value in the duplicated list with it (and output implicitly)
            #  i.e. [-4.6,-0.6,2.4,-0.6,3.4] and 2.8 → [-1.6428571428571428,
            #   -0.21428571428571433,0.8571428571428572,-0.21428571428571433,1.2142857142857144]


0

Pyth, 21 19 bajtów

mc-dJ.OQ@.Om^-Jk2Q2

Wypróbuj online tutaj .

mc-dJ.OQ@.Om^-Jk2Q2Q   Implicit: Q=eval(input())
                       Trailing Q inferred
    J.OQ               Take the average of Q, store the result in J
           m     Q     Map the elements of Q, as k, using:
             -Jk         Difference between J and k
            ^   2        Square it
         .O            Find the average of the result of the map
        @         2    Square root it
                       - this is the standard deviation of Q
m                  Q   Map elements of Q, as d, using:
  -dJ                    d - J
 c                       Float division by the standard deviation
                       Implicit print result of map

Edycja: po zobaczeniu odpowiedzi Kevina zmieniono, aby użyć średniego wbudowanego dla wewnętrznych wyników. Poprzednia odpowiedź:mc-dJ.OQ@csm^-Jk2QlQ2


0

SNOBOL4 (CSNOBOL4) , 229 bajtów

	DEFINE('Z(A)')
Z	X =X + 1
	M =M + A<X>	:S(Z)
	N =X - 1.
	M =M / N
D	X =GT(X) X - 1	:F(S)
	A<X> =A<X> - M	:(D)
S	X =LT(X,N) X + 1	:F(Y)
	S =S + A<X> ^ 2 / N	:(S)
Y	S =S ^ 0.5
N	A<X> =A<X> / S
	X =GT(X) X - 1	:S(N)
	Z =A	:(RETURN)

Wypróbuj online!

Link jest do funkcjonalnej wersji kodu, który konstruuje tablicę ze STDIN, biorąc pod uwagę jego długość, a następnie jego elementy, a następnie uruchamia funkcję Z i wreszcie drukuje wartości.

Definiuje funkcję Z która zwraca tablicę.

1.Na linii 4 należy wykonać prawidłowo arytmetyki zmiennoprzecinkowej.



0

Węgiel , 25 19 bajtów

≧⁻∕ΣθLθθI∕θ₂∕ΣXθ²Lθ

Wypróbuj online! Link jest do pełnej wersji kodu. Wyjaśnienie:

       θ    Input array
≧           Update each element
 ⁻          Subtract
   Σ        Sum of
    θ       Input array
  ∕         Divided by
     L      Length of
      θ     Input array

Oblicz μ i wektoryzuj odejmij to od każdego xja.

  θ         Updated array
 ∕          Vectorised divided by
   ₂        Square root of
     Σ      Sum of
       θ    Updated array
      X     Vectorised to power
        ²   Literal 2
    ∕       Divided by
         L  Length of
          θ Array
I           Cast to string
            Implicitly print each element on its own line.

Oblicz σ, podzielone na wektory xja przez to i wypisz wynik.

Edycja: Zapisano 6 bajtów dzięki @ ASCII-tylko dla a) użycia SquareRoot()zamiast Power(0.5)b) naprawiania wektoryzacji Divide()( IntDivide()zamiast tego) c) tworzenia Power()wektoryzacji.


przekreślony 25 = brak bajtów? : P (Również nie zaktualizowałeś jeszcze linku TIO)
tylko ASCII,

@ Tylko ASCII Ups, dzięki!
Neil,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.