#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
Приветствия