Ana içeriğe geç

Giriş7 dk

Nokta çarpım: benzerliğin matematiği

Önkoşul:Vektör işlemleri ve norm

Kanca

İki film önerisi sistemi düşün: biri “Kullanıcı 1000 film izlemiş, Kullanıcı 2 sadece 10 film izlemiş” diye onları FARKLI zevk profiline mi koymalı? Yoksa SADECE neyi SEVDİKLERİNE mi bakmalı?

Sezgi

Nokta çarpım (dot product), iki vektörün karşılık gelen bileşenlerini çarpıp toplayarak TEK bir sayı üretir. Bu sayının İŞARETİ, iki vektörün YÖNÜ arasındaki ilişkiyi anlatır — ve normlara bölündüğünde (kosinüs benzerliği), tam olarak “yön ne kadar aynı” sorusuna cevap verir.

-6-4-20246-6-4-20246

A = (3.0, 0.0)  B = (0.0, 4.0)

A · B = 0.00 (neredeyse DİK)

Noktaları sürükle (ya da odaklayıp ok tuşlarını kullan).

Mekanizma

Nokta çarpımı elle ve NumPy ile hesaplayalım — aynı sonucu vermeliler:

Nokta çarpım: bileşen bileşen çarp, topla

# NOKTA ÇARPIM (dot product), iki vektörün KARŞILIK gelen bileşenlerini çarpıp
# TOPLAMAKTIR -- tek bir SAYI verir (bir vektör DEĞİL).
A = np.array([3, 1])
B = np.array([2, 4])

elle = A[0] * B[0] + A[1] * B[1]
numpy_ile = np.dot(A, B)

print(f"A = {A.tolist()}, B = {B.tolist()}")
print(f"Elle: {A[0]}*{B[0]} + {A[1]}*{B[1]} = {A[0]*B[0]} + {A[1]*B[1]} = {elle}")
print(f"np.dot(A, B) = {numpy_ile}")
print(f"\nİki yöntem AYNI sonucu veriyor: {elle == numpy_ile}")
A = [3, 1], B = [2, 4]
Elle: 3*2 + 1*4 = 6 + 4 = 10
np.dot(A, B) = 10

İki yöntem AYNI sonucu veriyor: True

Şimdi İŞARETİN ne anlattığına bakalım:

İşaret = yön ilişkisi

# Nokta çarpımın İŞARETİ, iki vektörün YÖNÜ arasındaki ilişkiyi anlatır.
ayni_yon = np.array([4, 1])
dik = np.array([1, -4])
zit_yon = np.array([-3, -1])

print("\nSabit vektör: v = [4, 1]")
print(f"AYNI yöne yakın bir vektörle (u=[4,1] ile kendisi): v . u = {np.dot(ayni_yon, ayni_yon)} (POZİTİF)")
print(f"DİK bir vektörle (u=[1,-4]): v . u = {np.dot(ayni_yon, dik)} (SIFIRA ÇOK YAKIN/SIFIR -- neredeyse DİK)")
print(f"ZIT yöne yakın bir vektörle (u=[-3,-1]): v . u = {np.dot(ayni_yon, zit_yon)} (NEGATİF)")
print("\nNokta çarpımın İŞARETİ: pozitif -> aynı yöne yakın, sıfıra yakın -> dik, negatif -> zıt yöne yakın.")

Sabit vektör: v = [4, 1]
AYNI yöne yakın bir vektörle (u=[4,1] ile kendisi): v . u = 17 (POZİTİF)
DİK bir vektörle (u=[1,-4]): v . u = 0 (SIFIRA ÇOK YAKIN/SIFIR -- neredeyse DİK)
ZIT yöne yakın bir vektörle (u=[-3,-1]): v . u = -13 (NEGATİF)

Nokta çarpımın İŞARETİ: pozitif -> aynı yöne yakın, sıfıra yakın -> dik, negatif -> zıt yöne yakın.

Matematik

Nokta çarpım ve kosinüs benzerliği
AB=i=1nAiBiA \cdot B = \sum_{i=1}^{n} A_i B_icos(θ)=ABAB\cos(\theta) = \frac{A \cdot B}{\|A\| \, \|B\|}

