এই প্রতিক্রিয়াটি তার মূল ফর্ম থেকে উল্লেখযোগ্যভাবে পরিবর্তন করা হয়েছে। আমার মূল প্রতিক্রিয়ার ত্রুটিগুলি নীচে আলোচনা করা হবে, তবে আপনি যদি বড় সম্পাদনা করার আগে এই প্রতিক্রিয়াটি দেখতে দেখতে মোটামুটি দেখতে চান তবে নীচের নোটবুকটি দেখুন: 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
সর্বাধিক সম্ভাবনার অনুমান
... এবং কেন এটি এখানে কাজ করে না
আমার আসল প্রতিক্রিয়া হিসাবে, আমি যে কৌশলটি পরামর্শ দিয়েছিলাম তা হ'ল সর্বাধিক সম্ভাবনার প্রাক্কলন সম্পাদন করতে MCMC ব্যবহার করা। সাধারণত, শর্তসাপেক্ষ সম্ভাবনার "অনুকূল" সমাধানগুলি অনুসন্ধানের জন্য এমএলই একটি ভাল পদ্ধতি, তবে আমাদের এখানে একটি সমস্যা রয়েছে: কারণ আমরা একটি বৈষম্যমূলক মডেল (এই ক্ষেত্রে একটি এলোমেলো বন) ব্যবহার করছি কারণ আমাদের সম্ভাবনাগুলি সিদ্ধান্তের সীমানার সাথে তুলনা করে গণনা করা হচ্ছে । এটির মতো মডেলের কোনও "অনুকূল" সমাধান সম্পর্কে কথা বলার আসলে কোনও অর্থ হয় না কারণ আমরা যখন ক্লাসের সীমানা থেকে অনেক দূরে চলে যাই, তখন মডেলটি সমস্ত কিছুর জন্য কেবল ভবিষ্যদ্বাণী করে। আমাদের যদি পর্যাপ্ত ক্লাস থাকে তবে তাদের মধ্যে কিছু সম্পূর্ণরূপে "ঘিরে" থাকতে পারে যার ক্ষেত্রে এটি কোনও সমস্যা হবে না তবে আমাদের ডেটার সীমানায় থাকা ক্লাসগুলি এমন মানগুলি দ্বারা "সর্বাধিক" করা হবে যা প্রয়োজনীয়ভাবে সম্ভব নয়।
প্রদর্শন করার জন্য, আমি আপনি খুঁজে পেতে পারেন কিছু সুবিধার কোড লিভারেজ যাচ্ছি এখানে , যা প্রদান করে 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()
এই দৃশ্যায়নে, এক্সগুলি হ'ল আসল ডেটা এবং আমরা যে শ্রেণিতে আগ্রহী সেগুলি সবুজ। লাইন-সংযুক্ত বিন্দুগুলি হ'ল আমাদের আঁকা নমুনাগুলি এবং তাদের রঙটি ডানদিকে রঙিন বারের লেবেল দ্বারা প্রদত্ত তাদের "পাতলা" সিকোয়েন্স পজিশন সহ, তারা নমুনাযুক্ত ক্রমের সাথে সামঞ্জস্য করে।
আপনি দেখতে পাচ্ছেন, নমুনাটি ডেটা থেকে মোটামুটি দ্রুত সরিয়ে নিয়ে যায় এবং তারপরে মূলত কোনও বাস্তব পর্যবেক্ষণের সাথে মিল রেখে বৈশিষ্ট্যের জায়গার মান থেকে বেশ দূরে থাকে hang স্পষ্টতই এটি একটি সমস্যা।
আমরা যেভাবে প্রতারণা করতে পারি তার একটি উপায় হ'ল আমাদের প্রস্তাবিত ক্রিয়াকলাপটি পরিবর্তিত করা কেবলমাত্র বৈশিষ্ট্যগুলিকে মানগুলিতে গ্রহণ করার জন্য যা আমরা আসলে ডেটাতে দেখেছি observed আসুন এটি চেষ্টা করে দেখুন এবং দেখুন যে এটি কীভাবে আমাদের ফলাফলের আচরণের পরিবর্তন করে।
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)
হ্যাঁ, এমএলইর জন্য ডেটা পর্যবেক্ষণের বিতরণে নোঙ্গর করা একটি প্রাক্কলন তৈরি করে আমরা এর আগে ঠিক কাজ করেছি। বায়েসকে এইভাবে শাসন করার বিষয়ে আমি কখনও ভাবি নি, তবে এটি এই নতুন দৃষ্টিকোণটি আবিষ্কারের সুযোগ দেওয়ার জন্য আপনাকে ধন্যবাদ জানায়।
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()
এবং সেখানে আপনার এটি রয়েছে: বৃহত্তর কালো 'এক্স' হ'ল আমাদের এমএপি অনুমান (সেই পৃষ্ঠাগুলি উত্তরের কে.ডি.পি.)।