Рассчитать стандартное отклонение


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

выигрыш

Самая короткая программа или функция выигрывает.

Leaderboard


1
Вы имеете в виду, что вывод должен быть с плавающей запятой ИЛИ целым числом?
Мутадор

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

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

@RosLuP Тебе не нужно об этом беспокоиться
Beta Decay

1
@ a13a22 Согласно стандартным правилам PPCG, вы можете принимать входные данные через аргументы функций
Beta Decay

Ответы:


18

Зажим , 3

.sk

.sстандартное отклонение, kанализирует входные данные в форме {1,2,3}.


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


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

@ flawr О, я вижу. Возможно, тогда дело за переводчиком, если такая вещь существует.
Конор О'Брайен

2
@ CᴏɴᴏʀO'Bʀɪᴇɴ Я нашел это здесь, в строке 493, похоже, все в порядке!
flawr 15.10.15

11

Mathematica, 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

кдб + , 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

Dyalog APL, 24 23 21 20 19 17 байтов

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

Это определяет неназванную последовательность монадических функций, которая эквивалентна следующей функции.

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

Попробуйте их онлайн на TryAPL .

Как это устроено

Код состоит из нескольких поездов.

M←+/÷≢

Это определяет монадическую 3-последовательность (разветвление), Mкоторая выполняет +/(сумма всех элементов) и (длину) для правильного аргумента, затем применяет ÷(деление) к результатам, возвращая среднее арифметическое входных данных.

M×M

Это еще один форк, который применяется Mк правильному аргументу, повторяет его во второй раз и применяет ×(product) к результатам, возвращая μ 2 .

×⍨-(M×M)

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

Для ввода (x 1 ,…, x N ) эта функция возвращает (x 1 - μ 2 ,…, x N - μ 2 ) .

*∘.5∘M

Эта составная функция применяется Mк своему правильному аргументу *∘.5. Последний использует право аргумент карринг применять ввод карты 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 выглядит как перекошенная парабола.
Конор О'Брайен

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
:mhэто гений, кстати :)
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

Я согласен с AndréMuta, это не дает требуемого результата, смотрите здесь.
flawr 15.10.15

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])чтобы обмануть систему строгого типа Хаскелла.


Вы можете использовать sum(1<$n)и <$>для map.
Лайкони

Мне просто пришло в голову, что эти функции могут отсутствовать из-за более старой версии GHC во время этого ответа, но согласно этому совету они были введены в прелюдию в марте 2015 года, и политика сайта в любом случае изменилась, чтобы позволить более новый язык функции.
Лайкони

3

Python 3.4+, 30 байт

from statistics import*;pstdev

Импортирует встроенную функцию pstdev, например

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

Я думаю, что только pstdevпосле первой строки все в порядке? Я думаю, что xnor сделал это некоторое время назад с sum. Это как бы имеет смысл относительно того, как будут использоваться анонимные лямбды, т.е. p=pstdevилиmap(pstdev, [...])
FryAmTheEggman

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

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

@xnor Отредактировано. Я не совсем уверен насчет решения этих ситуаций ...
Sp3000

Может быть, мета вопрос будет полезен? :)
Beta Decay

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 15.10.15

Да, это хорошо :)
бета-распад

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 на J.

Попробуйте онлайн!


Я понятия не имел, Mбыло ли это встроенным заранее.
Конор О'Брайен,

Это не так. M=:+/%#это определение встроенной функции.
Деннис

Но это предопределено, верно? Возможно, встроенный это неправильный термин
Конор О'Брайен

Нет, это не предопределено. M=:+/%#сохраняет глагол +/%#в M, а затем вызывает его.
Деннис

Я сожалею, XD я не видел последнюю часть
Конор О'Брайен

1

Simplex 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. Испытано в Strawberry 5.20.2, как

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

0

Python, 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чтобы сохранить байты.
Alex A.

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

Fortran, 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.