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ı farklı zevk profiline mi koymalı? Yoksa sadece neyi sevdiklerine 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 işareti, 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.
A = (3.0, 0.0) B = (0.0, 4.0)
A · B = 0.00 (neredeyse dik)
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 çarpım (dot product), iki vektörün karşılık gelen bileşenlerini çarpıp
# toplamaktır -- tek bir sayı verir (bir vektör değil).
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 aynı 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 aynı sonucu veriyor: TrueŞimdi işaretin ne anlattığına bakalım:
İşaret = yön ilişkisi
# Nokta çarpımın işareti, 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"Aynı yöne yakın bir vektörle (u=[4,1] ile kendisi): v . u = {np.dot(ayni_yon, ayni_yon)} (pozitif)")
print(f"Dik bir vektörle (u=[1,-4]): v . u = {np.dot(ayni_yon, dik)} (sıfıra çok yakın/sıfır -- neredeyse dik)")
print(f"Zıt yöne yakın bir vektörle (u=[-3,-1]): v . u = {np.dot(ayni_yon, zit_yon)} (negatif)")
print("\nNokta çarpımın işareti: 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]
Aynı yöne yakın bir vektörle (u=[4,1] ile kendisi): v . u = 17 (pozitif)
Dik bir vektörle (u=[1,-4]): v . u = 0 (sıfıra çok yakın/sıfır -- neredeyse dik)
Zıt yöne yakın bir vektörle (u=[-3,-1]): v . u = -13 (negatif)
Nokta çarpımın işareti: 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
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 aradaki açıya (yöne) bakan bir ölçü verir — bu da kosinüs benzerliğidir.
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öleriz: kosinüs benzerliği.
def kosinus_benzerligi(u, v):
return np.dot(u, v) / (np.linalg.norm(u) * np.linalg.norm(v))
# Üç kullanıcı 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]) # Aynı oranda -- aksiyonu çok sever (sadece daha çok film izlemiş)
kullanici_3 = np.array([1, 4]) # Tersi 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} -- aynı oranda zevkler, norm farklı olsa bile 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 profili (yönü) Kullanıcı 1 ile neredeyse aynı.")
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 -- aynı oranda zevkler, norm farklı olsa bile 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 profili (yönü) Kullanıcı 1 ile neredeyse aynı.Nerede işe yarar
Kosinüs benzerliği, kursun ilerideki 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 hangi 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:
- Nokta çarpımın kendisini “benzerlik ölçüsü” sanmak — hayır, o büyüklükten etkilenir; gerçek benzerlik için normlara bölmen (kosinüs) gerekir.
- Nokta çarpımı sıfır çıkan iki vektörü “ilgisiz” sanmak — aslında bu, vektörlerin birbirine tam dik (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 farklı. Bu nasıl mümkün?
- Bir hesaplama hatası
- 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 aynı oranda (yönde) olduğu sürece uzunlukları farklı olsa bile benzerlik yüksek çıkar (doğru cevap)
- Kullanıcı 2 daha az film izlediği için
- NumPy yuvarlama hatası yaptığı için
Neden: kosinus-benzerlik bloğunda, K1 ve K2 farklı normlara sahip ama aynı 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?
- İki vektörün ilgisiz olduğu
- İki vektörün birbirine dik (90°) olduğu -- nokta çarpımın sıfıra yakın/sıfır olması, geometrik olarak dikliğin işaretidir (doğru cevap)
- Bir hesaplama hatası olduğu
- Vektörlerden birinin sıfır vektörü olduğu
Neden: aci-ve-isaret bloğunun çıktısında bu açıkça belirtiliyor: 'Sıfıra çok yakın/sıfır -- neredeyse dik'.
3. Prompt Mühendisliği kategorisinin TF-IDF tabanlı arama derslerinde (11-12), bir sorgunun en uygun belgeyi bulması nasıl çalışıyordu?
- Belgeleri alfabetik sıralayarak
- Sorgu ve her belgeyi vektöre çevirip, aralarındaki kosinüs benzerliğini hesaplayarak -- en yüksek benzerliğe sahip belge, en uygun eşleşme oluyordu (doğru cevap)
- Belgelerin uzunluğuna bakarak
- Rastgele bir belge seçerek
Neden: kullanım bölümünde bu açıkç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 işareti 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 kanıtlıyor: farklı uzunluktaki vektörler, aynı 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 temelidir.