فرض کنید n تا توپ قرمز داریم و m تا توپ آبی. توپها را میریزیم توی یک کلاه. حالا اگر یک توپ را به صورت تصادفی برداریم احتمال قرمز بودن توپ چقدر میشود؟
جواب ساده است، احتمال قرمز بودن توپ میشود
مثلا اگر ۲ تا توپ قرمز داشته باشید و ۳ تا توپ آبی، احتمال برداشتن یک توپ قرمز ۰/۴۰میشود.
*- حالا اگر من یک توپ از درون کلاه بردارم و بدون نگاه کردن به رنگ توپ بخواهم یک توپ دیگر بردارم، احتمال قرمز بودن توپ بعدی چقدر است؟
*- حالا اگر من اول k توپ بردارم و بدون نگاه کردن به رنگشان بخواهم توب k+1 را بردارم. توپ k+1 با چه احتمالی قرمز خواهد بود؟
این مساله خواص جالبی داره، که بعدا در مورد آنها خواهم نوشت.
پردهی اول:
یادش بخیر راهنمایی بودم که کتاب کوههای سفید را با یک از هم کلاسیها که اسمش یادم نیست خواندم. بعد تا مدتها توی کف داستان بودیم سعی میکردیم ادامهی اون را بسازیم.
پردهی دوم:
شهر طلا و سرب را خوب یادمه چی شد که پیدا کردم. دبیرستان بودیم سال سوم. یکی از بچههای ردیف چلو که حالا برای خودش آقای دکتری شده یک کتاب دستش بود داشت سر کلاس یواشکی معلم میخوندش. من هم از پش سر یک چیزهایی میدیدم. کتاب آشنا بود برام! بعد که کتاب را دیدم بلافاصله دیدم که این کتاب باید یک ربطی به کتاب کوههای سفید داشته باشه (مترجم نامرد, ننوشته بود که این کتاب ادامهی کوههای سفیده!) به این ترتیب من قسمت دوم را خواندم و آقای دکتر قسمت اول را
پردهی سوم:
اما خواندن قسمت سوم برمیگرده به دوران دانشجویی! حالا ملت چی میخوندند ما چی میخواندیم بماند
. اما به لطف وبلاگهای فارسی که اون موقع تازه جون گرفته بودند و گوگل هم اونها را کم-کم-ک توی نتایج جستجو نشان میداد, توانستم بفهمم که اسم قسمت داستان «برکهی آتش» است و آن را خواندم.
و امروز:
هر چند از شنیدن خبر مرگ جان کریستوفر ناراحت شدم. ولی حداقل خیالم راحت شد که داستان همان سه قسمتی را داشته که من خواندهام و قسمت چهارمی وجود نداشته.
پس نوشت: ظاهرا یک قسمت دیگر هم بوده (لینک) بروم پیداش کنم و بخوانمش
داستان از اینجا شروع شد که برای مینیم کردن خطای یک مدل نیاز داشتم گرادیان خطا نسبت به پارامترهای سیستم را حساب کنم و بعد هم با استفاده از یک روش بهینهسازی بر مبنای گرادیان نقطهی بهینه را پیدا کنم. وقتی کد حساب کردن تابع هدف و مشتقاش را نوشتم و به الگوریتم بهینهسازی دادم خیلی خوب کار کرد و مدل خیلی خوبی تحویلام داد. اما یک احساس درونی به من میگفت که باید بیشتر دقت کنم، برای همین تصمیم گرفتم که گرادیان را به روش عددی هم پیدا کنم و با خروجی برنامهام مقایسه کنم. واا! احساسم درست بود، مقادیر محاسبه شده کد غلط غلوط بود. ولی اگر غلطه پش چرا مدل بدست آمده خوب کار میکند؟ یک کمی که دیباگ کردم توانستم مشکل را پیدا و حل کنم. ولی چند روز گذشته ذهنم مشغول این نکته بود که چرا یک خروجی غلط باید به جواب درست منتهی بشود؟!؟ جوابی که بهش رسیدم (بدون اثبات ریاضی) این است که :
برای رسیدن به نقطهی بهینه توسط یک الگوریتم بهینهسازی بر مبنای گرادیان، چیزی که خیلی مهم است، علامت گرادیان است و این که کجاها مقدارش صفر میشود و وجود سایر خطاها فقط زمان رسیدن به نقطهی بهینه را طولانیتر میکنند.
در حال حاضر برای قضیهبالا یک اثبات ساده پیدا کردهام، البته برای حالتی که گرادیان واقعی تابع پیوسته باشد، از گامهای خیلی کوچک استفاده کنیم، الگوریتم بهینهسازی هم فقط به مشق اول نگاه کند و کاری به مشتقهای مرتبهی بالاتر کاری نداشته باشد.
بالاخره امروز موفق شدم که با رییس کوچک (شنگول) یک قرار ملاقات بگذارم. فکر کن یک هفته بدوی و ایمیل بزنی برای یک قرار ۱۰ دقیقهای!

