und die erste Frage war ... wie man Streuwerte in Gitterwerte umwandelt, richtig?
histogram2d
zählt jedoch die Häufigkeit pro Zelle. Wenn Sie jedoch andere Daten pro Zelle als nur die Häufigkeit haben, müssen Sie einige zusätzliche Arbeiten ausführen.
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
Ich habe also einen Datensatz mit Z-Ergebnissen für X- und Y-Koordinaten. Ich berechnete jedoch nur wenige Punkte außerhalb des interessierenden Bereichs (große Lücken) und jede Menge Punkte in einem kleinen interessierenden Bereich.
Ja hier wird es schwieriger, aber auch lustiger. Einige Bibliotheken (sorry):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
Pyplot ist heute meine Grafik-Engine. cm ist eine Reihe von Farbkarten mit einer interessanten Auswahl. numpy für die Berechnungen und griddata zum Anhängen von Werten an ein festes Gitter.
Letzteres ist besonders wichtig, weil die Häufigkeit von xy-Punkten in meinen Daten nicht gleichmäßig verteilt ist. Beginnen wir zunächst mit einigen Grenzen, die zu meinen Daten passen, und einer beliebigen Rastergröße. Die Originaldaten haben Datenpunkte auch außerhalb dieser x- und y-Grenzen.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Wir haben also ein Raster mit 500 Pixeln zwischen den Min- und Max-Werten von x und y definiert.
In meinen Daten sind viel mehr als die 500 Werte im Bereich von hohem Interesse verfügbar; in der Erwägung, dass es im Niedrigzinsbereich nicht einmal 200 Werte im Gesamtnetz gibt; zwischen den grafischen Grenzen von x_min
und x_max
gibt es noch weniger.
Um ein schönes Bild zu erhalten, besteht die Aufgabe darin, einen Durchschnitt für die hohen Zinswerte zu erhalten und die Lücken an anderer Stelle zu schließen.
Ich definiere jetzt mein Raster. Für jedes xx-yy Paar möchte ich eine Farbe haben.
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
Warum die seltsame Form? scipy.griddata möchte eine Form von (n, D).
Griddata berechnet einen Wert pro Punkt im Raster nach einer vordefinierten Methode. Ich wähle "am nächsten" - leere Gitterpunkte werden mit Werten des nächsten Nachbarn gefüllt. Dies sieht so aus, als hätten die Bereiche mit weniger Informationen größere Zellen (auch wenn dies nicht der Fall ist). Man könnte wählen, "linear" zu interpolieren, dann sehen Bereiche mit weniger Informationen weniger scharf aus. Geschmackssache, wirklich.
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])
Und hüpfen, wir übergeben an matplotlib, um die Handlung anzuzeigen
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()
Um den spitzen Teil der V-Form herum haben Sie bei meiner Suche nach dem Sweet Spot viele Berechnungen durchgeführt, während die weniger interessanten Teile fast überall eine niedrigere Auflösung haben.