Kursus Matematika untuk AI · Pelajaran 44 dari 180

Sudut dan Kesamaan Kosinus

Hitung sudut dan kesamaan kosinus dari koordinat vektor, normalkan embedding secara bertanggung jawab, dan tangani vektor nol dalam kode retrieval.

Bagikan artikel ini

Dua dokumen dapat direpresentasikan sebagai vektor x=(1,2)x=(1,2) dan y=(10,20)y=(10,20). Hasil dot product mentahnya adalah 5050, sehingga pencarian berbasis dot product melihat vektor kedua sebagai vektor yang jauh lebih besar. Namun, arahnya identik: setelah dibagi dengan panjang kedua vektor, kesamaan kosinusnya adalah 11. Aturan penilaian mengubah arti “serupa”.

Pada akhir pelajaran ini, Anda akan mampu menghitung sudut dan kesamaan kosinus dari koordinat, menjelaskan mengapa penskalaan positif tidak mengubah kosinus, serta menangani vektor nol tanpa memberinya arah yang sebenarnya tidak dimilikinya.

Hasil belajar: Menghitung sudut dan kesamaan kosinus serta menangani batas vektor nol.

Pelajaran ini menggabungkan dua gagasan sebelumnya: Pelajaran 039: Norm mengukur ukuran vektor memberi kita panjang Euclidean, sedangkan Pelajaran 041: Inner product mengukur keselarasan memberi kita dot product. Pelajaran 043: Jarak bergantung pada geometri yang dipilih kemudian menunjukkan mengapa jarak mempertahankan magnitudo dalam perbandingan. Bagian 3.4 dari buku resmi Mathematics for Machine Learning mengembangkan hubungan sudut tersebut. Contoh, kode, visual, dan asesmen di sini adalah karya asli.

Sudut memisahkan arah dari panjang

Untuk dua vektor tak nol x,y∈Rnx,y\in\mathbb{R}^n, gunakan θ\theta sebagai sudut di antara keduanya. Dot product dan norm Euclidean yang biasa adalah

Ekspresi pertama menggabungkan koordinat yang bersesuaian menjadi satu skalar. Ekspresi kedua mengukur panjang Euclidean setiap vektor. Ekspresi ketiga membagi skor keselarasan dengan kedua panjang tersebut, sehingga tersisa perbandingan arah. Ketaksamaan Cauchy–Schwarz menjamin bahwa rasio terakhir berada di antara −1-1 dan 11 untuk vektor tak nol, sehingga sudut dapat dipulihkan secara unik dalam interval [0,π][0,\pi]:

θ=arccos⁡ ⁣(xTy∥x∥2 ∥y∥2).\theta = \arccos\!\left(\frac{x^\mathsf{T}y}{\lVert x\rVert_2\,\lVert y\rVert_2}\right).

Nilai yang dinormalkan ini adalah kesamaan kosinus. Nilai yang mendekati 11 berarti vektor menunjuk hampir ke arah yang sama; 00 berarti sudut siku-siku dalam geometri dot product biasa; dan −1-1 berarti arahnya berlawanan. Interpretasi ini mengasumsikan kedua vektor tidak nol dan kita menggunakan inner product Euclidean standar.

Contoh sudut dari koordinat

Ambil x=(3,1)x=(3,1) dan y=(1,2)y=(1,2). Keduanya adalah vektor dua dimensi, sehingga masing-masing memiliki dua koordinat dan tidak menyiratkan satuan fisik apa pun. Kita dapat menghitung setiap bagian sebelum menerapkan invers kosinus.

Nilai antara ini penting. Dot product sebesar 55 saja tidak memberi tahu kita sudutnya, karena pasangan vektor lain dapat memiliki dot product yang sama tetapi panjang berbeda. Membagi dengan kedua norm membuat hasilnya dapat dibandingkan pada berbagai magnitudo vektor.

Penskalaan positif mempertahankan kosinus

Misalkan vektor tak nol diregangkan dengan bilangan positif cc. Arahnya tidak berubah, dan aljabar menunjukkan mengapa skor kosinus tetap:

