Обчисліть стандартне відхилення


19

Виклик

Давши список чисел, обчисліть стандартне відхилення населення від списку.

Використовуйте наступне рівняння для обчислення стандартного відхилення населення:

Вхідні дані

На вході з'явиться список цілих чисел у будь-якому форматі (список, рядок тощо). Деякі приклади:

56,54,89,87
67,54,86,67

Числа завжди будуть цілими числами.

Вхід буде в STDIN або аргументи функції.

Вихідні дані

Вихід повинен бути числом з плаваючою комою.

Правила

Ви можете використовувати вбудовані функції, щоб знайти стандартне відхилення.

Ваша відповідь може бути як повноцінною програмою, так і функцією.

Приклади

10035, 436844, 42463, 44774 => 175656.78441352615

45,67,32,98,11,3 => 32.530327730015607

1,1,1,1,1,1 => 0.0

Перемога

Виграє найкоротша програма або функція.

Таблиця лідерів


1
Ви маєте на увазі, що вихід повинен бути плаваючою точкою АБО цілим числом?
Мутадор

3
Я думаю, що більшість вбудованих функцій стандартного відхилення обчислює вибіркове стандартне відхилення.
Мутадор

Що робити, якщо список введення недійсний? 175656.78441352615 результат для мене 175656.78441352614
RosLuP

@RosLuP Вам не доведеться турбуватися про це
Beta Decay

1
@ a13a22 Відповідно до стандартних правил PPCG, ви можете взяти вклад через аргументи функції
Beta Decay

Відповіді:


18

Кліп , 3

.sk

.s- це стандартне відхилення, kаналізує вхід у формі {1,2,3}.


Яка формула використовується для стандартного відхилення? Я не міг знайти його в посиланнях.
недолік

@flawr Це ця діаграма , внизу.
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Я це бачив, але формули не надано.
flawr

@flawr О, бачу. Можливо, тоді залежить від перекладача, якщо така річ існує.
Conor O'Brien

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Я знайшов це тут, на лінії 493, здається, це нормально!
flawr

11

Математика, 24 22 байти

Приємно, що у Mathematica є вбудований StandardDevi...о ... який обчислює вибіркове стандартне відхилення, а не стандартне відхилення сукупності.

Але що робити, якщо ми скористаємося Variance... о ... така ж угода.

Але є ще одна пов'язана вбудована версія:

CentralMoment[#,2]^.5&

Так. :)

Це також працює для 22 байтів:

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

І це за 27:

N@RootMeanSquare[#-Mean@#]&

10

Октава, 14 байт

g=@(a)std(a,1)

Спробуйте це на ideone .


2
Ви можете зберегти два байти, видаливши, g=оскільки функція-ручка не потребує імені для дійсного подання.
Олексій А.

10

kdb + , 3 байти

dev

Один з дервіатів APL повинен був мати це як вбудований.

Тестовий запуск

q)dev 56, 54, 89, 87
16.53028
q)f:dev
q)f 10035, 436844, 42463, 44774
175656.8
q)f 45,67,32,98,11,3
32.53033

8

Діялог APL, 24 23 21 20 19 17 байт

*∘.5∘M×⍨-M×M←+/÷≢

Це визначає неназваний монадичний функціональний потяг, який еквівалентний наступній функції.

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

Спробуйте їх в Інтернеті на TryAPL .

Як це працює

Код складається з декількох поїздів.

M←+/÷≢

Це визначає монадичний 3-поїзд (вилка), Mякий виконує +/(сума всіх елементів) і (довжина) для правильного аргументу, а потім застосовує ÷(ділення) до результатів, повертаючи середнє арифметичне вводу.

M×M

Це ще одна вилка, яка застосовується Mдо правильного аргументу, повторює це вдруге і застосовує ×(продукт) до результатів, повертаючи μ 2 .

×⍨-(M×M)

Це ще одна вилка, яка обчислює квадрат середнього арифметичного, як було пояснено раніше, застосовується ×⍨(продукт із самим собою) до правильного аргументу і, нарешті, застосовується -(різниця) до результатів.

