Как использовать критерий Титьена-Мура? Имеется ряд цифровых значений длиной 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)
Для использования критерия Титьена-Мура для определения аномальных значений в ряду, нужно выполнить следующие шаги:
Вычислить среднее значение (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 - это критическое значение для уровня значимости аномалий.
Для использования критерия Титьена-Мура для определения аномальных значений в ряду, нужно выполнить следующие шаги:
Вычислить среднее значение (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 - это критическое значение для уровня значимости аномалий.