dan pertanyaan awal adalah ... bagaimana cara mengubah nilai sebar ke nilai kotak, kan?
histogram2d
tidak menghitung frekuensi per sel, namun, jika Anda memiliki data lain per sel dari hanya frekuensi, Anda akan memerlukan beberapa pekerjaan tambahan untuk dilakukan.
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
Jadi, saya punya dataset dengan hasil-Z untuk koordinat X dan Y. Namun, saya menghitung beberapa poin di luar bidang minat (kesenjangan besar), dan banyak poin di bidang minat kecil.
Ya di sini menjadi lebih sulit tetapi juga lebih menyenangkan. Beberapa perpustakaan (maaf):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot adalah mesin grafis saya hari ini, cm adalah berbagai peta warna dengan beberapa pilihan initeresting. numpy untuk perhitungan, dan data grid untuk melampirkan nilai ke jaringan tetap.
Yang terakhir ini penting terutama karena frekuensi titik xy tidak terdistribusi secara merata dalam data saya. Pertama, mari kita mulai dengan beberapa batasan yang cocok dengan data saya dan ukuran kisi yang berubah-ubah. Data asli memiliki titik data juga di luar batas x dan y.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Jadi kami telah mendefinisikan kisi dengan 500 piksel antara nilai min dan maks x dan y.
Dalam data saya, ada lebih dari 500 nilai yang tersedia di bidang minat tinggi; sedangkan di bidang berbunga rendah, tidak ada bahkan 200 nilai dalam total grid; antara batas-batas grafis x_min
dan x_max
bahkan ada lebih sedikit.
Jadi untuk mendapatkan gambar yang bagus, tugasnya adalah untuk mendapatkan rata-rata nilai bunga tinggi dan mengisi celah di tempat lain.
Saya mendefinisikan grid saya sekarang. Untuk setiap pasangan xx-yy, saya ingin memiliki warna.
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
Kenapa bentuknya aneh? scipy.griddata menginginkan bentuk (n, D).
Griddata menghitung satu nilai per titik di grid, dengan metode yang telah ditentukan. Saya memilih "terdekat" - titik grid kosong akan diisi dengan nilai dari tetangga terdekat. Ini terlihat seolah-olah area dengan informasi yang lebih sedikit memiliki sel yang lebih besar (bahkan jika bukan itu masalahnya). Seseorang dapat memilih untuk menginterpolasi "linear", maka area dengan informasi yang lebih sedikit terlihat kurang tajam. Soal rasa, kok.
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])
Dan hop, kami serahkan ke matplotlib untuk menampilkan plot
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()
Di sekitar bagian runcing dari V-Shape, Anda tahu saya melakukan banyak perhitungan selama pencarian saya untuk sweet spot, sedangkan bagian yang kurang menarik hampir di tempat lain memiliki resolusi lebih rendah.