Nokta çarpımın kendisi, vektörlerin UZUNLUĞUNDAN etkilenir (uzun vektörler, doğal olarak daha büyük nokta çarpım verir). Bunu normlara BÖLMEK, sadece ARADAKİ AÇIYA (yöne) bakan bir ölçü verir — bu da KOSİNÜS BENZERLİĞİDİR.

Kod

Kosinüs benzerliği: yönü karşılaştır, büyüklüğü yok say

# Ama nokta çarpımın BÜYÜKLÜĞÜ, vektörlerin UZUNLUĞUNA da bağlıdır -- bu yüzden
# "benzerlik" ölçmek için nokta çarpımı normlara BÖLERİZ: KOSİNÜS BENZERLİĞİ.
def kosinus_benzerligi(u, v):
    return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))

# Üç KULLANICI zevk profili: [aksiyon puanı, romantik puanı] (0-5 arası)
kullanici_1 = np.array([4, 1])   # aksiyonu çok sever, romantiği az
kullanici_2 = np.array([5, 1.5]) # AYNI oranda -- aksiyonu çok sever (sadece daha çok film izlemiş)
kullanici_3 = np.array([1, 4])   # TERSİ oran -- romantiği çok sever

benzerlik_1_2 = kosinus_benzerligi(kullanici_1, kullanici_2)
benzerlik_1_3 = kosinus_benzerligi(kullanici_1, kullanici_3)

print(f"\nKullanıcı 1: {kullanici_1.tolist()}  (aksiyon=4, romantik=1)")
print(f"Kullanıcı 2: {kullanici_2.tolist()}  (aksiyon=5, romantik=1.5)")
print(f"Kullanıcı 3: {kullanici_3.tolist()}  (aksiyon=1, romantik=4)")
print(f"\nKosinüs(K1, K2) = {benzerlik_1_2:.3f}  -- AYNI ORANDA zevkler, norm farklı olsa BİLE yüksek çıkar")
print(f"Kosinüs(K1, K3) = {benzerlik_1_3:.3f}  -- TERS zevk profili, düşük çıkar")
print("\nKosinüs benzerliği, 'BÜYÜKLÜĞÜ' değil 'YÖNÜ' karşılaştırır -- Kullanıcı 2 daha ÇOK film")
print("izlemiş olsa da (vektörü daha UZUN), ZEVK PROFİLİ (yönü) Kullanıcı 1 ile NEREDEYSE AYNI.")

Kullanıcı 1: [4, 1]  (aksiyon=4, romantik=1)
Kullanıcı 2: [5.0, 1.5]  (aksiyon=5, romantik=1.5)
Kullanıcı 3: [1, 4]  (aksiyon=1, romantik=4)

Kosinüs(K1, K2) = 0.999  -- AYNI ORANDA zevkler, norm farklı olsa BİLE yüksek çıkar
Kosinüs(K1, K3) = 0.471  -- TERS zevk profili, düşük çıkar

Kosinüs benzerliği, 'BÜYÜKLÜĞÜ' değil 'YÖNÜ' karşılaştırır -- Kullanıcı 2 daha ÇOK film
izlemiş olsa da (vektörü daha UZUN), ZEVK PROFİLİ (yönü) Kullanıcı 1 ile NEREDEYSE AYNI.
Üç kullanıcı zevk vektörünü gösteren ok diyagramı; K1 ve K2 neredeyse aynı yönde, K3 çok farklı yönde.
K1=(4,1) ve K2=(5,1.5) FARKLI uzunlukta ama NEREDEYSE AYNI yönde -- kosinüs benzerliği 0.999. K3=(1,4) çok FARKLI yönde -- kosinüs benzerliği sadece 0.471.

Nerede işe yarar

Kosinüs benzerliği, kursun İLERİDEKİ en önemli araçlarından biridir:

  • NLP kategorisinde, iki kelime embedding’inin “ANLAMCA yakın” olup olmadığı, TAM OLARAK kosinüs benzerliğiyle ölçülür.
  • Prompt Mühendisliği kategorisinde (11-12. dersler), bir sorgunun HANGİ belgeyle eşleştiğini bulmak (TF-IDF tabanlı arama), kosinüs benzerliğiyle yapıldı.
  • Öneri sistemlerinde, “bu kullanıcıya benzer kullanıcılar” bulmak, zevk vektörleri arasındaki kosinüs benzerliğine dayanır.

