علی همیشه در آرزوی یافتن راهی برای ارتباط برقرار کردن بین جهانهای موازی است.او این جهانها را به صورت بردارهای ۳۰۰ بعدی مدل کرده است. یعنی هر آیتم در یک جهان یک بردار ۳۰۰ بعدی است. بنابراین با زیر هم قرار دادن آیتمهای یک جهان یک ماتریس n*۳۰۰ تولید میشود که توصیف جهان است.
علی توصیفهای دو جهان را در قالب دو فایل X_train.npy و Y_train.npy را در اختیار دارد.او سعی دارد تا ماتریس انتقالی پیدا کند(برای رفتن از جهان X به جهان Y) که با ضرب جهان اول در ماتریس انتقال به جهان دوم منتقل شود.
$$XR \approx Y $$
علی برای آنکه بتواند ماتریس R را بیابد از توان دوم نرم Frobenius ارور استفاده میکند. او قصد دارد با استفاده از الگوریتم Gradient Descent مقدار بهینه این تابع را بیابد. $$J ={\frac {1}{n}} ||\mathbf{Y-XR}||_{F}^2$$
نرم Frobenius به صورت زیر تعریف میشود:
$$||\mathbf{A}|| _{F} \equiv \sqrt{\sum_{i=1}^{m} \sum_{j=1}^{n} |a_{ij} |^{2} }$$
شما باید به علی کمک کنید. فایل submit.py شامل دو تابع است. **تنها کتابخانه مورد استفاده در این پروژه numpy هست**. در تابع train_transformation شما ماتریس فضای اول و فضای دوم (X_train , Y_train) و مقدار اولیه برای ماتریس R را دریافت خواهید کرد. همچنین عددی به عنوان تعداد قدمهای الگوریتم Gradient Dscent و مقدار learning rate به تابع شما پاس داده میشود. هدف این تابع آن است تا الگوریتم GD را برای مینیمم کردن J پیاده کنید. دقت کنید حتما از پارامترهای train_steps , learning_rate در پیاده سازی خود استفاده کنید. استفاده از هیچ تابع از پیش تعریف شده هم مجاز نیست. مدیر علی در این باره بسیار جدی است!
بعد از پیدا کردن نتیجه برای یک بردار در فضای جدید، شما باید نزدیک ترین بردار به بردار پیدا شده در فضای جدید را بیابید(طبیعتا ماتریس انتقال ما یک ماتریس تقریبست!). در تابع nearest_neighbor شما یک بردار از فضای X با عنوان متغیر v و همهی بردارهای موجود در فضای Y(جهان هدف) را دریافت میکنید.همچنین پارامتر k بیان میکند که چه تعداد نزدیکترین بردارها در فضای ِY به بردار v بازگردانده شود. هدف آن است شما یک cosine similarity در این تابع پیدا کنید. در نهایت این تابع ایندکس k بردار نزدیک به v از فضای برداری Y را به شما بازمیگرداند.(بردار v با همهی بردارهای فضای Y مقایسه میشود)
![{\displaystyle {\text{similarity}}=\cos(\theta )={\mathbf {A} \cdot \mathbf {B} \over \|\mathbf {A} \|\|\mathbf {B} \|}={\frac {\sum \limits _{i=1}^{n}{A_{i}B_{i}}}{{\sqrt {\sum \limits _{i=1}^{n}{A_{i}^{2}}}}{\sqrt {\sum \limits _{i=1}^{n}{B_{i}^{2}}}}}},}](https://wikimedia.org/api/rest_v1/media/math/render/svg/1d94e5903f7936d3c131e040ef2c51b473dd071d)
امتیاز نهایی شما به صورت زیر محاسبه میشود:
$$ score = 9.09*accuracy-4.082 $$
+ در فایلی که در اختیار شما گذاشته شده چیزی تغییر ندهید و فقط کدهای خود را اضافه کنید.
+ هیچ کتابخانهای به جز numpy قابل استفاده نیست و از هیچ تابع پیش فرضی هم استفاده نکنید.
+ دادههای در زمان داوری با بردارهایی به جز بردارهای آموزش بررسی خواهند شد.
+ برای دریافت نمره سوال باید هر دو تابع پاسخ صحیح را برگردانند.
در نهایت فایل submit.py را ارسال کنید.
لینک فایل پروژه را از
[اینجا]( [این لینک](/problemset/assignments/4367/download_problem_initial_project/83362/) )
دانلود کنید.