cos⁡(cx,y)=(cx)Ty∥cx∥2∥y∥2=c xTyc∥x∥2∥y∥2=cos⁡(x,y),c>0.\cos(cx,y)=\frac{(cx)^\mathsf{T}y}{\lVert cx\rVert_2\lVert y\rVert_2} =\frac{c\,x^\mathsf{T}y}{c\lVert x\rVert_2\lVert y\rVert_2} =\cos(x,y),\qquad c>0.

Pembatalan yang sama terjadi ketika yy diskalakan secara positif. Inilah sifat yang berguna untuk perbandingan embedding berdasarkan arah: vektor dokumen dengan orientasi yang sama tetapi norm lebih besar menerima skor kosinus yang sama. Ini juga merupakan pilihan pemodelan. Jika magnitudo membawa sinyal tentang keyakinan, frekuensi, atau atribut lain dari representasi, menghapusnya dapat membuang informasi.

Jelajahi sudut, skor, dan panjang secara bersamaan

Explorer ini dimulai dengan dua vektor tak nol. Gerakkan koordinat mana pun menggunakan mouse, input sentuh, atau tombol panah. Plot menampilkan vektor yang sama dari titik asal, sedangkan tabel mengulangi dot product, kedua norm, kesamaan kosinus, dan sudut yang dipulihkan dalam teks. Atur salah satu vektor menjadi (0,0)(0,0) untuk melihat batas vektor nol.

Kesamaan kosinus berubah ketika arah vektor berubah
Pilih koordinat kedua vektor

Setiap kontrol rentang mengubah satu koordinat sebesar 0.5. Tabel adalah alternatif teks lengkap untuk geometri yang diplot.

Vektor x

Vektor y

x = (1, 0,5); y = (0,5, 1,5); hasil kali titik = 1,25; norma x = 1,118; norma y = 1,581; kesamaan kosinus = 0,707; sudut = 0,785 radian (45 derajat). Interpretasi: skornya mencerminkan keselarasan arah sebagian.

Dua vektor dan sudutnya dari titik asal yang samaPlot menampilkan vektor x = (1, 0,5) dan y = (0,5, 1,5) dari titik asal. x = (1, 0,5); y = (0,5, 1,5); hasil kali titik = 1,25; norma x = 1,118; norma y = 1,581; kesamaan kosinus = 0,707; sudut = 0,785 radian (45 derajat). Interpretasi: skornya mencerminkan keselarasan arah sebagian.-2-2-1-101122x = (1, 0,5)y = (0,5, 1,5)koordinat pertamakoordinat kedua
Nilai teks untuk vektor yang dipilih
BesaranNilai
Hasil kali titik x · y1,25
Norma x1,118
Norma y1,581
Kesamaan kosinus0,707
Sudut0,785 radian / 45 derajat

Garis vektor menggunakan pola garis putus-putus dan label yang berbeda, bukan warna saja. Tabel numerik tetap bermakna ketika plot tidak tersedia atau gerakan dikurangi.

Sudut yang diplot adalah bantuan untuk bernalar, bukan definisi terpisah. Ketika kontrol berubah, tabel numerik menghitung ulang rumus yang sama seperti di atas. Pasangan yang menjadi lebih panjang tanpa mengubah arah mempertahankan nilai kosinus, sedangkan memutar salah satu vektor mengubah sudut dan skor.

Gunakan skor dengan hati-hati dalam retrieval embedding

Embedding adalah representasi vektor dari suatu item seperti dokumen, query, gambar, atau pengguna. Jika kecocokan yang dimaksud adalah orientasi, kesamaan kosinus merupakan skor yang alami: ia membandingkan vektor yang telah dinormalkan, bukan panjang mentahnya. Skor tetap bergantung pada model embedding, prapemrosesan, korpus, dan tugas; skor tersebut tidak menjadikan “serupa” sebagai sifat universal dari dokumen yang mendasarinya.

Panduan metrik berpasangan scikit-learn saat ini menjelaskan kesamaan kosinus sebagai dot product yang dinormalkan L2 dan menyebut penggunaannya untuk vektor dokumen. cosine_similarity API memperlakukan baris sebagai sampel dan mengembalikan matriks skor berpasangan. Bentuk ini mudah hilang ketika berpindah antara satu vektor dan sebuah batch, jadi buat konvensi baris menjadi eksplisit:

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

