Стандартное отклонение списка - программирование
Подтвердить что ты не робот

Стандартное отклонение списка

Я хочу найти среднее и стандартное отклонение 1, 2,... цифр нескольких (Z) списков. Например, у меня есть

A_rank=[0.8,0.4,1.2,3.7,2.6,5.8]
B_rank=[0.1,2.8,3.7,2.6,5,3.4]
C_Rank=[1.2,3.4,0.5,0.1,2.5,6.1]
# etc (up to Z_rank )...

Теперь я хочу взять среднее значение и std *_Rank[0], среднее значение и std *_Rank[1] и т.д.
(т.е. среднее и std 1-й цифры из всех списков (A..Z) _rank.
среднее и std 2-й цифры из всех списков (A..Z) _rank.
среднее и std 3-й цифры...; и т.д).

4b9b3361

Ответ 1

Так как Python 3.4/PEP450 существует statistics module в стандартной библиотеке, которая имеет метод stdev для вычисления стандартного отклонения итераций, подобных вашим:

>>> A_rank = [0.8, 0.4, 1.2, 3.7, 2.6, 5.8]
>>> import statistics
>>> statistics.stdev(A_rank)
2.0634114147853952

Ответ 2

Я бы поставил A_Rank et al в массив 2D NumPy, а затем использовал numpy.mean() и numpy.std(), чтобы вычислить средства и стандартные отклонения:

In [17]: import numpy

In [18]: arr = numpy.array([A_rank, B_rank, C_rank])

In [20]: numpy.mean(arr, axis=0)
Out[20]: 
array([ 0.7       ,  2.2       ,  1.8       ,  2.13333333,  3.36666667,
        5.1       ])

In [21]: numpy.std(arr, axis=0)
Out[21]: 
array([ 0.45460606,  1.29614814,  1.37355985,  1.50628314,  1.15566239,
        1.2083046 ])

Ответ 3

Вот некоторый чистый Python-код, который вы можете использовать для вычисления среднего и стандартного отклонения.

Весь код ниже основан на модуле statistics в Python 3. 4+.

def mean(data):
    """Return the sample arithmetic mean of data."""
    n = len(data)
    if n < 1:
        raise ValueError('mean requires at least one data point')
    return sum(data)/n # in Python 2 use sum(data)/float(n)

def _ss(data):
    """Return sum of square deviations of sequence data."""
    c = mean(data)
    ss = sum((x-c)**2 for x in data)
    return ss

def stddev(data, ddof=0):
    """Calculates the population standard deviation
    by default; specify ddof=1 to compute the sample
    standard deviation."""
    n = len(data)
    if n < 2:
        raise ValueError('variance requires at least two data points')
    ss = _ss(data)
    pvar = ss/(n-ddof)
    return pvar**0.5

Примечание: для повышения точности при суммировании чисел с плавающей запятой модуль statistics использует пользовательскую функцию _sum а не встроенную sum которую я использовал вместо нее.

Теперь у нас есть, например:

>>> mean([1, 2, 3])
2.0
>>> stddev([1, 2, 3]) # population standard deviation
0.816496580927726
>>> stddev([1, 2, 3], ddof=1) # sample standard deviation
0.1

Ответ 4

В Python 2.7.1 вы можете рассчитать стандартное отклонение, используя numpy.std() для:

  • Население std. Просто используйте numpy.std() без дополнительных аргументов, кроме вашего списка данных.
  • Пример std: вам нужно передать ddof (то есть Delta Degrees Degree of Freedom) в 1, как показано в следующем примере:

numpy.std(< your-list > , ddof = 1)

В вычислениях используется делитель N - ddof, где N - количество элементов. По умолчанию ddof равен нулю.

Он вычисляет образец std, а не std.

Ответ 6

чистый код python:

from math import sqrt

def stddev(lst):
    mean = float(sum(lst)) / len(lst)
    return sqrt(float(reduce(lambda x, y: x + y, map(lambda x: (x - mean) ** 2, lst))) / len(lst))

Ответ 7

В других ответах рассказывается, как сделать std dev в python достаточно, но никто не объясняет, как выполнить причудливый обход, который вы описали.

Я собираюсь предположить, что A-Z - это все население. Если вы не видите Ome, ответьте на вопрос о том, как сделать вывод из образца.

Итак, чтобы получить стандартное отклонение/среднее значение первой цифры каждого списка, вам понадобится примерно следующее:

#standard deviation
numpy.std([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

#mean
numpy.mean([A_rank[0], B_rank[0], C_rank[0], ..., Z_rank[0]])

Чтобы сократить код и обобщить его на любую n-ю цифру, используйте следующую функцию, которую я сгенерировал для вас:

def getAllNthRanks(n):
    return [A_rank[n], B_rank[n], C_rank[n], D_rank[n], E_rank[n], F_rank[n], G_rank[n], H_rank[n], I_rank[n], J_rank[n], K_rank[n], L_rank[n], M_rank[n], N_rank[n], O_rank[n], P_rank[n], Q_rank[n], R_rank[n], S_rank[n], T_rank[n], U_rank[n], V_rank[n], W_rank[n], X_rank[n], Y_rank[n], Z_rank[n]] 

Теперь вы можете просто получить stdd и значение всех n-ых мест из A-Z следующим образом:

#standard deviation
numpy.std(getAllNthRanks(n))

#mean
numpy.mean(getAllNthRanks(n))

Ответ 8

Используя python, вот несколько методов:

import statistics as st

n = int(input())
data = list(map(int, input().split()))

Подход1 - с помощью функции

stdev = st.pstdev(data)

Подход 2: вычислить дисперсию и взять ее квадратный корень

variance = st.pvariance(data)
devia = math.sqrt(variance)

Подход 3: использование базовой математики

mean = sum(data)/n
variance = sum([((x - mean) ** 2) for x in X]) / n
stddev = variance ** 0.5

print("{0:0.1f}".format(stddev))

Замечания:

  • variance рассчитывает дисперсию выборки населения
  • pvariance рассчитывает дисперсию всего населения
  • похожие различия между stdev и pstdev