Здравствуйте, Nuzhny, Вы писали:
N>Сложнее не станет, там в цикле надо считать суму и сумму квадратов. В чём сложность-то?
Код станет совсем не похож на формулы для среднего и для стандартного отклонения.
N>А быстрее станет на констант, что может быть весьма весомо
def mean_std_1(arr):
n = len(arr)
mean = sum(arr) / n
d = sum((x-mean)*(x-mean) for x in arr) / n
std = math.sqrt(d)
return mean, std
def mean_std_2(arr):
n = len(arr)
s1 = 0
s2 = 0
for x in arr:
s1 += x
s2 += x*x
mean = s1 / n
std = math.sqrt(s2 / n - mean*mean)
return mean, std
Второй вариант быстрее первого всего лишь на 10-15% (для arr от 0 до 10_000_000)
Здравствуйте, Буравчик, Вы писали:
Б>С точностью — отлично
На 2+2 отлично. На реальные обсчёты такое нельзя.
Б>$>mean_std — говнокод.
Б>Поясни
Каждая функция должна иметь своё назначение. Функция mean, функция stddev, функция pearson. У тебя получилась логика размазана между.
$>На 2+2 отлично. На реальные обсчёты такое нельзя.
Для данной задачи (hackerrank) — все ок.
$>Каждая функция должна иметь своё назначение. Функция mean, функция stddev, функция pearson. У тебя получилась логика размазана между.
В данной задаче mean и stddev "ходят" вместе. Да и вообще, они часто вместе.
К тому же, это вспомогательная функция для pearson. Я вообще изначально хотел поместить ее внутри pearson.
В общем, не вижу особых проблем в объединении вычисления двух значений.
Наоборот, считаю, что так лучше для данной задачи.
Здравствуйте, Nuzhny, Вы писали
N>Кстати, не исключено, что никакого Анонима и нет. Ты его придумал, чтобы постить некоторые мысли и не компрометировать себя, а второй аккаунт заводить не хочется.
Так как тема про статистику, предлагаю заняться вычислением вероятности этого события
$>Здравствуйте, Буравчик, Вы писали:
Б>>$>mean_std — говнокод.
Нет, это стандартная практика, особенно когда всё вычисляется за один проход.
Б>>Поясни
$>Каждая функция должна иметь своё назначение. Функция mean, функция stddev, функция pearson. У тебя получилась логика размазана между.
Там нет размазанной логики. В том же R так вообще есть функции-комбайны, вычисляющие по 10 значений.
Здравствуйте, Nuzhny, Вы писали:
Б>>>$>mean_std — говнокод.
N>Нет, это стандартная практика,
N> В том же R так вообще есть функции-комбайны, вычисляющие по 10 значений.
Спасибо за предупреждение. Типичный стиль дата-саентиста?
Здравствуйте, Nuzhny, Вы писали:
N>Странно, обычно все формулы для несмещенной оценки. Ну, ладно.
Так это и есть "Naïve algorithm":
# исходный вариант в Naïve algorithm
Var = (SumSq − (Sum × Sum) / n) / n
# раскрываем скобки, получаем
Var = SumSq / n − Sum × Sum / n / n
# заменяем Sum/n на mean
Var = SumSq / n − mean × mean
# ч.т.д.
Здравствуйте, $$, Вы писали:
N>> В том же R так вообще есть функции-комбайны, вычисляющие по 10 значений.
$>Спасибо за предупреждение. Типичный стиль дата-саентиста?
Здравствуйте, $$, Вы писали:
>Спасибо за предупреждение. Типичный стиль дата-саентиста?
В scipy есть функция stats, возвращающая тупл из четырех значений: mean, variance, skewness, kurtosis. В ней даже можно выбрать, какие из значений будут возвращены. Т.е. результатом может быть например кортеж только из двух значений (mean, variance). Для статически типизированных языков звучит страшно, но на практике оказывается удобным, потому что часто приходится получать эти значения вместе.
В scipy есть также функция describe, которая кроме этих четырех значений возвращает дополнительно: количество, минимум и максимум (т.е. возвращает аж 7 значений).
В питоне с туплами работать достаточно удобно, поэтому это не вызывает проблем. Даже наоборот, добавляет удобства, если нужно получить сразу несколько параметров. В общем, в некоторых случаях это нормальная практика.
P.S. Конечно есть и отдельные функции для mean, var и т.д.
Перечитал ещё раз твой код, мой код. Твой считает сразу 2 значения, чтобы не дублировать суммирование. Мой код в stddev ожидает ещё mean, чтобы не дублировать суммирование . Т.е. по факту у меня уже не stddev(X), а полу-фабрикат.
Беру слова обратно. Единственное что, наверное лучше назвать mean_stddev или mean_sd.
Для потокового обсчёта (достраивания на основе предыдущего), наверное можно возвращать (mean, stddev, count), а принимать x, y, prev_mean_sd_count.
Здравствуйте, $$, Вы писали:
>Дать задание (на программиста), написать функцию подсчёта коэффициента Пирсона, за 15 минут. Гугл не запрещается.
Нет, дурь это в общем случае. Но не исключено что именно в этой компании подобные знания критичны
Меня недавно просили расписать (без кода) RAFT или Paxos, по желанию
Здравствуйте, kaa.python, Вы писали:
KP>Здравствуйте, $$, Вы писали:
>>Дать задание (на программиста), написать функцию подсчёта коэффициента Пирсона, за 15 минут. Гугл не запрещается.
KP>Нет, дурь это в общем случае. Но не исключено что именно в этой компании подобные знания критичны KP>Меня недавно просили расписать (без кода) RAFT или Paxos, по желанию
Как ты это оцениваешь? Где спросили (область)?