इस प्रतिक्रिया को इसके मूल रूप से काफी संशोधित किया गया है। मेरी मूल प्रतिक्रिया के दोषों के बारे में नीचे चर्चा की जाएगी, लेकिन यदि आप मोटे तौर पर देखना चाहते हैं तो इससे पहले कि यह प्रतिक्रिया कैसी दिखती है, इससे पहले कि मैं बड़ा संपादन करता, निम्नलिखित नोटबुक पर एक नज़र डालें: https://nbviewer.jupyter.org/github /dmarx/data_generation_demo/blob/54be78fb5b68218971d2568f1680b4f783c0a79a/demo.ipynb
P(X)P(X|Y)∝P(Y|X)P(X)P(Y|X)X
अधिकतम संभावना अनुमान
... और यह यहाँ क्यों काम नहीं करता है
मेरी मूल प्रतिक्रिया में, मैंने जिस तकनीक का सुझाव दिया था वह अधिकतम संभावना अनुमान लगाने के लिए एमसीएमसी का उपयोग करना था। आमतौर पर, MLE सशर्त संभावनाओं के लिए "इष्टतम" समाधान खोजने के लिए एक अच्छा तरीका है, लेकिन हमारे यहां एक समस्या है: क्योंकि हम एक भेदभावपूर्ण मॉडल (इस मामले में एक यादृच्छिक जंगल) का उपयोग कर रहे हैं, हमारी संभावनाओं को निर्णय सीमाओं के सापेक्ष गणना की जा रही है । यह वास्तव में इस तरह के एक मॉडल के लिए "इष्टतम" समाधान के बारे में बात करने के लिए समझ में नहीं आता है क्योंकि एक बार जब हम कक्षा की सीमा से काफी दूर हो जाते हैं, तो मॉडल बस सब कुछ के लिए भविष्यवाणी करेगा। यदि हमारे पास पर्याप्त कक्षाएं हैं, तो उनमें से कुछ पूरी तरह से "घिरी" हो सकती हैं, जिस स्थिति में यह समस्या नहीं होगी, लेकिन हमारे डेटा की सीमा पर कक्षाएं उन मानों द्वारा "अधिकतम" हो जाएंगी जो जरूरी नहीं हैं।
प्रदर्शित करने के लिए, मैं कुछ सुविधा कोड का लाभ उठाने जा रहा हूं , जो आप यहां पा सकते हैं , जो GenerativeSampler
वर्ग प्रदान करता है जो मेरी मूल प्रतिक्रिया से कोड लपेटता है, इस बेहतर समाधान के लिए कुछ अतिरिक्त कोड, और कुछ अतिरिक्त सुविधाओं के साथ मैं खेल रहा था (कुछ जो काम करते हैं) , कुछ जो नहीं) जो मैं शायद यहाँ नहीं मिलेगा।
np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y,
target_class=2,
prior=None,
class_err_prob=0.05, # <-- the score we use for candidates that aren't predicted as the target class
rw_std=.05, # <-- controls the step size of the random walk proposal
verbose=True,
use_empirical=False)
samples, _ = sampler.run_chain(n=5000)
burn = 1000
thin = 20
X_s = pca.transform(samples[burn::thin,:])
# Plot the iris data
col=['r','b','g']
for i in range(3):
plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
plt.plot(*X_s.T, 'k')
plt.scatter(*X_s.T, c=np.arange(X_s.shape[0]))
plt.colorbar()
plt.show()
इस विज़ुअलाइज़ेशन में, x वास्तविक डेटा हैं, और जिस वर्ग में हम रुचि रखते हैं वह हरा है। लाइन-कनेक्टेड डॉट्स वे नमूने हैं जिन्हें हमने आकर्षित किया था, और उनका रंग उस क्रम से मेल खाता है जिसमें उन्हें नमूना दिया गया था, दाईं ओर रंगीन बार लेबल द्वारा दिए गए उनके "पतले" अनुक्रम की स्थिति के साथ।
जैसा कि आप देख सकते हैं, सैंपलर को डेटा से काफी जल्दी से हटा दिया गया है और फिर मूल रूप से फीचर स्पेस के मूल्यों से बहुत दूर लटका दिया गया है जो किसी भी वास्तविक टिप्पणियों के अनुरूप है। स्पष्ट रूप से यह एक समस्या है।
जिस तरह से हम धोखा दे सकते हैं वह है कि हमारे प्रस्ताव फ़ंक्शन को बदलने के लिए केवल सुविधाओं को उन मूल्यों को लेने की अनुमति दें जो हमने वास्तव में डेटा में देखे थे। आइए कोशिश करते हैं और देखें कि यह हमारे परिणाम के व्यवहार को कैसे बदलता है।
np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y,
target_class=2,
prior=None,
class_err_prob=0.05,
verbose=True,
use_empirical=True) # <-- magic happening under the hood
samples, _ = sampler.run_chain(n=5000)
X_s = pca.transform(samples[burn::thin,:])
# Constrain attention to just the target class this time
i=2
plt.scatter(*X_r[y==i,:].T, c='k', marker='x')
plt.scatter(*X_s.T, c='g', alpha=0.3)
#plt.colorbar()
plt.show()
sns.kdeplot(X_s, cmap=sns.dark_palette('green', as_cmap=True))
plt.scatter(*X_r[y==i,:].T, c='k', marker='x')
plt.show()
X
P(X)P(Y|X)P(X)P(Y|X)P(X)
बे नियम दर्ज करें
जब आपने मुझे यहां गणित के साथ हाथ-लहरदार होने के लिए उकसाया, तो मैंने इस उचित राशि के साथ खेला (इसलिए मैं इस GenerativeSampler
चीज़ का निर्माण कर रहा हूं), और मैंने उन समस्याओं का सामना किया जो मैंने ऊपर रखी थीं। जब मुझे यह अहसास हुआ तो मुझे वास्तव में बहुत बुरा लगा, लेकिन जाहिर है कि आप बेयस रूल के आवेदन के लिए कॉल कर रहे हैं और मैं पहले ही खारिज होने के लिए माफी चाहता हूं।
यदि आप खाड़ी नियम से परिचित नहीं हैं, तो यह इस तरह दिखता है:
P(B|A)=P(A|B)P(B)P(A)
कई अनुप्रयोगों में भाजक एक स्थिर होता है जो स्केलिंग शब्द के रूप में कार्य करता है यह सुनिश्चित करने के लिए कि अंश 1 से एकीकृत होता है, इसलिए नियम को अक्सर इसी तरह से बहाल किया जाता है:
P(B|A)∝P(A|B)P(B)
या सादे अंग्रेजी में: "पूर्ववर्ती समय संभावना के समानुपाती होता है"।
परिचित दिखता है? अभी के बारे में कैसे:
P(X|Y)∝P(Y|X)P(X)
हाँ, यह वही है जो हमने पहले MLE के लिए एक अनुमान लगाकर काम किया था जो डेटा के देखे गए वितरण के लिए लंगर डाले हुए है। मैंने कभी भी इस तरह से शासन करने के बारे में नहीं सोचा है, लेकिन यह समझ में आता है कि मुझे इस नए परिप्रेक्ष्य की खोज करने का अवसर देने के लिए धन्यवाद।
P(Y)
इसलिए, इस अंतर्दृष्टि को बनाए रखने के लिए कि हमें डेटा के लिए एक पूर्व शामिल करना चाहिए, चलो एक मानक केडीई फिटिंग करके और देखें कि यह हमारे परिणाम को कैसे बदलता है।
np.random.seed(123)
sampler = GenerativeSampler(model=RFC, X=X, y=y,
target_class=2,
prior='kde', # <-- the new hotness
class_err_prob=0.05,
rw_std=.05, # <-- back to the random walk proposal
verbose=True,
use_empirical=False)
samples, _ = sampler.run_chain(n=5000)
burn = 1000
thin = 20
X_s = pca.transform(samples[burn::thin,:])
# Plot the iris data
col=['r','b','g']
for i in range(3):
plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
plt.plot(*X_s.T, 'k--')
plt.scatter(*X_s.T, c=np.arange(X_s.shape[0]), alpha=0.2)
plt.colorbar()
plt.show()
XP(X|Y)
# MAP estimation
from sklearn.neighbors import KernelDensity
from sklearn.model_selection import GridSearchCV
from scipy.optimize import minimize
grid = GridSearchCV(KernelDensity(), {'bandwidth': np.linspace(0.1, 1.0, 30)}, cv=10, refit=True)
kde = grid.fit(samples[burn::thin,:]).best_estimator_
def map_objective(x):
try:
score = kde.score_samples(x)
except ValueError:
score = kde.score_samples(x.reshape(1,-1))
return -score
x_map = minimize(map_objective, samples[-1,:].reshape(1,-1)).x
print(x_map)
x_map_r = pca.transform(x_map.reshape(1,-1))[0]
col=['r','b','g']
for i in range(3):
plt.scatter(*X_r[y==i,:].T, c=col[i], marker='x')
sns.kdeplot(*X_s.T, cmap=sns.dark_palette('green', as_cmap=True))
plt.scatter(x_map_r[0], x_map_r[1], c='k', marker='x', s=150)
plt.show()
और वहां आपके पास यह है: बड़ा काला 'एक्स' हमारा एमएपी अनुमान है (उन कंट्रोवर्स पोस्टवर्ड के केडीई हैं)।