Как использовать критерий Титьена-Мура? Имеется ряд цифровых значений длиной n. В этом ряду могут быть несколько аномальных значений (по максимальному значению). Подскажите, как использовать критерий Титьена-Мура, для определения этих аномальных значений. Можно использовать критерий Смирнова-Граббса, он очень прост:import math
def rem_anomalies(l):
alpha = 2.447
avg = sum(l) / len(l)
sig = 0
for i in l:
sig += (i - avg) * (i - avg)
sig = math.sqrt(sig/len(l))
l2 = []
for i in l:
if alpha > (i - avg)/sig:
l2.append(i)
return l2
l = [1, 22, 123, 121, 11, 23, 1223, 11,43 ,12, 123, 142, 11, 2333, 121, 123]
print(l)
print(rem_anomalies(l))
> [1, 22, 123, 121, 11, 23, 1223, 11, 43, 12, 123, 142, 11, 121, 123]
Но как мы видим, он не подходит для нескольких аномалий (в данном примере было две аномалии- 2333, которую алгоритм смог определить, и 1223, которую мы пропустили)
В алгоритмах не силен, так что если кто знает и понимает, как применить критерий Титьена-Мура или знает другие критерии для нахождения нескольких аномальных значений, прошу рассказать как можно проще. Желательно (но не обязательно) на примере псевдокода 8)

21 Авг 2019 в 06:07
254 +1
0
Ответы
1

Для использования критерия Титьена-Мура для определения аномальных значений в ряду, нужно выполнить следующие шаги:

Вычислить среднее значение (Xavg) и стандартное отклонение (Xstd) для всех значений в ряду.

Вычислить расстояние между каждым значением и средним значением в стандартных отклонениях (Z-оценка), используя формулу Z = (Xi - Xavg) / Xstd.

Найдите максимальное значение Z. Если это значение больше критического значения для выбранного уровня значимости, тогда это значение является аномальным.

Повторите этот процесс для каждого аномального значения, удаляя аномалии из ряда и вычисляя новое среднее значение и стандартное отклонение.

Повторяйте шаги до тех пор, пока больше не будут найдены аномальные значения.

Пример псевдокода:

function remove_anomalies(data):
is_anomaly = true
while is_anomaly:
Xavg = mean(data)
Xstd = std_dev(data)
Z_scores = []
for value in data:
Z_scores.append((value - Xavg) / Xstd)
max_Z = max(Z_scores)
if max_Z > critical_value:
index = Z_scores.index(max_Z)
data.remove(data[index])
else:
is_anomaly = false
return data
data = [1, 22, 123, 121, 11, 23, 1223, 11, 43, 12, 123, 142, 11, 2333, 121, 123]
print(data)
result = remove_anomalies(data)
print(result)

Это примерный псевдокод для использования критерия Титьена-Мура для определения аномальных значений в ряду. Здесь critical_value - это критическое значение для уровня значимости аномалий.

20 Апр 2024 в 13:23
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир