et la question initiale était ... comment convertir les valeurs de dispersion en valeurs de grille, non?
histogram2d
compte la fréquence par cellule, cependant, si vous avez d'autres données par cellule que la fréquence, vous aurez besoin d'un travail supplémentaire.
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
Donc, j'ai un jeu de données avec des résultats Z pour les coordonnées X et Y. Cependant, je calculais quelques points en dehors de la zone d'intérêt (grands écarts) et des tas de points dans une petite zone d'intérêt.
Oui ici ça devient plus difficile mais aussi plus amusant. Certaines bibliothèques (désolé):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot est mon moteur graphique aujourd'hui, cm est une gamme de cartes de couleurs avec quelques choix initeresting. numpy pour les calculs et griddata pour attacher des valeurs à une grille fixe.
Le dernier est important surtout parce que la fréquence des points xy n'est pas également distribuée dans mes données. Tout d'abord, commençons par quelques limites adaptées à mes données et une taille de grille arbitraire. Les données d'origine ont des points de données également en dehors de ces limites x et y.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Nous avons donc défini une grille de 500 pixels entre les valeurs min et max de x et y.
Dans mes données, il y a beaucoup plus que les 500 valeurs disponibles dans la zone de grand intérêt; considérant que dans la zone à faible intérêt, il n'y a même pas 200 valeurs dans la grille totale; entre les limites graphiques de x_min
etx_max
il y en a encore moins.
Donc, pour obtenir une belle image, la tâche est d'obtenir une moyenne des valeurs d'intérêt élevé et de combler les lacunes ailleurs.
Je définis ma grille maintenant. Pour chaque paire xx-yy, je veux avoir une couleur.
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
Pourquoi cette forme étrange? scipy.griddata veut une forme de (n, D).
Griddata calcule une valeur par point de la grille, par une méthode prédéfinie. Je choisis "le plus proche" - les points de grille vides seront remplis avec les valeurs du voisin le plus proche. On dirait que les zones avec moins d'informations ont des cellules plus grandes (même si ce n'est pas le cas). On pourrait choisir d'interpoler "linéaire", alors les zones avec moins d'informations semblent moins nettes. Question de goût, vraiment.
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])
Et hop, on passe à matplotlib pour afficher l'intrigue
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()
Autour de la partie pointue du V-Shape, vous voyez que j'ai fait beaucoup de calculs lors de ma recherche du sweet spot, alors que les parties les moins intéressantes presque partout ailleurs ont une résolution inférieure.