Условное обозначение для отрицательного целого числа

#python #math #conditional #bioinformatics

#python #математика #условные операторы #биоинформатика

Вопрос:

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

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

Ответ №1:

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

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

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

Комментарии:

1. Обратите внимание, что для больших наборов данных этот алгоритм может испытывать проблемы с точностью из-за ошибок округления. Смотрите secure.wikimedia.org/wikipedia/en/wiki /… для более численно стабильных алгоритмов.

Ответ №2:

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

Ответ №3:

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

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

Приветствия