và câu hỏi ban đầu là ... làm thế nào để chuyển đổi giá trị phân tán thành giá trị lưới, phải không?
histogram2d
không tính tần số trên mỗi ô, tuy nhiên, nếu bạn có dữ liệu khác trên mỗi ô chứ không chỉ tần số, bạn cần một số công việc bổ sung để thực hiện.
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
Vì vậy, tôi có một bộ dữ liệu với kết quả Z cho tọa độ X và Y. Tuy nhiên, tôi đã tính toán một vài điểm bên ngoài khu vực quan tâm (khoảng trống lớn) và hàng đống điểm trong một khu vực nhỏ quan tâm.
Có ở đây nó trở nên khó khăn hơn nhưng cũng vui hơn. Một số thư viện (xin lỗi):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot là công cụ đồ họa của tôi ngày hôm nay, cm là một loạt các bản đồ màu với một số lựa chọn không chính xác. numpy cho các tính toán và griddata để gắn các giá trị vào một lưới cố định.
Điều cuối cùng rất quan trọng đặc biệt là vì tần số của các điểm xy không được phân phối đều trong dữ liệu của tôi. Trước tiên, hãy bắt đầu với một số ranh giới phù hợp với dữ liệu của tôi và kích thước lưới tùy ý. Dữ liệu gốc có các điểm dữ liệu bên ngoài các ranh giới x và y đó.
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
Vì vậy, chúng tôi đã xác định lưới có 500 pixel giữa giá trị tối thiểu và tối đa của x và y.
Trong dữ liệu của tôi, có rất nhiều hơn 500 giá trị có sẵn trong lĩnh vực được quan tâm cao; trong khi ở khu vực lãi suất thấp, thậm chí không có 200 giá trị trong tổng lưới; giữa ranh giới đồ họa của x_min
và x_max
thậm chí còn ít hơn.
Vì vậy, để có được một bức ảnh đẹp, nhiệm vụ là lấy trung bình cho các giá trị lãi suất cao và lấp đầy các khoảng trống ở nơi khác.
Tôi xác định lưới của tôi bây giờ. Đối với mỗi cặp xx-yy, tôi muốn có một màu.
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
Tại sao hình dạng lạ? scipy.griddata muốn một hình dạng (n, D).
Griddata tính toán một giá trị cho mỗi điểm trong lưới, theo phương pháp được xác định trước. Tôi chọn "gần nhất" - các điểm lưới trống sẽ được điền với các giá trị từ hàng xóm gần nhất. Điều này trông giống như các khu vực có ít thông tin có các ô lớn hơn (ngay cả khi nó không phải là trường hợp). Người ta có thể chọn nội suy "tuyến tính", sau đó các khu vực có ít thông tin trông kém sắc nét. Vật chất của hương vị, thực sự.
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])
Và hy vọng, chúng tôi bàn giao cho matplotlib để hiển thị cốt truyện
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()
Xung quanh phần nhọn của V-Shape, bạn thấy tôi đã tính toán rất nhiều trong quá trình tìm kiếm điểm ngọt, trong khi những phần ít thú vị hơn hầu hết mọi nơi khác có độ phân giải thấp hơn.