Стандартизуйте зразки (обчисліть z-бал)


14

Давши список номерів з плаваючою комою, стандартизуйте його .

Деталі

  • Список x1,x2,,xn є стандартизовані , якщо середнє значення всіх значень дорівнює 0, а стандартне відхилення дорівнює 1. Один з способів обчислити це спочатку обчислення середнього μ і стандартне відхилення σ як
    μ=1ni=1nxiσ=1ni=1n(xiμ)2,
    а потім обчислення стандартизації шляхом заміни кожногоxiнаxiμσ .
  • Можна припустити, що вхід містить щонайменше два різних запису (з яких випливає σ0 ).
  • Зауважимо, що в деяких реалізаціях використовується вибіркове стандартне відхилення, яке не дорівнює стандартному відхиленню сукупності σ ми використовуємо тут.
  • Існує відповідь CW на всі тривіальні рішення .

Приклади

[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]

(Ці приклади створені за допомогою цього сценарію .)

Відповіді:






4

APL + WIN, 41,32 30 байт

9 байт збережено завдяки Erik + 2 більше завдяки ngn

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

Підказує вектор чисел і обчислює середнє стандартне відхилення та стандартизовані елементи вхідного вектора


Ви не можете призначити x←v-(+/v)÷⍴v←⎕ а потім зробити x÷((+/x*2)÷⍴v)*.5?
Ерік Аутгольфер

Я справді можу. Спасибі.
Грем

робить apl + win чи однократне розширення ( 1 2 3+,4← → 1 2 3+4)? якщо так, ви можете переписати(+/x*2)÷⍴v як+/x×x÷⍴v
ngn

@ngn Це працює ще на 2 байти. Спасибі.
Грем

3

R + pryr, 53 52 байти

-1 байт, використовуючи sum(x|1)замість того, length(x)як показано у рішенні @Robert S.

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

Будучи мовою, побудованою для статистиків, я вражений, що ця функція не має вбудованої функції. Принаймні не одного, якого я міг знайти. Навіть ця функція mosaic::zscoreне дає очікуваних результатів. Це, ймовірно, пов'язане з використанням стандартного відхилення населення замість стандартного відхилення вибірки.

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


2
Ви можете змінити <-в а, =щоб зберегти 1 байт.
Роберт С.

@ J.Doe nope, я використав метод, який я прокоментував рішення Роберта С. scaleакуратний!
Джузеппе

2
@ J.Doe, оскільки ви використовуєте лише nодин раз, ви можете використовувати його безпосередньо 38 байт
Джузеппе

2
@RobertS. Тут, на PPCG, ми прагнемо заохочувати гнучкі введення та виведення даних, включаючи виведення більше, ніж потрібно, за винятком проблем, де точна компоновка результатів - вся суть проблеми.
ngm

6
Звичайно, вбудовані R не використовуватимуть "дисперсію населення". Лише розгублені інженери використали б таке (звідси відповіді Пітона та Матлаба;))
ngm


2

Желе , 10 байт

_ÆmµL½÷ÆḊ×

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

Це не коротше, але визначальна функція Джеллі ÆḊтакож обчислює векторну норму.

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

Гей, приємна альтернатива! На жаль, я не бачу способу її скоротити.
Ерік Аутгольфер

2

Математика, 25 байт

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

Чиста функція. Бере список списків чисел як вхідний і повертає список вихідних точних машин як вихід. Зауважте, що вбудована Standardizeфункція за замовчуванням використовує дисперсію вибірки.


2

J , 22 байти

-1 байт завдяки кряканню корів!

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

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

J , 31 23 байт

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

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

                   +/%# - 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
