Вот пример жестко запрограммированной песочницы:
Код: Выделить всё
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