Для введення (x 1 ,…, x N ) ця функція повертається (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Тоді ця складена функція застосовується Mдо її правильного аргументу *∘.5. Останній використовує правильний аргумент currying, щоб застосувати введення карти aдо a*0.5(квадратний корінь a).

(*∘.5∘M)(×⍨-(M×M))

Нарешті, у нас є цей монадичний 2-поїзд (вгорі), який застосовує спочатку праву функцію, а потім ліву до її результату, обчислюючи стандартне відхилення наступним чином.

формула


5

R, 41 40 39 36 30 28 байт

код

Завдяки мензурку , Alex A. і MickyT для набагато байт.

cat(sd(c(v=scan(),mean(v))))   

старі коди

v=scan();n=length(v);sd(v)/(n/(n-1))**0.5
m=scan();cat(sqrt(sum(mean((m-mean(m))^2))))
m=scan();cat(mean((m-mean(m))^2)^.5) 

Це повинно дати стандартне відхилення населення.


1
Я не знаю R, але чи можна було б доповнити вхідний масив середнім значенням масиву? Здається, що може бути коротше.
стакан

1
На цьому веб-сайті ми, як правило, не можемо припустити оточення REPL, якщо це прямо не дозволить питання. Таким чином, у цьому випадку вам потрібно буде використовувати catдля друку на консолі.
Олексій А.

1
Також R використовує ^для експоненції, що на байт коротше, ніж **.
Олексій А.

1
Вам не потрібно підсумовувати середнє значення, оскільки meanповертає скаляр; sumне має ефекту. 36 байт:x=scan();cat(mean((x-mean(x))^2)^.5)
Олексій А.

1
@ AndréMuta вибачте, коли я тестував його, у мене висів X.
MickyT

5

Pyth, 20 19 17 13 байт

@.O^R2-R.OQQ2

Дякуємо @FryAmTheEggman за те, що виграли 4 байти!

Спробуйте в Інтернеті.

Як це працює

        .OQ    Compute the arithmetic mean of the input (Q).
      -R   Q   Subtract the arithmetic mean of all elements of Q.
   ^R2         Square each resulting difference.
 .O            Compute the arithmetic mean of the squared differences.
@           2  Apply square root.

Мені подобається, як розкладання програми Pyth виглядає як перекошена парабола.
Conor O'Brien

5

CJam, 24 22 21 байт

q~_,_@_:+d@/f-:mh\mq/

Дякуємо @aditsu за те, що виграли 1 байт!

Спробуйте його в Інтернеті в інтерпретаторі CJam .

Як це працює

q~                    e# Read all input and evaluate it.
  _,                  e# Copy the array and push its length.
    _@                e# Copy the length and rotate the array on top.
      _:+d            e# Copy the array and compute its sum. Cast to Double.
          @/          e# Rotate the length on top and divide the sum by it.
            f-        e# Subtract the result (μ) from the array's elements.
              :mh     e# Reduce by hypotenuse.
                      e# a b mh -> sqrt(a^2 + b^2)
                      e# sqrt(a^2 + b^2) c mh -> sqrt(sqrt(a^2 + b^2)^2 + c^2)
                      e#                           = sqrt(a^2 + b^2 + c^2)
                      e# ⋮
                 \mq/ e# Divide the result by the square root of the length.

Я думаю, ви можете перетворити лише довжину в подвійний
aditsu

@aditsu Звичайно. Спасибі!
Денніс

5
:mhis genius btw :)
aditsu

2
Reduce by hypotenuse.це не те, що ви бачите щодня.
lirtosiast

4

APL, 24 байти

{.5*⍨+/(2*⍨⍵-+/⍵÷≢⍵)÷≢⍵}

Трохи інший підхід, ніж рішення Dennis 'Dyalog APL . Це має працювати з будь-якою реалізацією APL.

Це створює неназвану монадічну функцію, яка обчислює вектор ( x - µ ) 2 як 2*⍨⍵-+/⍵÷≢⍵, ділить це на N ( ÷≢⍵), приймає суму цього вектора за допомогою +/, а потім бере квадратний корінь ( .5*⍨).

Спробуйте в Інтернеті


Не кожна реалізація APL підтримує {dfns }, або . Однак кожна версія підтримуєR←F Y R←(+/((Y-+/Y÷⍴Y)*2)÷⍴Y)*.5
Adám

4

Юлія, 26 19 байт

x->std([x;mean(x)])

Це створює неназвану функцію, яка приймає масив і повертає поплавок.

Я вважаю, що без волі

