ve ilk soru şudur: dağılım değerlerini ızgara değerlerine dönüştürme, değil mi?
histogram2d
hücre başına sıklığı sayar, ancak hücre başına yalnızca frekanstan başka verileriniz varsa, yapmanız gereken bazı ek işler gerekir.
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
Yani, X ve Y koordinatları için Z-sonuçları içeren bir veri setim var. Ancak, ilgi alanı dışında birkaç nokta (büyük boşluklar) ve küçük bir ilgi alanındaki nokta yığınları hesaplıyordum.
Evet burada daha zor ama aynı zamanda daha eğlenceli hale geliyor. Bazı kütüphaneler (üzgünüm):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot bugün benim grafik motorum, cm bazı initeresting seçenekleriyle bir dizi renkli harita. hesaplamalar için numpy ve sabit bir ızgaraya değerler eklemek için griddata.
Sonuncusu özellikle xy noktalarının sıklığı verilerimde eşit dağılmadığı için önemlidir. İlk olarak, verilerime uyan bazı sınırlarla ve rastgele bir ızgara boyutuyla başlayalım. Orijinal veriler, bu x ve y sınırlarının dışında da veri noktalarına sahiptir.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Bu nedenle, x ve y'nin min ve maks değerleri arasında 500 piksellik bir ızgara tanımladık.
Verilerimde, yüksek ilgi alanında 500'den fazla değer var; düşük faizli alanda, toplam şebekede 200 değer bile yoktur; grafik sınırları arasında x_min
ve x_max
hatta daha az var.
Güzel bir resim elde etmek için görev, yüksek faiz değerleri için bir ortalama elde etmek ve başka yerlerdeki boşlukları doldurmaktır.
Izgaramı şimdi tanımlıyorum. Her xx-yy çifti için bir renk istiyorum.
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
Neden garip şekil? scipy.griddata (n, D) şeklini istiyor.
Griddata, önceden tanımlanmış bir yöntemle ızgaradaki her nokta için bir değer hesaplar. "En yakın" ı seçiyorum - boş ızgara noktaları en yakın komşunun değerleriyle doldurulacak. Bu, daha az bilgi içeren alanların daha büyük hücrelere sahip gibi görünüyor (durum olmasa bile). Birisi "doğrusal" enterpolasyon seçebilir, daha az bilgi ile alanlar daha az keskin görünüyor. Lezzet meselesi, gerçekten.
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])
Ve hop, arsa görüntülemek için matplotlib'e teslim ediyoruz
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()
V Şeklinin sivri kısmının etrafında, tatlı noktayı araştırırken çok fazla hesaplama yaptığımı görürsünüz, oysa neredeyse her yerde daha az ilginç olan kısımlar daha düşük bir çözünürlüğe sahiptir.