Упорядкувавши це, він дає 22 [:(%[:%:1#.*:%#)]-+/%# tio.run/##y/qfVmyrp2CgYKVg8D/… , я думаю, одну з цих шапок можна було зняти, але до цього часу не пощастило, EDIT: більш пряме обміну байтами (-%[:%:1#.-*-%#@[)+/%#також є в 22
user41805

@Cows quack Спасибі!
Гален Іванов


2

Haskell, 80 75 68 байт

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

Дякуємо @flawr за пропозиції використовувати sum(1<$x)замістьsum[1|_<-x] і вводити середнє значення, @xnor за вставку стандартного відхилення та інші скорочення.

Розширено:

-- 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
Ви можете замінити [1|_<-x]з , (1<$x)щоб заощадити кілька байт. Це чудова хитрість уникнути того fromIntegral, чого я ще не бачив!
недолік

До речі: мені подобається використовувати Tryitonline , ви можете запустити свій код там, а потім скопіювати попередньо відформатований aswer для публікації тут!
недолік


Ви можете написати (-x+)для , (+(-x))щоб уникнути круглих дужок. Крім того, схоже, це fможе бути точково:, f=(/sum(1<$x))і sможе бути замінено його визначенням.
xnor

@xnor Ooh, (-x+)зручно, я впевнений, що буду використовувати це в майбутньому
Джон Перді

2

MathGolf , 7 байт

▓-_²▓√/

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

Пояснення

Це буквально байт-байт для відпочинку відповіді Кевіна Круїссена 05AB1E, але я рятую кілька байт від MathGolf, маючи 1 байт для всього необхідного для цього завдання. Також відповідь виглядає досить добре на мій погляд!

▓         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 байт

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

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

Прокоментував

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 байт

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

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

Не використовує бібліотеки.

Функція helper %обчислює суму ith повноважень списку, що дозволяє нам отримати три корисні значення.

  • 0%l- довжина l(називайте це n)
  • 1%l- це сума l(називаємо це s)
  • 2%l- сума квадратів l(називаємо це m)

Ми можемо виразити z-оцінку елемента yяк

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

(Це вираз (y-s/n)/sqrt(v/n-(s/n)^2)трохи спрощений шляхом множення верху і низу на n.)

Ми можемо вставити вираження 0%l, 1%l, 2%lбез дужок , так як %ми визначаємо , має більш високий пріоритет , ніж арифметичні оператори.

(%)i=sum.map(^i)така ж довжина, як і i%l=sum.map(^i)l. Зробити це більш точково не допомагає. Визначаючи його, як g i=...втрачає байти, коли ми його називаємо. Хоча це %працює для будь-якого списку, але ми називаємо його лише списком введення проблем, але втрата байтів не викликає його аргументом lкожен раз, оскільки виклик з двома аргументами i%lне довше одноаргументного g i.


У нас є LАТЕХтут :)
недолік

Мені дуже подобається %ідея! Це схоже на дискретний варіант статистичних моментів .
недолік

1

К (оК) , 33 23 байти

-10 байт завдяки ngn!

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

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

Перша спроба кодування (я не наважуюся назвати це "гольфінг") у K. Я впевнений, що це можна зробити набагато краще (тут занадто багато назв змінних ...)


1
приємно! ви можете замінити початковий (x-m)на t( tio )
ngn

1
внутрішня { }xx
частина

1
ще -1 байт замінивши x-+/xна x-/x. лівий аргумент -/служить початковим значенням для зменшення ( tio )
ngn

@ngn Дякую! Тепер я бачу, що перші 2 гольфи очевидні; останній виходить за мій поточний рівень :)
Гален Іванов


1

TI-Basic (83 серія), 14 11 байт

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

Здійснює введення в Ans. Наприклад, якщо ви введете вище prgmSTANDARD, потім {1,2,3}:prgmSTANDARDповернетесь {-1.224744871,0.0,1.224744871}.

Раніше я намагався скористатися 1-Var Statsкомандою, яка зберігає стандартне відхилення сукупності в σx, але менше труднощів обчислити це вручну.


1

05AB1E , 9 байт

ÅA-DnÅAt/

Порт @Arnauld «s JavaScript відповіді , тому переконайтеся , що upvote його!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

Å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 байт

mc-dJ.OQ@.Om^-Jk2Q2

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

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

Редагувати: побачивши відповідь Кевіна , змінив на використання середнього вбудованого для внутрішніх результатів. Попередня відповідь:mc-dJ.OQ@csm^-Jk2QlQ2


0

SNOBOL4 (CSNOBOL4) , 229 байт

	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)

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

Посилання - це функціональна версія коду, яка будує масив з STDIN з урахуванням його довжини, а потім і його елементів, потім виконує функцію Zна цьому і, нарешті, виводить значення.

Визначає функцію, Zяка повертає масив.

На 1.лінії 4 необхідно виконати арифметику з плаваючою точкою належним чином.



0

Вугілля деревне , 25 19 байт

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

Спробуйте в Інтернеті! Посилання на багатослівну версію коду. Пояснення:

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

Обчисліть мк і векторно відняти його від кожного хi.

  θ         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.

Обчисліть σ, векторизований поділ кожного хi ним і вивести результат.

Редагувати: збережено 6 байт завдяки @ ASCII лише для а) використання SquareRoot()замість Power(0.5)б) фіксації векторизованих Divide()(це робилося IntDivide()замість цього) в) створення Power()векторизації.


закреслено 25 = немає байтів? : P (Також ви ще не оновили посилання TIO)
лише для ASCII

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