query = np.array([[3.0, 1.0]])       # shape (1 sample, 2 features)
documents = np.array([
    [3.0, 1.0],
    [1.0, 2.0],
    [30.0, 10.0],
])                                    # shape (3 samples, 2 features)

scores = cosine_similarity(query, documents)
print(scores.round(4))
# [[1.     0.7071 1.    ]]

Untuk implementasi NumPy yang transparan, dot product satu dimensi dan norm vektor sudah cukup. Dokumentasi dot NumPy mendefinisikan kasus 1-D sebagai inner product dua vektor, sedangkan numpy.linalg.norm menerima argumen axis ketika sebuah array berisi banyak vektor. Guard ini adalah bagian dari implementasi, bukan pemeriksaan kosmetik:

import numpy as np

def cosine_similarity(x, y):
    x = np.asarray(x, dtype=float)
    y = np.asarray(y, dtype=float)
    x_norm = np.linalg.norm(x)
    y_norm = np.linalg.norm(y)
    if x_norm == 0 or y_norm == 0:
        raise ValueError('cosine similarity needs two nonzero vectors')

    raw = np.dot(x, y) / (x_norm * y_norm)
    return np.clip(raw, -1.0, 1.0)

print(cosine_similarity(np.array([3.0, 1.0]), np.array([1.0, 2.0])))
# 0.7071067811865475

clip mencegah overshoot floating-point kecil mengirim arccos ke luar domainnya. Jangan gunakan ini untuk menyembunyikan kesalahan numerik atau bentuk data yang lebih besar. Untuk batch berbentuk (number_of_samples, number_of_features), hitung norm pada axis=1 dan pertahankan satu skor per baris; dokumentasi NumPy saat ini menunjukkan konvensi sumbu ini untuk norm vektor.

Batas yang mengubah interpretasi

Vektor nol tidak memiliki sudut

Jika x=0x=0, maka ∥x∥2=0\lVert x\rVert_2=0 dan rumus kosinus membagi dengan nol. Dot product 0Ty=00^\mathsf{T}y=0 tetap terdefinisi, tetapi itu tidak berarti vektor nol membentuk sudut siku-siku dengan yy. Vektor nol tidak memiliki arah, sehingga secara matematis sudut dan kesamaan kosinus tidak terdefinisi.

Library dapat memilih kebijakan untuk input ini. Contoh cosine_similarity saat ini menyertakan baris nol dan menampilkan skor 0.0; itu adalah konvensi API yang perlu diperiksa untuk versi dan jalur data yang Anda gunakan, bukan arah yang baru didefinisikan. Pipeline retrieval produksi harus memutuskan apakah akan menolak, menyaring, atau merutekan embedding nol secara terpisah, lalu menguji kebijakan itu secara eksplisit.

Vektor berlawanan bukan berarti “tidak berkaitan”

Untuk xx tak nol, pasangan (x,−x)(x,-x) memiliki

cos⁡(x,−x)=−∥x∥22∥x∥22=−1,θ=π.\cos(x,-x)=\frac{-\lVert x\rVert_2^2}{\lVert x\rVert_2^2}=-1, \qquad \theta=\pi.

Skornya paling negatif karena vektor menunjuk ke arah yang berlawanan. Skor yang mendekati 00 berarti ortogonal dalam geometri ini; skor tersebut tidak otomatis berarti dua item tidak berkaitan secara semantik. Interpretasinya bergantung pada representasi dan tugas.

Kosinus tidak sama dengan jarak atau dot product mentah

Kesamaan kosinus mengabaikan skala positif. Jarak Euclidean tidak. Untuk x=(1,1)x=(1,1) dan y=(10,10)y=(10,10), kesamaan kosinusnya adalah 11, tetapi

∥x−y∥2=(−9)2+(−9)2=92≈12.728.\lVert x-y\rVert_2=\sqrt{(-9)^2+(-9)^2}=9\sqrt{2}\approx12.728.

