Как измерить изменчивость эталонного теста, состоящего из множества суб-эталонных тестов? - PullRequest
4 голосов
/ 22 июля 2010

(Не строго программирование, но вопрос, на который программисты должны ответить.)

У меня есть эталон, X , который состоит из множества суб-эталонов x 1 .. x п . Это довольно шумный тест, результаты которого весьма разнообразны. Для точного сравнения я должен уменьшить ту «изменчивость», которая требует, чтобы я сначала измерил изменчивость.

Я могу легко рассчитать изменчивость каждого суб-эталона, используя, возможно, стандартное отклонение или дисперсию. Тем не менее, я хотел бы получить одно число, которое представляет общую изменчивость в виде одного числа.

Моя собственная попытка решить проблему:

sum = 0
foreach i in 1..n
   calculate mean across the 60 runs of x_i
   foreach j in 1..60
       sum += abs(mean[i] - x_i[j])
variability = sum / 60

Ответы [ 5 ]

2 голосов
/ 23 июля 2010

Лучшая идея: спрашивать в статистике Stack Exchange, как только она выйдет в публичную бета-версию (через неделю).

А пока: на самом деле вас могут интересовать крайности изменчивости, а не центральная тенденция (среднее и т. Д.). Я полагаю, что для многих приложений сравнительно мало что можно получить путем увеличения типичного пользовательского опыта, но многое можно получить, улучшив худший пользовательский опыт. Попробуйте 95-й процентиль стандартных отклонений и поработайте над его уменьшением. В качестве альтернативы, если типичная изменчивость равна , то, что вы хотите уменьшить, выведите все стандартные отклонения вместе. Если они примерно нормально распределены, я не знаю ни одной причины, почему вы не могли просто взять среднее.

1 голос
/ 27 июля 2010

С Дисперсия : «дисперсия общей группы равна среднему значению дисперсий подгрупп плюс дисперсия средних подгрупп». Мне пришлось прочитать это несколько раз, а затем запустить: 464 по этой формуле == 464, стандартное отклонение всех данных - единственное число, которое вы хотите.

#!/usr/bin/env python
import sys
import numpy as np

N = 10
exec "\n".join( sys.argv[1:] )  # this.py N= ...
np.set_printoptions( 1, threshold=100, suppress=True )  # .1f
np.random.seed(1)

data = np.random.exponential( size=( N, 60 )) ** 5  # N rows, 60 cols
row_avs = np.mean( data, axis=-1 )  # av of each row
row_devs = np.std( data, axis=-1 )  # spread, stddev, of each row about its av
print "row averages:", row_avs
print "row spreads:", row_devs
print "average row spread: %.3g" % np.mean( row_devs )

# http://en.wikipedia.org/wiki/Variance:
# variance of the total group
# = mean of the variances of the subgroups  +  variance of the means of the subgroups
avvar = np.mean( row_devs ** 2 )
varavs = np.var( row_avs )
print "sqrt total variance: %.3g = sqrt( av var %.3g + var avs %.3g )" % (
    np.sqrt( avvar + varavs ), avvar, varavs)

var_all = np.var( data )  # std^2 all N x 60 about the av of the lot
print "sqrt variance all: %.3g" % np.sqrt( var_all )

row averages: [  49.6  151.4   58.1   35.7   59.7   48.   115.6   69.4  148.1   25. ]
row devs: [ 244.7  932.1  251.5   76.9  201.1  280.   513.7  295.9  798.9  159.3]
average row dev: 375
sqrt total variance: 464 = sqrt( av var 2.13e+05 + var avs 1.88e+03 )
sqrt variance all: 464


Чтобы увидеть, как увеличивается групповая дисперсия, запустите пример в Wikipedia Variance. Скажем, у нас есть
60 men of heights 180 +- 10, exactly 30: 170 and 30: 190  
60 women of heights 160 +- 7, 30: 153 and 30: 167.  

Среднее стандартное значение составляет (10 + 7) / 2 = 8,5. Вместе с тем высоты

-------|||----------|||-|||-----------------|||---
       153          167 170                 190

спред как 170 + - 13,2, намного больше 170 + - 8,5.
Зачем ? Потому что у нас распространяются не только мужчины + - 10 и женщины + - 7, но также и спреды от 160/180 о среднем значении 170.
Упражнение: рассчитать спред 13.2 двумя способами, из приведенной выше формулы и непосредственно.

1 голос
/ 22 июля 2010

