a początkowe pytanie brzmiało ... jak przekonwertować wartości rozproszenia na wartości siatki, prawda?
histogram2d
zlicza częstotliwość na komórkę, jednak jeśli masz inne dane na komórkę niż tylko częstotliwość, potrzebujesz dodatkowej pracy.
x = data_x # between -10 and 4, log-gamma of an svc
y = data_y # between -4 and 11, log-C of an svc
z = data_z #between 0 and 0.78, f1-values from a difficult dataset
Mam więc zestaw danych z wynikami Z dla współrzędnych X i Y. Jednak obliczałem kilka punktów poza obszarem zainteresowania (duże luki) i stosy punktów w małym obszarze zainteresowania.
Tak, tutaj staje się trudniejsze, ale także przyjemniejsze. Niektóre biblioteki (przepraszam):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot jest dziś moim silnikiem graficznym, cm to szereg map kolorów z pewnym nieciekawym wyborem. numpy do obliczeń i griddata do dołączania wartości do stałej siatki.
Ten ostatni jest ważny, szczególnie, że częstotliwość punktów xy nie jest równomiernie rozłożona w moich danych. Najpierw zacznijmy od pewnych granic pasujących do moich danych i dowolnego rozmiaru siatki. Oryginalne dane mają punkty danych również poza tymi granicami xiy.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Zdefiniowaliśmy więc siatkę z 500 pikselami między wartościami min i max x i y.
W moich danych jest o wiele więcej niż 500 wartości dostępnych w obszarze o dużym zainteresowaniu; mając na uwadze, że w obszarze niskiego zainteresowania nie ma nawet 200 wartości w całej sieci; między granicami graficznymi x_min
ix_max
jest jeszcze mniej.
Aby uzyskać ładny obraz, zadaniem jest uzyskanie średniej dla wysokich wartości zainteresowania i wypełnienie luk gdzie indziej.
Teraz definiuję swoją siatkę. Dla każdej pary xx-yy chcę mieć kolor.
xx = np.linspace(x_min, x_max, gridsize) # array of x values
yy = np.linspace(y_min, y_max, gridsize) # array of y values
grid = np.array(np.meshgrid(xx, yy.T))
grid = grid.reshape(2, grid.shape[1]*grid.shape[2]).T
Skąd ten dziwny kształt? scipy.griddata chce mieć kształt (n, D).
Griddata oblicza jedną wartość na punkt w siatce za pomocą predefiniowanej metody. Wybieram „najbliższy” - puste punkty siatki zostaną wypełnione wartościami od najbliższego sąsiada. Wygląda na to, że obszary z mniejszą ilością informacji mają większe komórki (nawet jeśli tak nie jest). Można wybrać interpolację „liniową”, a obszary z mniejszą ilością informacji wyglądają mniej ostro. Naprawdę sprawa gustu.
points = np.array([x, y]).T # because griddata wants it that way
z_grid2 = griddata(points, z, grid, method='nearest')
# you get a 1D vector as result. Reshape to picture format!
z_grid2 = z_grid2.reshape(xx.shape[0], yy.shape[0])
I hop, przekazujemy matplotlib, aby wyświetlić fabułę
fig = plt.figure(1, figsize=(10, 10))
ax1 = fig.add_subplot(111)
ax1.imshow(z_grid2, extent=[x_min, x_max,y_min, y_max, ],
origin='lower', cmap=cm.magma)
ax1.set_title("SVC: empty spots filled by nearest neighbours")
ax1.set_xlabel('log gamma')
ax1.set_ylabel('log C')
plt.show()
Wokół spiczastej części Kształtu V widać, że wykonałem wiele obliczeń podczas poszukiwania słodkiego miejsca, podczas gdy mniej interesujące części prawie wszędzie indziej mają niższą rozdzielczość.