Pasangan ini identik secara arah tetapi tetap berjauhan sebagai titik. Sebaliknya, dot product mentah mencampurkan arah dengan kedua panjang. Pilih kosinus ketika kesepakatan arah adalah sinyal yang diinginkan; pilih jarak yang diinduksi norm atau skor mentah ketika magnitudo harus tetap menjadi bagian dari keputusan. API cosine_distances scikit-learn mendefinisikan nilainya sebagai 11 dikurangi kesamaan kosinus, sehingga mempertahankan pilihan arah yang sama, bukan memulihkan pemisahan Euclidean.

Pelajaran berikutnya, Pelajaran 045: Ortogonalitas berarti tidak ada tumpang tindih linear, berfokus pada kasus khusus ketika inner product bernilai nol dan menjelaskan arti “tidak ada tumpang tindih linear” (tautan ini membuka konten berbahasa Inggris). Hub kursus Math for AI menjaga urutan dependensi tetap terlihat ketika setiap pelajaran tersedia.

Uji pemahaman Anda

Question 1

Untuk x = (3, 1) dan y = (1, 2), hitung dot product, kedua norm L2, kesamaan kosinus, dan sudutnya.

Show the step-by-step solution

Dot product-nya adalah 3⋅1+1⋅2=53\cdot1+1\cdot2=5. Norm-nya adalah ∥x∥2=3⋅3+1⋅1=10\lVert x\rVert_2=\sqrt{3\cdot3+1\cdot1}=\sqrt{10} dan ∥y∥2=1⋅1+2⋅2=5\lVert y\rVert_2=\sqrt{1\cdot1+2\cdot2}=\sqrt{5}. Jadi cos⁡(θ)=5/(105)=1/2≈0.7071\cos(\theta)=5/(\sqrt{10}\sqrt{5})=1/\sqrt{2}\approx0.7071. Menerapkan invers kosinus memberi θ=π/4\theta=\pi/4 radian, atau 45∘45^\circ. Setiap langkah menggunakan vektor dengan dua koordinat dan asumsi norm tak nol.

Question 2

Mengapa x = (1, 2) dan y = (10, 20) memiliki dot product serta panjang masing-masing yang berbeda, tetapi kesamaan kosinus yang sama?

Show the step-by-step solution

Vektor tersebut memenuhi y=10xy=10x, sehingga xTy=1⋅10+2⋅20=50x^\mathsf{T} y=1\cdot10+2\cdot20=50. Norm-nya adalah ∥x∥2=5\lVert x\rVert_2=\sqrt{5} dan ∥y∥2=105\lVert y\rVert_2=10\sqrt{5}. Skor yang dinormalkan adalah 50/(5 105)=150/(\sqrt{5} \,10\sqrt{5})=1. Dot product bertambah mengikuti skala yy, sementara skala yang sama juga muncul dalam norm-nya dan saling menghapus pada kosinus.

Question 3

Misalkan x = (1, 0) dan y = (0, 2). Berapa kesamaan kosinus dan sudutnya, serta hubungan geometris apa yang ditunjukkannya?

Show the step-by-step solution

Dot product-nya adalah 1⋅0+0⋅2=01\cdot0+0\cdot2=0. Norm-nya adalah 11 dan 22, jadi kesamaan kosinusnya 0/(1⋅2)=00/(1\cdot2)=0. Karena arccos⁡(0)=π/2\arccos(0)=\pi/2, sudutnya 90∘90^\circ. Jadi dalam geometri dot product standar, kedua vektor itu ortogonal, meskipun tidak satu pun merupakan vektor nol.

Question 4

Untuk x = (1, 0) dan y = (−4, 0), hitung kesamaan kosinus dan sudutnya. Mengapa skornya bukan nol?

Show the step-by-step solution

Dot product-nya adalah 1⋅(−4)+0⋅0=−41\cdot(-4)+0\cdot0=-4, dan norm-nya adalah 11 dan 44. Jadi cos⁡(θ)=−4/(1⋅4)=−1\cos(\theta)=-4/(1\cdot4)=-1. Invers kosinus memberi θ=π=180∘\theta=\pi=180^\circ. Kedua vektor berada pada garis yang sama tetapi menunjuk ke arah berlawanan, sehingga keduanya memiliki keselarasan negatif maksimum, bukan tegak lurus.

