"...র্যান্ডম ভ্যারিয়েবলের মানগুলো তত নরমালি ডিস্ট্রিবিউট হবে! এখান থেকেই নরমাল ডিস্ট্রিবিউশন বা গাউসিয়ান (Gaussian) ডিস্ট্রিবিউশনের উৎপত্তি কিন্তু অনেকে মনে করে নরমাল ডিস্ট্রিবিউশনের ফলাফল সেন্ট্রাল লিমিট থিওরেম।"
মাথামুণ্ডু কিছুই বুঝলাম না, ফেলুদা একনজর দেখে একটা চারমিনার ধরিয়ে বলা শুরু করল,
-"তোর ক্লাসে খুব লম্বা কয়জন ক্লাসমেট আছে?"
-"উম, বেশি নয় দুই একজন হবে।"
-"খুব খাটো?"
-"তাও বেশি নয়, দুই তিনজন।"
-"বাকি সবাই মাঝারি?"
-"হ্যাঁ" বলে চিন্তা করতে থাকলাম ফেলুদা হঠাৎ আমার ক্লাসমেটদের হাইট নিয়ে এত চিন্তিত কেন। পরক্ষণেই ও বলল,
-"এটাই হল নরমাল ডিস্ট্রিবিউশন!"
-"মানে?"
-"মানে হল, তোদের সবার হাইট নিয়ে আমি যদি গড় করি তাহলে দেখা যাবে গড়ের মান মাঝারি হাইটের আশেপাশেই আছে। তোদের ক্লাসে যদি বেশি হাইটের ছাত্র বেশি থাকত তাহলে গড়ের মান অবশ্যই বেশি আসত। শুধু তোর ক্লাসে না, তোর আশেপাশে একটু নজর দিলেই দেখতে পারবি সবকিছুই নরমালি ডিস্ট্রিবিউটেড। তবে আমি শুধু তোর ক্লাস বিবেচনা করলে সেটা কিছুটা ইউনিফর্ম হবে। কিন্তু যখন আমি আরও কয়েকটি ক্লাসের সবার হাইট মাপব তখন সেই ডিস্ট্রিবিউশনটা নরমাল ডিস্ট্রিবিউশনের আকার ধারণ করবে। গাউসিয়ানের দুইটা প্যারামিটার হল এক্সপেক্টেশন বা গড় এবং ভ্যারিয়েন্স। আমি তোদের সব ক্লাসের সবার গড় আর ভারিয়েন্স পেলে আমি বলে দিতে পারব ঠিক কত শতাংশ ছাত্রের উচ্চতা ঠিক কতটুকু হতে পারে।"
ছাইদানিতে ছাই ঝেড়ে ফেলুদা বলতে থাকল,
"এখন যদি তুই বাস্কেটবল প্লেয়ারদের কথা চিন্তা করিস, তাহলে দেখবি তারা হাইটে কমবেশি একই। একে আমরা বলব ইউনিফর্ম ডিস্ট্রিবিউশন।
ম্যাথমেটিক্স যতটা আকাশ কুসুম ভাবিস অতটা কিন্তু না, কারণ কার্ল ফ্রিডরিখ গাউস কখনোই নরমাল ডিস্ট্রিবিউশনের জন্য এত সুন্দর একটা ইক্যুয়েশন তৈরি করতেন না। তার নরমাল ডিস্ট্রিবিউশনের ডেফিনিশন স্ট্যাটিস্টিকাল ক্যালকুলেশন অনেক সহজ করে দেয়। জানিস কি? দুইটা গাউসিয়ানের যোগফল / গুণফলও হয় আরেকটা গাউসিয়ান। তারমানে আমি যদি একটা মান এক নরমাল ডিস্ট্রিবিউশন থেকে নিই, আরেকটা মান আরেকটা নরমাল ডিস্ট্রিবিউশন থেকে নিই; তাদের ক্যালকুলেশনের ফলে আমি আরেকটা ডিস্ট্রিবিউশন পাব কিন্তু সেটাও হবে নরমাল এবং তার গড় ও ভ্যারিয়েন্স আমি ক্যালকুলেট করেই পেতে পারি। আরও মজার বিষয় হচ্ছে এই মিক্সড গাউসিয়ান থেকে অনেক কিছু ধারণা করা যায়। তবে পৃথিবীতে পিওর গাউসিয়ান বলে কোন কিছু নাই, নরমাল ডিস্ট্রিবিউশন হচ্ছে ন্যাচারাল ডিস্ট্রিবিউশনের একটা অ্যাপ্রক্সিমেশন মাত্র।"
এরপর ফেলুদা ঘর থেকে ল্যাপটপটা এনে আমাকে বলল,
-"তোকে আমি এখন হাতে কলমে দেখাব, আমি কি বোঝাতে চাইছি। দেখ,"
N = 1
number_of_students = 10000
u_ = np.random.uniform(0.,1.,(number_of_students,N))
mean_ = np.mean(u_,axis=1)
print (u_.shape)
plt.figure()
plt.hist(mean_,bins=10, normed=True)
plt.show()
"গাউসিয়ান ডিস্ট্রিবিউশন যেহেতু কন্টিনিউয়াস র্যান্ডম ভ্যারিয়েবলের জন্য হয়, যেখানে হাইট একটা ডিস্ক্রিট ভ্যালু। তাই আমাকে এখানে একটু ক্রিয়েটিভিটি খাটাতে হবে। ধরে নে, তোদের হাইট কন্টিনিউয়াস এবং এর মান
-"এবার যদি আমি
N = 2
number_of_students = 10000
u_ = np.random.uniform(0.,1.,(number_of_students,N))
mean_ = np.mean(u_,axis=1)
print (u_.shape)
plt.figure()
plt.hist(mean_,bins=10, normed=True)
plt.show()
"ব্যাপারটা বুঝেছিস? আরেকটু পরিষ্কার করলে, ধর তোদের ক্লাসে স্টুডেন্ট আছে তিনজন অর্থাৎ কিনা number_of_students = 3
এবং যাদের হাইট ধরি
এখন চিন্তা কর number_of_student
এবং N
এর মান বাড়তে বাড়তে অনেক হয় তাহলে তার প্লট হবে কীরকম?
আমি ঢোঁক গিলে বললাম, "গাউসিয়ান ডিস্ট্রিবিউশন?"
-"রাইট! এই দ্যাখ"
N = 1000
number_of_students = 10000
u_ = np.random.uniform(0.,1.,(number_of_students,N))
mean_ = np.mean(u_,axis=1)
print (u_.shape)
plt.figure()
plt.hist(mean_,bins=100, normed=True)
plt.show()
ফেলুদা বলে চলল,
-"সবসময় সবকিছুতে নরমাল ডিস্ট্রিবিউশন থাকবে এমন কোন কথা নাই, যেমন চিন্তা কর, কোন একটা রাস্তায় একটা এক্সিডেন্ট হলে সেখানে সতর্কতা বাড়ে এবং কিছু সময় ধরে অ্যাক্সিডেন্টের সংখ্যা কমে আসে। অর্থাৎ অনেকটা এক্সপোনেনশিয়ালি ড্যাম্পড একটা ইক্যুয়েশন। এটাকে আমরা নরমাল ডিস্ট্রিবিউশনের আওতায় আনলে ক্যালকুলেশন ভুল হবে, সেক্ষেত্রে আমরা ব্যবহার করব পয়জন ডিস্ট্রিবিউশন (Poisson Distribution)। এভাবে বিভিন্ন ক্ষেত্রের জন্য বিভিন্ন ডিস্ট্রিবিউশন ব্যবহার করতে হয়, আর সেটা ডিপেন্ড করে তুই সমস্যাটা কীভাবে মডেল করবি। বুঝেছিস?
কিছু বুঝেছি কিছু বুঝিনি, র্যান্ডম ভ্যারিয়েবল কী জিনিস?! গাউসিয়ানের গড় আর ভ্যারিয়েন্স ই বা কী? কে জানে।
"এই ডিস্ট্রিবিউশন ফাংশনগুলোর পোষাকি নাম প্রব্যাবিলিটি ডিস্ট্রিবিউশন ফাংশন। কন্টিনিউয়াস ডেটার জন্য হয় PDF আর ডিসক্রিট ডেটার জন্য হয় প্রব্যাবিলিটি মাস ফাংশন বা PMF। আরেকটা তথ্য জেনে রাখ, Distribution Function এর এরিয়া আন্ডার কার্ভ সর্বদা ১ হয়। তবে অবজার্ভেশন যদি অনেক বড় হয় বা
এমন সময় ফোন এল,
ফেলুদা ধরে কিছুক্ষণ ওদিকের কথা শুনে বলল,
'সেকী? ডাকাতি?'
...
'আচ্ছা আসছি।'
চল তোপসে, খুনে বাড়িতে এবার ডাকাতি।
পৌঁছিয়ে অমিতবাবুর সাথে দেখা হতেই বললেন, "মশাই আমি আমার ১০ বছরের চাকরি জীবনে এহেন কাণ্ড দেখিনি। টাকা পয়সা কিছু না, একটা ডায়রির জন্য একটা মানুষ কীভাবে এতটা মরিয়া হতে পারে?"
"চাকর পঞ্চানন কেমন আছে এখন?"
"ব্রেকফাস্ট করানোর পর একটু সুস্থ এখন। চলুন"
বৈঠকখানায় ঢুকেই পাওয়া গেল পঞ্চাননকে। সে ব্যাথায় কাতরাচ্ছে, পুরো কাহিনী এখনো আমার জানা হয় নি। ফেলুদার কথাতে মোটামুটি আন্দাজ করতে পারলাম।
"ডাকাত এসেছিল কখন মনে পড়ে?"
"বাবু, আমিতো মেঝেয় ঘুমুচ্ছিলাম, সময় তো দেখিনি। হঠাৎ দেখি জানলার কাছে একটা লাঠি; বইয়ের আলমারির উপর থেকে কি যেন একটা নামাচ্ছে। নামিয়ে যখন জানালার কাছে নিয়ে আসে আমি ততক্ষণে ঠাহর করতে পারি কি হয়। দৌড়ে ধরতে গিয়ে ওর সাথে ধ্বস্তাধ্বস্তি হয়। আমি যখন বইটা ধরে টান দিই আমার সাথে কতগুলি কাগজ ছিঁড়ে আসে।"
"চেহারা দেখতে পাও নি নিশ্চয়, অবয়বের গড়ন মনে আছে?"
"তা মনে নেই বাবু"
"আচ্ছা, অমিতবাবু; বইয়ের কাগজগুলো পাওয়া যাবে?"
"ওতো আমি রেডি করেই রেখেছি। দেখুন।"
আমিও উঁকি দিয়ে দেখার চেষ্টা করলাম, বুঝলাম না কিছু। হিবিজিবি লেখা, কিছু ডায়াগ্রাম কিছু ইকুয়েশন।
শুধু বুঝলাম ডেরিভেশনের চেইন রুল ও পার্শিয়াল ডেরিভেটিভ করা হয়েছে। এর বাইরে কিছু বোঝা গেল না।
ফেলুদা অনেক্ষণ ভ্রু কুঁচকে তাকিয়ে রইল কাগজটার দিকে। Local Gradient, Sigmoid
টার্মের সাথে আমি একদম পরিচিত না, ফেলুদাও কি অপরিচিত?
কিছুক্ষণ পরে ফেলুদা বলল, "কাগজটা আমি নিয়ে যাচ্ছি অমিতবাবু।"
অমিতবাবু বললেন, "অবশ্যই। চিঠির ব্যাপারটা নিয়ে কিছু সুরাহা করতে পারলেন?"
ফেলুদা বলল, "সেটা হয়ে গেলে সবার আগে আপনিই জানতে পারবেন। আজ তাহলে চলি, চল তোপসে।" শোনামাত্র ওর সাথে সাথে রওনা দিলাম।
বের হয়ে জিজ্ঞাসা করলাম, "আচ্ছা ফেলুদা সিগময়েড আর লোকাল গ্রেডিয়েন্ট কী? কাগজে গ্লোবাল গ্রেডিয়েন্ট লেখা নেই কেন?"
-"আমাকে এটা বল, তুই গ্রেডিয়েন্ট বলতে কী বুঝিস?"
-"ফাংশন ডেরিভেটিভ করলে যেটা আসে, বাংলায় যাকে বলে ঢাল"
-"গুড, তারমানে লোকাল গ্রেডিয়েন্ট মানে?"
-"তারমানে কোন একটা ফাংশনের অনেকগুলো পয়েন্টের গ্রেডিয়েন্টের একটা?"
-"ভেরি গুড, আমার তাই মনে হচ্ছে। কিন্তু গ্লোবাল গ্রেডিয়েন্ট বলতে কিছু হওয়ার কথা না আবার হতেও পারে। হয়ত বইয়ের বাকি অংশে এর ব্যাখ্যা থাকতে পারে যেটা আমাদের হাতে নেই। তুই ট্যাক্সি নিয়ে সটান বাড়ি চলে যা। আমি আসছি ঘণ্টাখানেক পরে।"
কি করব ভেবে পাচ্ছিলাম না, ভাবলাম গিয়ে হাতে লেখা বাংলা ডিজিটের কাজটা আগাই। ফেলুদা যে বুদ্ধি দিয়েছিল, সেটা কাজে লাগানোর দরকার। মনে পড়ছে কিছু কিছু, ছবি থেকে গুরুত্বপূর্ণ অংশ চিহ্নিত করাকে বা যে অংশ গুরুত্বপূর্ণ বলে মনে হয় তাকে Region of Interest (ROI)
বলে।
**যেহেতু ছবির আকার
আমি যদি এমন একটা কোড লিখি যেটা একটা ছবির ৯ টা রিজিওন বক্স আকারে দেখাতে পারে তাহলে আমার সেখান থেকে ভ্যালু নিতে সুবিধা হবে। এটা মনে করে আমি কোড লেখা শুরু করে দিলাম।
# Importing necessary libraries
from scipy.ndimage import imread
import matplotlib.pyplot as plt
import matplotlib.image as mpimg
from skimage.color import rgb2gray
import matplotlib.patches as patches
import numpy as np
from PIL import Image
import math
from skimage import io, filters, draw
# Loading and converting an image into numpy array
one_array = np.array(Image.open(load_digit(1)[0]), dtype=np.uint8)
# Getting region of interest [ROI]
height = math.floor(32/3)
width = math.floor(32/3)
for i in range(3):
for j in range(3):
fig, ax = plt.subplots(1)
ax.imshow(one_array)
print("Patch Coordinates: {}, {}".format(j, i))
rect = patches.Rectangle((height * i, width * j), height, width, linewidth=5, edgecolor='r', facecolor='none')
ax.add_patch(rect)
plt.show()
আউটপুট আসল এটা,
Patch Coordinates: 0, 0
Patch Coordinates: 1, 0
Patch Coordinates: 2, 0
Patch Coordinates: 0, 1
Patch Coordinates: 1, 1
Patch Coordinates: 2, 1
Patch Coordinates: 0, 2
Patch Coordinates: 1, 2
Patch Coordinates: 2, 2
যেহেতু এটা বারংবার ব্যবহার করব তাই এটাকে ফাংশন বানানোই উচিৎ বলে মনে হল।
def draw_roi(digit, index):
image_array = np.array(Image.open(load_digit(digit)[index]), dtype=np.uint8)
height = math.floor(32/3)
width = math.floor(32/3)
for i in range(3):
for j in range(3):
fig, ax = plt.subplots(1)
ax.imshow(image_array)
print("Patch Coordinates: {}, {}".format(j, i))
rect = patches.Rectangle((height * i, width * j), height, width, linewidth=5, edgecolor='r', facecolor='none')
ax.add_patch(rect)
plt.show()
এবার আমি সহজেই যে ডিজিট ও যত নম্বর ছবির রিজিওন দেখতে চাই এই ফাংশন করলেই হবে।
এখন সবচেয়ে গুরুত্বপূর্ণ কাজ, ROI এ পিক্সেল ডেনসিটি মেজার করতে হবে এবং পজিশনওয়াইজ ডেনসিটি কত হয় তার একটা হিসেব রাখতে হবে। যেমন শুন্য এর ক্ষেত্রে
দরজায় কড়া নেড়ে উঠল, আমি গিয়ে দরজা খুলতেই দেখি ফেলুদা। সটান ঢুকে সোফায় গা এলিয়ে দিয়ে বলল। চা বলে দিয়ে আয়তো। চায়ের কথা বলে ফেলুদার সামনে বসলাম। এরমধ্যে ফেলুদা একটা চারমিনার ধরিয়ে ধোঁয়ার রিং ছাড়তে ছাড়তে বলল, "বল কী জানতে চাস!"
বাহ, মেঘ না চাইতেই জল, সচরাচর এমনটা হয় না। সুযোগটা আমি লুফে নিয়ে বললাম, "ডায়রিটা কেন খুনের দিন নিল না?"
-"তুই বুঝলি কী করে খুন যে করেছে ডাইরিও সে নিয়েছে?"
এই রে, এটা তো মাথায় আসে নি। ফেলুদা বলল,
-"এখানেই বিষয়টা অত্যাধিক জটিল হয়ে যাচ্ছে। যে খুন করেছে কিন্তু খুনের দিন ডায়রি নেয় নি। ধরি খুনি
-"তুমি এতক্ষণ কোথায় ছিলে?"
ফেলুদা সেকথার জবাব না দিয়ে বলল, "তোর কাজ কতদূর?"
-"এগোচ্ছে, আমি পজিশন ভেদে পিক্সেল ডেনসিটি মাপতে যাচ্ছিলাম। আচ্ছা ফেলুদা, কাগজে যে হিবিজিবি লেখা ছিল, তার কিছু বুঝতে পেরেছ?"
-"সেটা বোঝার জন্যই বেরিয়েছিলাম, দুইজন ম্যাথেমেটিশিয়ানের সাথে দেখা করে, তিনটে লাইব্রেরি ঘুরে আর একজন নিউরোসায়েন্টিস্টের সাথে দেখা করে এলাম।"
-"নিউরোসায়েন্টিস্ট?! এখানে নিউরোসায়েন্স আসলো কোত্থেকে? ম্যাথেমেটিশিয়ানের ব্যাপার না হয় বুঝলাম।"
-"তোর অত বুদ্ধি থাকলে আমার কাজটা তুইই করতি, এবার শোন নিউরোসায়েন্টিস্ট থেকে অদ্ভুত সব তথ্য পেলাম তবে সেটার ধারণা পাই লাইব্রেরি থেকে, বললে চিন্তাও করতে পারবি না জিনিসটা এত প্যাঁচালো, যা জানলাম সেটা হল...."