Click the image to see it in the original size
Originally from: http://herbsutter.com/2012/01/10/map-of-c/
صورت مساله را میتوانید اینجا و یا اینجا ببینید.
و اما جواب مسالهی اول:
این مساله سادهای بود و عملا نیاز به نوشتن برنامه نداشت.
فرض کنید فقط میخواستیم جمع اعداد کوچکتر از ۱۰۰۰ را که بر ۳ بخشپذیرند را محاسبه کنیم (
)

و اگر فقط میخواستیم جمع اعداد کوچکتر از ۱۰۰۰ را که بر ۵ بخشپذیرند را محاسبه کنیم (
)

حالا، اگر به جمع
و
نگاه کنیم میبینیم که این تقریبا همان چیزی است که به دنبال آن بودهایم. تنها تفاوت در این است که اعدادی مانند ۱۵ و ۳۰ و ... را ۲ بار جمع زدهایم که باید اصلاحشان کنیم. پس حاصل جمع مورد نظر ما میشود: ۲۳۳۱۶۸

صورت مسالهی ۱
مجوعهی اعداد طبیعی کوچکتر از ۱۰ که بر ۳ و ۵ بخشپذیراند شامل ۳، ۵، ۶ و ۹ است و حاصل جمع این اعداد ۲۳ است. حالا شما مجموع تمام اعضای مجموعهی اعداد طبیعی کوچکتر از ۱۰۰۰ را که بر ۳ و ۵ بخشپذیرند را بدست آورید؟
خوب این اول مساله بود، خیلی آسان و برای دستگرمی. منتظر مسایل جالبتر باشید
راستی برای چک کردن جوابهای خودتان، بهترین کار عضو شدن در سایت پروژهی اویلر میباشد که کاملا هم مجانیه. ولی اگر حوصله ندارید، میتوانید حدستان را به عنوان کامنت بگذارید و منتظر پست بعدی باشید.
پروژهی اویلر، مجموعهای مسالههای جالبی که اگر اهل برنامهنویسی باشید احتمالا میتواند تا مدتها شما را سرگرم کند. یک نگاهی بیندازید جالبه
http://projecteuler.net

اول قرار بود بروم ماکروسافت، بعد یک آفر هم از گوگل آمد، خوشحال شدم و از خوشحالی داشتم میترکیدم. گفتم ۳ ماه اونجا و ۳ ماه هم اینجا. ۶ ماه میریم هم فال و هم تماشا. خوب کارها خراب شد فعلا، مت بیچاره که کلی ذوق ۶ ماه سفر را کرده بود و من هم که کلا توی آسمانها بودم. خوب امروز صبح ساعت ۷:۲۴ خبر رسید که از آسمان به زمین برگردم. خوب این هم از عوارض صبح زود بیدار شدنه دیگه! خبرهای بد را زود میشنوی.
خوب، حالا اوضاع خیلی هم بد نیست. یکی از این دو جا را باید بروم. تمام تلاشم برای رفتن به هر دو به نتیجه نرسید. مت که حسابی پکر شد از شنیدن خبر. بیچاره اون هم امروز زود بیدار شده بود
من هم سرم درد میکنه و نمیتوانم کار کنم، نمیدانم به کدام یکی زنگ بزنم و بگم شرمنده نمیتوانم بیام. ناراحت اونها نیستم، ناراحت پت و مت هستم که فعلا باید از آسمان پایین بیایند و کمی روی زمین راه بروند.
از یک مدت پیش شروع کردم به خارج کردن کدهام از Matlab. برای خیلی از کارهای اسکریپتی، پایتون گزینهی خیلی خوبی بود. اما خوب وقتی بحث کارهای محاسباتی و حجم بالای داده میرسه، C++/C گزینهی بسیار جذابتری میشود. یکی از انگیزههای اصلی من در استفاده از Matlab پیادهسازی و استفادهی خوب و موثر از کتابخانههای توابع BLAS/LAPACK بوده. چون بدون آنها نوشتن کدها سریع تقریبا غیر ممکن است.

اما مشکل اصلی من چی بود؟ کتابخانههای BLAS/LAPACK فقط رابط برنامهنوسی با زبان C دارند و برای همین خیلی خوشدست نیستند (سرعت در مقابل راحتی). چند باری سعی کرده بودن از رابطهایی که برای کار با ++C طراحی شدهاند استفاده کنم، اما همچنان یا کار کردن باهاشون راحت نبود و یا سرعت محاسبات را به شدت کاهش میدادند. اخیرا کتابخانهی Armadillo را پیدا کردهام و با چند بار استفاده به این نتیجه رسیدهام که گزینهی خیلی خوبیه! هم راحت است و هم سریع.
کسی نظری نداره؟ کسی از کتابخانهی مشابهی استفاده کرده که راضی باشه؟ یا کسی مشکلی در استفاده از Armadillo دیده؟