Выбросы интенсивности на двумерном графике (максимальные или минимальные локальные пики высокой интенсивности)Python

Программы на Python
Anonymous
Выбросы интенсивности на двумерном графике (максимальные или минимальные локальные пики высокой интенсивности)

Сообщение Anonymous »

Интересно, какой метод лучше использовать, чтобы увидеть выбросы значения z на 2D-графике. Например, у меня есть измерения значений x и y в диапазоне от 1 до 16 с шагом 1. Затем я вычисляю, сколько наблюдений имеет каждая пара x и y (x_n, y_n). Это дает мне сетку 16 на 16 с количеством наблюдений на пару (z). Поскольку x и y коррелируют (~0,5), мы ожидаем, что некоторые группы точек будут встречаться чаще, чем другие. Бывает, что там, где ожидается мало наблюдений, их представлено много. Какая-то ошибка оборудования. Как лучше всего найти их в больших данных, где сетка имеет размер не 16 на 16, а 9000 x 9000.
Вот пример жестко запрограммированной песочницы:

Код: Выделить всё

import pandas as pd
import matplotlib.pyplot as plt
# Let's make data x, y, z.
x = [i for i in range(1, 17) for j in range(16)]
y = list(range(1, 17)) * 16
z = []
z = (z + [2000]*16 + [2000]*16 +
([2000]*2 + [5000]*12 + [2000]*2) +
([2000]*2 + [5000]*12 + [2000]*2) +
([2000]*2 + [5000]*2 + [7000]*8 + [5000]*2 + [2000]*2) +
([2000]*2 + [5000]*2 + [7000] + [9000]*6 + [7000] + [5000]*2 + [2000]*2) +
([2000]*2 + [5000]*2 + [7000] + [9000] + [10000]*4 + [9000] + [7000] + [5000]*2 + [2000]*2) +
([2000]*2 + [5000]*2 + [7000] + [9000] + [10000] + [16000]*2 + [10000] + [9000] + [7000] + [5000]*2 + [2000]*2))
z1 = z.copy()
z1.reverse()
z = z + z1

df = pd.DataFrame({'x': x, 'y': y, 'z': z})

import matplotlib.pyplot as plt
# Create scatter plot with color mapping
plt.scatter(df.x, df.y, c=df.z, cmap='viridis', s=100, alpha=0.7)

# Add color bar
plt.colorbar(label='Intensity')

# Set labels and title
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.show()

df.loc[(df['x'] == 2) & (df['y'] == 6), 'z'] = 15000
df.loc[(df['x'] == 15) & (df['y'] == 2), 'z'] = 15000

plt.scatter(df.x, df.y, c=df.z, cmap='viridis', s=100, alpha=0.7)

# Add color bar
plt.colorbar(label='Intensity')

# Set labels and title
plt.xlabel('X Label')
plt.ylabel('Y Label')
plt.show()
Изображение

Таким образом, соседние x и y имеют значение z намного ниже, чем выбросы.
Я изучал KDE, контур и локальный выброс Фактор (LOF), но успеха не имел. На самом деле KDE работает нормально, но пропускная способность существенно влияет на обнаружение выбросов. Мне нужно найти точки, в которых значение z значительно отличается от значений z соседей на большой диаграмме рассеяния.

Подробнее здесь: https://stackoverflow.com/questions/784 ... -intensity

Вернуться в «Python»