function f(x::Array{Int,1})
    # Return the sample standard deviation (denominator N-1) of
    # the input with the mean of the input appended to the end.
    # This corrects the denominator to N without affecting the
    # mean.
    std([x; mean(x)])
end

4

TI-BASIC, 7 байт

stdDev(augment(Ans,{mean(Ans

Я запозичив алгоритм , щоб отримати стандартне відхилення від зразка стандартного відхилення від тут .

Найкоротше рішення, яке я міг знайти, augment(- це 9 байт:

stdDev(Ans√(1-1/dim(Ans

Я погоджуюся з АндреМутою, це не дає необхідного результату, дивіться тут.
flawr

1
@ AndréMuta @flawr вбудований TI stdDev(обчислює вибірковий SD; stdDev(augment(Ans,{mean(Ansобчислює населення SD. Це на сторінці, на яку ви пов’язані.
lirtosiast

3

Haskell, 61 байт

d n=1/sum(n>>[1])
f a=sqrt$d a*sum(map((^2).(-)(d a*sum a))a)

Безпосередньо, за винятком моєї спеціальної функції довжини, sum(n>>[1])щоб виманити систему суворого типу Haskell.


Можна використовувати sum(1<$n)і <$>для map.
Лайконі

Мені просто прийшло в голову, що ці функції можуть бути відсутніми через старішу версію GHC під час цієї відповіді, але згідно з цією підказкою вони були внесені в березень 2015 року, і політика щодо сайту все-таки змінилася, щоб дозволити нову мову особливості.
Laikoni

3

Python 3.4+, 30 байт

from statistics import*;pstdev

Імпортує вбудовану функцію pstdev, наприклад

>>> pstdev([56,54,89,87])
16.53027525481654

Я думаю, що pstdevпісля першого рядка все в порядку? Я вважаю, що xnor зробив це деякий час тому sum. Це має сенс wrt, як будуть використовуватися анонімні лямбда, тобто, p=pstdevабоmap(pstdev, [...])
FryAmTheEggman

Я збирався сказати те саме. Мета публікації, здається, підтримують просто поставлення функції буквально.
xnor

Я думаю, вам все-таки потрібно писати буквальне, pstdevхоча from statistics import*;pstdev. В іншому випадку це може бути будь-яка функція з цієї бібліотеки.
xnor

@xnor Відредаговано. tbh Я не дуже впевнений у вирішенні цих ситуацій ...
Sp3000

Може бути, мета-питання було б корисним? :)
бета-розпад

2

JavaScript (ES6), 73 байти

a=>Math.sqrt(a.reduce((b,c)=>b+(d=c-eval(a.join`+`)/(l=a.length))*d,0)/l)

@BetaDecay Щодо точності виходу? У моєму оригіналі насправді не було цього правильного, і я це виправив відразу після того, як тільки виявити плаваючу крапку було нормально хе-хе ... Так добре, як зараз?
Mwr247

Так, це добре :)
бета-розпад

7
Psst ... ви можете поголити 5 байт, скориставшись цим методом підсумовування eval(a.join`+`)замість a.reduce((e,f)=>e+f)
Джордж Рейт

@GeorgeReith Приємний трюк! Мені доведеться запам'ятати це на потім ...
Mwr247

2

Желе , не конкуруючий

11 байт Ця відповідь є неконкурентоспроможною, оскільки вона використовує мову, яка подає виклик.

S÷L
Dz_²ÇN½

Це прямий переклад моєї відповіді APL на Jelly. Спробуйте в Інтернеті!

Як це працює

S÷L        Helper link. Argument: z (vector)

S          Compute the sum of z.
  L        Compute the length of z.
 ÷         Divide the former by the latter.
           This computes the mean of z.

Dz_²ÇN½    Main link. Argument: z (vector)

Ç          Apply the previous link, i.e., compute the mean of z.
 ²         Square the mean.
   ²       Square all number in z.
  _        Subtract each squared number from the squared mean.
    Ç      Take the mean of the resulting vector.
     N     Multiply it by -1.
      ½    Take the square root of the result.

2

J, 18 байт

[:%:@M*:-M*M=:+/%#

Це прямий переклад моєї відповіді APL на Дж.

Спробуйте в Інтернеті!


Я не мав уявлення, що Mце заздалегідь вбудований.
Conor O'Brien

Це не так. M=:+/%#- це вбудоване визначення функції.
Денніс

Але це заздалегідь визначено, правда? Можливо, вбудований неправильний термін
Conor O'Brien

Ні, це не визначено. M=:+/%#зберігає дієслово +/%#в M, а потім називає його.
Денніс

Мені шкода XD, що я не побачив останньої частини
Conor O'Brien

1

Симплекс v.0.5 , 43 байти

Просто тому. Мені справді потрібно ще один байт.

t[@u@RvR]lR1RD@wA@T@{j@@SR2ERpR}u@vR@TR1UEo   
t[      ]                                     ~~ Applies inner function to entire strip (left-to-right)
  @                                           ~~ Copies current value to register
   u                                          ~~ Goes up a strip level
    @                                         ~~ Dumps the register on the current byte
     R                                        ~~ Proceeds right (s1)
      v                                       ~~ Goes back down
       R                                      ~~ Proceeds right (s0)
                                              ~~ Go right until an empty byte is found
         lR1RD                                ~~ Push length, 1, and divide.
              @                               ~~ Store result in register (1/N)
               wA                             ~~ Applies A (add) to each byte, (right-to-left)
                 @T@                          ~~ Puts 1/N down, multiplies it, and copies it to the register
                    {          }              ~~ Repeats until a zero-byte is met
                     j@@                      ~~ inserts a new byte and places register on it
                        SR                    ~~ Subtract it from the current byte and moves right
                          2E                  ~~ Squares result
                            RpR               ~~ Moves to the recently-created cell, deletes it, and continues
                                u@v           ~~ takes 1/N again into register
                                   R@T        ~~ multiplies it by the new sum
                                      R1UE    ~~ takes the square root of previous
                                          o   ~~ output as number

1

Пролог (SWI), 119 байт

Код:

q(U,X,A):-A is(X-U)^2.
p(L):-sumlist(L,S),length(L,I),U is S/I,maplist(q(U),L,A),sumlist(A,B),C is sqrt(B/I),write(C).

Пояснення:

q(U,X,A):-A is(X-U)^2.   % calc squared difference of X and U
p(L):-sumlist(L,S),      % sum input list
      length(L,I),       % length of input list
      U is S/I,          % set U to the mean value of input list
      maplist(q(U),L,A), % set A to the list of squared differences of input and mean
      sumlist(A,B),      % sum squared differences list
      C is sqrt(B/I),    % divide sum of squares by length of list
      write(C).          % print answer

Приклад:

p([10035, 436844, 42463, 44774]).
175656.78441352615

Спробуйте його онлайн тут


1

Perl5, 39 38


 16 для сценарію
+22 для Mкомутатора
+ 1 для Eперемикача
= 39

perl -MStatistics::Lite=:all -E"say stddevp@ARGV" .1 .2 300

Випробувано на Полуниці 5.20.2.


О, але тоді я зрозумів, що ви сказали, що наші відповіді можуть бути функціями замість програм. В такому разі,

{use Statistics::Lite":all";stddevp@_}

всього 38. Випробувано в Полуниці 5.20.2 як

print sub{use Statistics::Lite":all";stddevp@_}->( .1, .2, 300)

0

Пітон, 57 байт

lambda l:(sum((x-sum(l)/len(l))**2for x in l)/len(l))**.5

Вводиться як список

Дякую @xnor


Я думаю , що ви можете зробити .5на місці , 0.5щоб зберегти байти. Ви також маєте на увазі len(x)замість len(l)?
Олексій А.

@AlexA. Ага, ні, я не думаю так ...
Бета-розпад

1
Вибачте, заплутався. Нехтуйте xі lнісенітницями. Але ви все одно можете зробити, .5щоб зберегти байт.
Олексій А.

1
@BetaDecay Це коротше використовувати список-Комп , ніж для відображення лямбда: sum((x-sum(l)/len(l))**2for x in l).
xnor

1
Інший препарат дав ту ж довжину: lambda l:(sum(x*x*len(l)for x in l)-sum(l)**2)**.5/len(l).
xnor

0

PowerShell, 122

:\>type stddev.ps1
$y=0;$z=$args -split",";$a=($z|?{$_});$c=$a.Count;$a|%{$y+=$_};$b=$y/$c;$a|%{$x+
=(($_-$b)*($_-$b))/$c};[math]::pow($x,0.5)

пояснення

<#
$y=0                            init
$z=$args -split","              split delim ,
$a=($z|? {$_})                  remove empty items
$c=$a.Count                     count items
$a|%{$y+=$_}                    sum
$b=$y/$c                        average
$a|%{$x+=(($_-$b)*($_-$b))/$c}  sum of squares/count
[math]::pow($x,0.5)             result
#>

результат

:\>powershell -nologo -f stddev.ps1 45,67,32,98,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 45,  67,32,98,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 45,  67,32, 98 ,11,3
32.5303277300156

:\>powershell -nologo -f stddev.ps1 10035, 436844, 42463, 44774
175656.784413526

:\>powershell -nologo -f stddev.ps1 1,1,1,1,1,1
0

0

Фортран, 138 байт

Просто пряма реалізація рівняння у Фортран:

double precision function std(x)
integer,dimension(:),intent(in) :: x
std = norm2(dble(x-sum(x)/size(x)))/sqrt(dble(size(x)))
end function

0

SmileBASIC, 105 байт (як функція)

Я щойно помітив, що це може бути функцією. Ну, це значно зменшує мою відповідь. Це визначає функцію, Sяка приймає масив і повертає стандартне відхилення сукупності. Ідіть, прочитайте інший для пояснення, але пропустіть синтаксичний розбір. Я не хочу робити це знову.

DEF S(L)N=LEN(L)FOR I=0TO N-1U=U+L[I]NEXT
U=1/N*U FOR I=0TO N-1T=T+POW(L[I]-U,2)NEXT RETURN SQR(1/N*T)END

Як програма, 212 байт

На жаль, я повинен приймати список вхідних даних як рядок і сам розбирати його. Це додає до відповіді понад 100 байт, тому якщо дозволено якийсь формат введення, крім списку, розділеного комами, я би радий почути його. Також зауважте, що через VALпомилку, пробіл перед комою або затримка рядка порушує програму. Після коми або на початку рядка добре.

DIM L[0]LINPUT L$@L I=INSTR(O,L$,",")IF I>-1THEN PUSH L,VAL(MID$(L$,O,I-O))O=I+1GOTO@L ELSE PUSH L,VAL(MID$(L$,O,LEN(L$)-O))
N=LEN(L)FOR I=0TO N-1U=U+L[I]NEXT
U=1/N*U FOR I=0TO N-1T=T+POW(L[I]-U,2)NEXT?SQR(1/N*T)

Необов’язаний і пояснив:

DIM L[0]  'define our array
LINPUT L$ 'grab string from input

'parse list
'could've used something cleaner, like a REPEAT, but this was shorter
@L
I=INSTR(O,L$,",")                 'find next comma
IF I>-1 THEN                      'we have a comma
 PUSH L,VAL(MID$(L$,O,I-O))       'get substring of number, parse & store
 O=I+1                            'set next search location
 GOTO @L                          'go again
ELSE                              'we don't have a comma
 PUSH L,VAL(MID$(L$,O,LEN(L$)-O)) 'eat rest of string, parse & store
ENDIF                             'end

N=LEN(L) 'how many numbers we have

'find U
'sum all of the numbers, mult by 1/N
FOR I=0 TO N-1
 U=U+L[I]
NEXT
U=1/N*U

'calculate our popstdev
'sum(pow(x-u,2))
FOR I=0 TO N-1
 T=T+POW(L[I]-U,2)
NEXT
PRINT SQR(1/N*T) 'sqrt(1/n*sum)

0

Аксіома, 137 байт

m(a:List Float):Complex Float==(#a=0=>%i;reduce(+,a)/#a)
s(a:List Float):Complex Float==(#a=0=>%i;n:=m(a);sqrt(m([(x-n)^2 for x in a])))

Функція m () повертає середнє значення списку вхідних даних. Обидві функції на помилку повертають% i уявну константу sqrt (-1). Код для тесту та результатів. [але результат, якщо він нормальний, це реальна частина одного складного числа]

(6) -> s([45,67,32,98,11,3])
   (6)  32.5303277300 15604966

(7) -> s([10035,436844,42463,44774])
   (7)  175656.7844135261 4035

(8) -> s([1,1,1,1,1,1])
   (8)  0.0


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.