Bu 2 hatayı yaparsın:

  1. Nokta çarpımın KENDİSİNİ “benzerlik ölçüsü” sanmak — HAYIR, o BÜYÜKLÜKTEN etkilenir; gerçek benzerlik için normlara BÖLMEN (kosinüs) gerekir.
  2. Nokta çarpımı SIFIR çıkan iki vektörü “ilgisiz” sanmak — aslında bu, vektörlerin birbirine tam DİK (90°) olduğu anlamına gelir, “ilgisiz” değil “geometrik olarak bağımsız”.

Kendini test et

1. Notebook'ta Kullanıcı 1=[4,1] ve Kullanıcı 2=[5,1.5] için kosinüs benzerliği 0.999 çıkıyor, ama bu iki vektörün NORMU birbirinden FARKLI. Bu NASIL mümkün?
  1. Bir hesaplama hatası
  2. Kosinüs benzerliği normlara BÖLÜNEREK hesaplanır -- bu yüzden vektörlerin UZUNLUĞU değil, sadece YÖNÜ karşılaştırılır; iki vektör AYNI ORANDA (yönde) olduğu sürece uzunlukları farklı olsa bile benzerlik yüksek çıkar (doğru cevap)
  3. Kullanıcı 2 daha az film izlediği için
  4. NumPy yuvarlama hatası yaptığı için

Neden: kosinus-benzerlik bloğunda, K1 ve K2 FARKLI normlara sahip ama AYNI orana (yaklaşık 4:1) sahip -- bu yüzden kosinüs benzerliği neredeyse 1.0 çıkıyor.

2. aci-ve-isaret bloğunda v=[4,1] ile dik=[1,-4] arasındaki nokta çarpım TAM OLARAK 0 çıkıyor. Bu NE anlama gelir?
  1. İki vektörün ilgisiz olduğu
  2. İki vektörün birbirine DİK (90°) olduğu -- nokta çarpımın sıfıra yakın/sıfır olması, GEOMETRİK olarak dikliğin İŞARETİDİR (doğru cevap)
  3. Bir hesaplama hatası olduğu
  4. Vektörlerden birinin sıfır vektörü olduğu

Neden: aci-ve-isaret bloğunun çıktısında bu AÇIKÇA belirtiliyor: 'SIFIRA ÇOK YAKIN/SIFIR -- neredeyse DİK'.

3. Prompt Mühendisliği kategorisinin TF-IDF tabanlı arama derslerinde (11-12), bir sorgunun en UYGUN belgeyi bulması NASIL çalışıyordu?
  1. Belgeleri alfabetik sıralayarak
  2. Sorgu ve HER belgeyi vektöre çevirip, ARALARINDAKİ kosinüs benzerliğini hesaplayarak -- en YÜKSEK benzerliğe sahip belge, en UYGUN eşleşme oluyordu (doğru cevap)
  3. Belgelerin uzunluğuna bakarak
  4. Rastgele bir belge seçerek

Neden: kullanım bölümünde bu AÇIKÇA bağlanıyor: TF-IDF tabanlı arama, TAM OLARAK bu derste görülen kosinüs benzerliği formülünü kullanıyordu.

Özet

Özet

  • Nokta çarpım (A·B), karşılık gelen bileşenleri çarpıp toplayarak TEK bir sayı üretir.
  • Nokta çarpımın İŞARETİ yön ilişkisini anlatır: pozitif = aynı yöne yakın, sıfıra yakın = dik, negatif = zıt yöne yakın.
  • Kosinüs benzerliği (A·B / (||A|| ||B||)), nokta çarpımı normlara bölerek SADECE yönü karşılaştırır -- büyüklükten bağımsızdır.
  • Bu dersteki K1-K2 örneği (kosinüs=0.999) bunu KANITLIYOR: FARKLI uzunluktaki vektörler, AYNI yönde olduğunda YÜKSEK benzerlik verir.
  • Kosinüs benzerliği, NLP embedding karşılaştırmalarının ve Prompt Mühendisliği'ndeki belge aramasının TEMELİDİR.
Sonraki adım: Matris nedir →