Условно для отрицательного целого числа - PullRequest
1 голос
/ 10 мая 2011

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

Это кажется простым, я просто не могу об этом думать. Я хочу написать условие для моей функции, в котором говорится, что если есть отрицательное число, умножить на -1, поскольку квадратный корень из отрицательного числа не может быть взят.

Как мне написать это заявление?

def stdevValue(lst):
"""calculates the standard deviation of a list of numbers
input: list of numbers
output: float that is the standard deviation
"""
    stdev = 0
    stdevCalc = (((sum(lst) - (meanValue(x)))/(len(lst)-1)))**0.5
    stdev += stdevCalc
    return stdev

Ответы [ 3 ]

16 голосов
/ 10 мая 2011

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

def stdevValue(lst):
    m = meanValue(x) # wherever this comes from
    return (sum((x - m) ** 2 for x in lst) / len(lst)) ** 0.5

Это гарантирует, что сумма неотрицательна , так что вы можетевзять квадратный корень, не заботясь об отрицательных значениях.(Если вы хотите получить стандартное отклонение образца, разделите его на (len(lst) - 1)).

См. Статью в Википедии о Стандартное отклонение для получения дополнительной информации и примеров.

2 голосов
/ 10 мая 2011

Игнорируя контекст вопроса, ответом будет использование встроенного abs.Но если у вас есть математическое выражение типа y = sqrt(x), а y не может быть сложным, то x не может быть отрицательным.Любой минус x обозначает проблему, которая может быть округлением, переносом или, как в вашем случае, неправильной формулой.Простое умножение на -1 или взятие abs не решит проблему, а даст вам неправильный ответ.Возможно, вам следует подумать, как бороться с этими случаями (хотя я понимаю, что для случая стандартного отклонения эти ошибки вряд ли возникнут).

0 голосов
/ 10 мая 2011

Если вы действительно хотите проявить креативность, вы можете использовать квадратные и квадратные корни:

>>> import math
>>> x = -5
>>> math.sqrt((-5)**2)
5.0

Приветствия

...