Я думаю, вы неправильно понимаете стандартное отклонение - если вы запустите свой тест 50 раз и у вас будет 50 различных периодов выполнения, стандартное отклонение будет одним числом, которое описывает, насколько жестким или потерять эти 50 чисел распределены вокруг вашего среднего. В сочетании с вашим средним временем выполнения стандартное отклонение поможет вам увидеть, насколько велик разброс в ваших результатах.

Рассмотрим следующие времена выполнения:

12 15 16 18 19 21 12 14

Среднее время выполнения равно 15.875. Стандартное отклонение выборки этого набора составляет 3,27. Есть хорошее объяснение того, что 3,27 на самом деле означает (в нормально распределенной популяции примерно 68% выборок попадут в одно стандартное отклонение от среднего: например, между 15.875-3.27 и 15.875+3.27), но Я думаю, что вы просто ищете способ количественно оценить, насколько «узкие» или «распределенные» результаты соответствуют вашему среднему значению.

Теперь рассмотрим другой набор времени выполнения (скажем, после того, как вы скомпилировали все свои тесты с помощью -O2):

14 16 14 17 19 21 12 14

Среднее значение этих времен выполнения также 15.875. Типовое стандартное отклонение этого набора составляет 3,0. (Таким образом, примерно 68% выборок попадут в 15.875-3.0 и 15.875+3.0.) Этот набор более тесно сгруппирован, чем первый.

И у вас есть одно число, которое суммирует, насколько компактная или свободная группа чисел находится около среднего значения.

Предостережения

Стандартное отклонение построено на предположении нормального распределения - но ваше приложение может не распределяться нормально, поэтому имейте в виду, что стандартное отклонение в лучшем случае может быть приблизительным ориентиром. Отобразите время выполнения в гистограмме , чтобы увидеть, выглядят ли ваши данные примерно нормально, равномерно, мультимодально или ...

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

Я упомянул, что стандартное отклонение в сочетании со средним значением поможет вам понять ваши данные: если стандартное отклонение почти равно вашему среднему значению или, что еще хуже, больше, тогда ваши данные очень разбросаны и, возможно, ваш процесс не очень повторяется. Как вы уже поняли, интерпретировать ускорение 3% перед лицом большого стандартного отклонения практически бесполезно. И лучший судья (по моему опыту) величины стандартного отклонения - это величина среднего.

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

0 голосов
/ 28 июля 2010

Это сложная проблема, потому что в любом случае эталонные тесты могут иметь разную натуральную длину.Итак, первое, что вам нужно сделать, - это преобразовать каждый из отдельных показателей ниже эталонного значения в масштабно-инвариантные значения (например, «коэффициент ускорения» относительно некоторого, как полагают, хорошего базового уровня), чтобы у вас по крайней мере был шанс сравнить различные критерии.

Затем вам нужно выбрать способ объединения цифр.Какой-то средний.Есть, однако, много типов среднего.Мы можем отказаться от использования режима и медианы здесь;они выбрасывают слишком много соответствующей информации.Но различные виды среднего значения полезны из-за различных способов придания веса выбросам.Раньше я знал (но забыл), было ли на практике наиболее полезным геометрическое среднее или гармоническое среднее (среднее арифметическое здесь не так хорошо).Среднее геометрическое в основном представляет собой среднее арифметическое в логарифмическом домене, а среднее гармоническое аналогично представляет собой среднее арифметическое в обратном домене.(Таблицы делают это тривиальным.)

Теперь, когда у вас есть возможность объединить значения для набора тестов в нечто достаточно информативное, вам нужно будет выполнить много прогонов.Возможно, вы захотите, чтобы компьютер делал это, пока вы выполняете какую-то другую задачу.:-) Тогда попробуйте объединить значения различными способами.В частности, обратите внимание на дисперсию отдельных суб-тестов и дисперсию комбинированного номера тестов.Также подумайте о том, чтобы выполнить некоторые анализы в журнале и ответных доменах.

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

Удачи!

0 голосов
/ 22 июля 2010

Вы пытаетесь решить не ту проблему. Лучше постарайся свести это к минимуму. Различия могут быть из-за кеширования.

Попробуйте запустить код на одном (том же) ядре с помощью функции SetThreadAffinityMask () в Windows.

Отбросьте первое измерение.

Увеличить приоритет thead.

Прекратить гиперпоточность.

Если у вас много условных переходов, это может привести к заметным различиям между вызовами с разными входами. (это можно решить, предоставив точно такой же ввод для i-й итерации, а затем сравнив измеренное время между этими итерациями).

Здесь вы можете найти несколько полезных советов: http://www.agner.org/optimize/optimizing_cpp.pdf

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...