Statistiche false


27

Se hai intenzione di inventare alcune notizie false, ti consigliamo di fabbricare alcuni dati per eseguirne il backup. Devi già avere alcune conclusioni preconcette e vuoi alcune statistiche per rafforzare l'argomento della tua logica difettosa. Questa sfida dovrebbe aiutarti!

Dati tre numeri di input:

  • N - numero di punti dati
  • μ - media dei punti dati
  • σ - deviazione standard dei punti dati, dove μ e σ sono dati da:

    inserisci qui la descrizione dell'immagine

Emette un elenco di numeri non ordinati, 𝑥 i , che genererebbe N , μ e σ dati .

Non sarò troppo esigente riguardo ai formati I / O, ma mi aspetto una sorta di decimali per μ , σ e i punti dei dati di output. Come minimo, dovrebbero essere supportate almeno 3 cifre significative e magnitudo di almeno 1.000.000. I galleggianti IEEE vanno bene.

  • N sarà sempre un numero intero, dove 1 ≤ N ≤ 1.000
  • μ può essere qualsiasi numero reale
  • σ sarà sempre ≥ 0
  • i punti dati possono essere qualsiasi numero reale
  • se N è 1, allora σ sarà sempre 0.

Si noti che la maggior parte degli ingressi avrà molte possibili uscite. Devi solo fornire un output valido. L'output può essere deterministico o non deterministico.

Esempi

Input (N, μ, σ) -> Possible Output [list]

2, 0.5, 1.5 -> [1, 2]
5, 3, 1.414 -> [1, 2, 3, 4, 5]
3, 5, 2.160 -> [2, 6, 7]
3, 5, 2.160 -> [8, 4, 3]
1, 0, 0 -> [0]

6
Avremmo dovuto aggiungere un input di verità / falsità per il valore p, quindi avremmo dovuto fare dati sia correlati che non correlati a fake-backup o fake-disprove ahaha.
Magic Octopus Urn

1
Cosa significa +vee cosa -vesignifica?
CG.

@ChelseaG. Abbreviazioni per positivo e negativo . Ho modificato per chiarire.
Trauma digitale

Quando N = 1, σ sarà sempre 0 per renderlo possibile?
xnor

1
Davvero noi pedanti dovremmo usare la deviazione standard del campione corretta e non implementare per input con N = 1.
Jonathan Allan,

Risposte:


8

Pyth , 44 35 34 byte

? eA.DhQ2 + eQ * G, -eQJ * E @ hc1thQ2 + eQJ * G, -eQKE + eQK 
.N? eA.DN2+T*G+LT_B*Y@hc1tN2*G+LT_BY
.N? EA.DN2+T*G+LT_B*Y@cNtN2*G+LT_BY

Provalo online! (Il codice sopra definisce una funzione. :.*Viene aggiunto al collegamento per richiamare la funzione.)

La matematica

Questo costruisce i dati simmetricamente. Se Nè pari, i dati sono solo il valore medio più o meno la deviazione standard. Tuttavia, se Nè dispari, allora abbiamo appena aperto una lattina di worm, poiché la media deve essere presente affinché i dati siano simmetrici e quindi le fluttuazioni devono essere moltiplicate per un certo fattore.

Se nè pari

  • La metà dei dati lo sono μ+σ.
  • La metà dei dati lo sono μ-σ.

Se nè dispari

  • Un dato è μ.
  • Meno della metà dei dati lo sono μ+σ*sqrt(n/(n-1)).
  • Meno della metà dei dati lo sono μ-σ*sqrt(n/(n-1)).

6

MATL , 22 byte

Grazie a @DigitalTrauma per una correzione.

