الدرس 2 من 8

الضرب النقطي والتشابه

إزاي نتفليكس بتعرف إنك هتحب فيلم معين؟

الـ Dot Product

بتضرب كل مكوّن في اللي قصاده، وتجمع النتايج كلها. النتيجة رقم واحد مش متجه.

[1, 2, 3] · [4, 5, 6] = 1×4 + 2×5 + 3×6 = 32
🛒 مثال من السوبر ماركتانت عارفه من غير ما تاخد بالك: الكميات اللي اشتريتها «dot» الأسعار = الفاتورة.
receipt.py
quantities = [2, 1, 3]        # milk, bread, eggs (packs)
prices = [45, 10, 90]         # price of each

bill = sum(q * p for q, p in zip(quantities, prices))
print("Total bill:", bill, "EGP")

الـ Dot product بيقيس التشابه

لو متجهين بيشاوروا على نفس الاتجاه، الـ dot product بيبقى كبير وموجب. لو عكس بعض بيبقى سالب. ولو ملهمش علاقة ببعض (زاوية قايمة) بيبقى صفر.

بس الرقم ده بيتأثر بحجم المتجهات. عشان كده بنقسمه على طولهم، فيطلعلنا رقم بين -1 و 1 اسمه Cosine Similarity:

similarity = (a · b) / (‖a‖ × ‖b‖)١ يعني متطابقين في الاتجاه، صفر يعني ملهمش علاقة، و -١ يعني عكس بعض

مثال: مين ذوقه شبه مين؟

٣ أشخاص قيّموا أنواع الأفلام من ١ لـ ٥: أكشن، كوميدي، رومانسي.

similarity.py
import math

def dot(a, b):
    return sum(x * y for x, y in zip(a, b))

def norm(v):
    return math.sqrt(dot(v, v))

def cosine(a, b):
    return dot(a, b) / (norm(a) * norm(b))

#         action, comedy, romance
ahmed = [5, 1, 2]
sara = [4, 2, 1]
omar = [1, 5, 5]

print("Ahmed vs Sara:", round(cosine(ahmed, sara), 2))
print("Ahmed vs Omar:", round(cosine(ahmed, omar), 2))

أحمد وسارة ذوقهم قريب جداً، فلو سارة حبت فيلم أكشن جديد، نرشحه لأحمد. ده أبسط شكل من Recommendation Systems.

🤖 نفس الفكرة في ChatGPT و Claudeفي تقنية اسمها RAG (هتتعلمها في المرحلة ٧)، بنحوّل كل فقرة في مستنداتك لمتجه embedding، ولما تسأل سؤال بنحوّله لمتجه برضو، ونجيب الفقرات اللي الـ cosine similarity بينها وبين سؤالك أعلى حاجة. هي هي الدالة اللي فوق.
الدرس اللي فات