और प्रारंभिक प्रश्न था ... बिखराव मूल्यों को ग्रिड मूल्यों में कैसे बदला जाए, है ना?
histogram2d
हालांकि, प्रति सेल आवृत्ति की गणना करता है, हालांकि, यदि आपके पास प्रति आवृत्ति की तुलना में प्रति सेल अन्य डेटा है, तो आपको कुछ अतिरिक्त काम करने की आवश्यकता होगी।
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
तो, मेरे पास X और Y निर्देशांक के लिए Z-results वाला डेटासेट है। हालांकि, मैं ब्याज के क्षेत्र (बड़े अंतराल) के बाहर कुछ बिंदुओं की गणना कर रहा था, और ब्याज के एक छोटे से क्षेत्र में अंकों के ढेर।
हाँ यहाँ और भी मुश्किल हो जाता है लेकिन और भी मजेदार। कुछ पुस्तकालय (क्षमा करें):
from matplotlib import pyplot as plt
from matplotlib import cm
import numpy as np
from scipy.interpolate import griddata
pyplot आज मेरा ग्राफिक इंजन है, सेमी कुछ रंग भरने वाले विकल्पों के साथ रंगीन मानचित्रों की एक श्रृंखला है। एक निश्चित ग्रिड के लिए मूल्यों को संलग्न करने के लिए गणना के लिए सुन्न, और griddata।
पिछले एक विशेष रूप से महत्वपूर्ण है क्योंकि xy अंक की आवृत्ति मेरे डेटा में समान रूप से वितरित नहीं है। सबसे पहले, चलो कुछ सीमाओं के साथ शुरू करते हैं जो मेरे डेटा और एक अनियंत्रित ग्रिड आकार के लिए उपयुक्त हैं। मूल डेटा में उन x और y सीमाओं के बाहर भी डेटा पॉइंट होते हैं।
#determine grid boundaries
gridsize = 500
x_min = -8
x_max = 2.5
y_min = -2
y_max = 7
इसलिए हमने x और y के न्यूनतम और अधिकतम मानों के बीच 500 पिक्सल वाले ग्रिड को परिभाषित किया है।
मेरे डेटा में, उच्च ब्याज के क्षेत्र में उपलब्ध 500 से अधिक मूल्य हैं; जबकि कम-ब्याज-क्षेत्र में, कुल ग्रिड में 200 मान भी नहीं हैं; के ग्राफिक सीमाओं के बीच x_min
औरx_max
भी कम हैं।
तो एक अच्छी तस्वीर पाने के लिए, कार्य उच्च ब्याज मूल्यों के लिए एक औसत प्राप्त करना है और कहीं और अंतराल को भरना है।
मैं अब अपने ग्रिड को परिभाषित करता हूं। प्रत्येक xx-yy जोड़ी के लिए, मैं एक रंग रखना चाहता हूं।
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
क्यों अजीब आकार? scipy.griddata (n, D) का एक आकार चाहता है।
ग्रिडिडा पूर्वनिर्धारित विधि द्वारा ग्रिड में प्रति बिंदु एक मान की गणना करता है। मैं "निकटतम" चुनता हूं - खाली ग्रिड अंक निकटतम पड़ोसी से मूल्यों से भरा होगा। ऐसा लगता है कि कम जानकारी वाले क्षेत्रों में बड़ी कोशिकाएं हैं (भले ही ऐसा न हो)। एक "रैखिक" को प्रक्षेपित करने का विकल्प चुन सकता है, फिर कम जानकारी वाले क्षेत्र कम तेज दिखते हैं। स्वाद की बात, सच में।
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])
और आशा है, हम कथानक को प्रदर्शित करने के लिए matplotlib को सौंपते हैं
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()
वी-शेप के नुकीले हिस्से के आसपास, आप देखते हैं कि मैंने मीठे स्थान के लिए अपनी खोज के दौरान बहुत सारी गणनाएँ कीं, जबकि लगभग हर जगह कम दिलचस्प हिस्सों का कम रिज़ॉल्यूशन है।