Question 5

Apa yang seharusnya dilakukan implementasi kesamaan kosinus untuk x = (0, 0) dan y = (2, 3), dan mengapa mengembalikan 0 bukan sudut matematis?

Show the step-by-step solution

Norm xx adalah 00, sehingga penyebut ∥x∥2∥y∥2\lVert x\rVert_2\lVert y\rVert_2 adalah nol. Rumusnya tidak terdefinisi dan xx tidak memiliki arah. Implementasi dapat menolak pasangan tersebut, menyaring vektor nol, atau menggunakan konvensi API yang didokumentasikan seperti mengembalikan 00; konvensi itu harus diuji dan tidak boleh dijelaskan sebagai sudut siku-siku.

Question 6

Jika x = (1, 2), y = (2, 1), dan x diganti dengan −3x, bagaimana kesamaan kosinus berubah? Tunjukkan perhitungan tandanya.

Show the step-by-step solution

Pertama, xTy=1⋅2+2⋅1=4x^\mathsf{T}y=1\cdot2+2\cdot1=4 dan ∥x∥2∥y∥2=55=5\lVert x\rVert_2\lVert y\rVert_2=\sqrt5\sqrt5=5, sehingga kosinus awalnya 4/5=0.84/5=0.8. Dengan c=−3c=-3, pembilang dikalikan −3-3, sedangkan norm cxcx adalah ∣c∣∥x∥2=3∥x∥2|c|\lVert x\rVert_2=3\lVert x\rVert_2. Jadi skor barunya adalah (−3)/3⋅0.8=−0.8(-3)/3\cdot0.8=-0.8: penskalaan negatif membalik arah.

Question 7

Mengapa implementasi NumPy melakukan clipping pada dot product yang dinormalkan sebelum memanggil arccos, dan apa yang seharusnya ditunjukkan oleh overshoot besar?

Show the step-by-step solution

Secara matematis, Cauchy–Schwarz menempatkan kosinus di [−1,1][-1,1], tetapi aritmetika floating-point dapat menghasilkan nilai seperti 1.00000000000000021.0000000000000002 setelah perhitungan panjang atau yang hampir paralel. Karena arccos⁡\arccos hanya bernilai real pada interval tersebut, np.clip(raw, -1.0, 1.0) menghilangkan overshoot kecil akibat pembulatan. Overshoot besar menunjukkan masalah data, bentuk, atau kondisi numerik; clipping tidak boleh digunakan untuk menyembunyikannya.

Question 8

Sebuah query adalah q = (3, 1), dan tiga vektor dokumen adalah a = (3, 1), b = (1, 2), serta c = (30, 10). Bandingkan peringkat berdasarkan dot product mentah dengan peringkat berdasarkan kesamaan kosinus.

Show the step-by-step solution

Dot product mentahnya adalah qTa=10q^\mathsf{T}a=10, qTb=5q^\mathsf{T}b=5, dan qTc=100q^\mathsf{T}c=100, sehingga peringkat dot product mentahnya adalah cc, lalu aa, lalu bb. Vektor c=10ac=10a, jadi cos⁡(q,c)=cos⁡(q,a)=1\cos(q,c)=\cos(q,a)=1. Untuk bb, cos⁡(q,b)=5/(105)≈0.7071\cos(q,b)=5/(\sqrt{10}\sqrt{5})\approx0.7071. Jadi peringkat kosinus menempatkan aa dan cc seri di posisi teratas, diikuti bb. Perbedaan ini memperlihatkan keputusan pemodelan: dot product menghargai magnitudo dan arah, sedangkan kosinus menghapus skala positif.

Sumber

  1. Mathematics for Machine Learning book PDF, Section 3.4
  2. NumPy documentation: numpy.dot
  3. NumPy documentation: numpy.linalg.norm
  4. NumPy documentation: numpy.arccos
  5. scikit-learn documentation: Pairwise metrics, affinities and kernels
  6. scikit-learn documentation: cosine_similarity
  7. scikit-learn documentation: cosine_distances