:t&1Zs/tYm-*+tZN?3G9L(

Ordine di ingresso è: N, σ, μ.

Provalo online!

Oppure vedi una versione modificata che calcola anche la deviazione media e standard dei dati prodotti, come un controllo.

Spiegazione

Il codice è diviso in quattro parti:

  1. :genera l'array [1 2 ... N]dove Nviene preso come input implicito.

  2. t&1Zs/divide quei numeri per la loro deviazione standard empirica (calcolata normalizzando per N) e tYm-sottrae la media empirica dei valori risultanti. Ciò garantisce che i risultati abbiano una media 0empirica e una deviazione standard empirica 1.

  3. *si moltiplica per σe +aggiunge μ, entrambi presi come input impliciti.

  4. tZN?x3Ggestisce il caso particolare che N = 1, σ = 0per la quale l'uscita dovrebbe essere μ. Se questo è davvero il caso, allora la deviazione standard empirica calcolata nel secondo passaggio è stata 0, la divisione ha dato infe moltiplicato per σnel terzo passaggio ha dato NaN. Quindi il codice fa ciò: se l'array ottenuto è costituito da tutti i NaNvalori (code tZN?), eliminalo ( x) e invia il terzo input ( 3G), che è μ.


4

Python , 50 byte

lambda n,m,s:[m+s*(n-1)**.5]+[m-s/(n-1%n)**.5]*~-n

Provalo online!

Utilizza la seguente ndistribuzione di elementi con media 0e sdev 1:

  • Con probabilità 1/n(cioè 1elemento), output(n-1)**0.5
  • Con probabilità 1-1/n(cioè n-1elementi), output-(n-1)**(-0.5)

Questo è ridimensionato per significare me sdev strasformando x->m+s*x. Fastidiosamente, n=1dà una divisione per zero per un valore inutile, così abbiamo hack via facendo /(n-1%n)**.5, con 1%ndando 0per n==1e 1altrimenti.

Potresti pensare che (n-1)**.5può essere abbreviato ~-n**.5, ma l'espiazione avviene per prima.

A defè un byte più lungo.

def f(n,m,s):a=(n-1%n)**.5;print[m+s*a]+[m-s/a]*~-n

3

R, 83 62 53 byte

function(n,m,s)`if`(n>1,scale(1:n)*s*sqrt(1-1/n)+m,m)

Se n=1, quindi restituisce m(poiché scaleritornerebbe NA), altrimenti ridimensiona i dati [1,...,n]in modo che abbiano la media 0 e (campione) la deviazione standard 1, quindi si moltiplica s*sqrt(1-1/n)per ottenere la deviazione standard corretta della popolazione e aggiunge il mpassaggio alla media appropriata. Grazie a Dason per avermi fatto conoscere la funzione di ridimensionamento e aver eliminato quei byte!

Provalo online!


Puoi aggiungere alcuni test in Provalo online in modo che la tua risposta possa essere facilmente verificata?
Trauma digitale

Sì! dammi due minuti.
Giuseppe,

Probabilmente potrebbe semplicemente utilizzare 1:ninvece di rt(n,n)salvare 4 byte. E la scalefunzione potrebbe probabilmente essere utile.
Dason,

@Dason - grazie! Ho imparato scalequale è fantastico.
Giuseppe,

1

Gelatina , 20 byte

÷_Ḃ$©$*.;N$ṁ®;0ṁ⁸×⁵+

Provalo online!

Programma completo che accetta tre argomenti della riga di comando: n , μ , σ .

Come?

Crea valori floor (n / 2) equidistanti dalla media e un valore nella media se n è dispari in modo che la deviazione standard sia corretta ...

÷_Ḃ$©$*.;N$ṁ®;0ṁ⁸×⁵+ - Main link: n, μ (σ expected as third input, the 5th command argument)
   $                 - last two links as a monad:
 _                   -   n minus:
  Ḃ                  -     n mod 2            i.e. n-1 if n is odd, n if n is even
    ©                - copy value to register
÷                    - n divided by that
       .             - literal 0.5
      *              - exponentiate = (n / (n - (n mod 2))) ^ 0.5
                     -        i.e. 1 if n is even; or (n/(n-1))^0.5 if n is odd
         $           - last two links as a monad:
        N            -   negate
       ;             -   concatenate   i.e. [1,-1] or [(n/(n-1))^0.5,-(n/(n-1))^0.5]
            ®        - recall value from register
           ṁ         - mould the list like something of that length
             ;0      - concatenate a zero
                ⁸    - link's left argument, n
               ṁ     - mould the list like something of length n (removes the zero for even n)
                  ⁵  - fifth command argument, third program argument (σ)
                 ×   - multiply (vectorises)
                   + - add μ (vectorises)
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.