Saya perlu menghitung kesamaan kosinus antara dua daftar , misalkan daftar 1 yang mana dataSetI
dan daftar 2 yang mana dataSetII
. Saya tidak dapat menggunakan apa pun seperti numpy atau modul statistik. Saya harus menggunakan modul umum (matematika, dll) (dan modul sesedikit mungkin, untuk mengurangi waktu yang dihabiskan).
Katakanlah dataSetI
adalah [3, 45, 7, 2]
dan dataSetII
adalah [2, 54, 13, 15]
. Panjang daftar selalu sama.
Tentu saja, kemiripan kosinusnya adalah antara 0 dan 1 , dan demi itu, akan dibulatkan ke desimal ketiga atau keempat dengan format(round(cosine, 3))
.
Terima kasih banyak sebelumnya atas bantuannya.
python
python-3.x
cosine-similarity
Rob Alsod
sumber
sumber
Jawaban:
Anda harus mencoba SciPy . Ia memiliki sekumpulan rutinitas ilmiah yang berguna misalnya, "rutinitas untuk menghitung integral secara numerik, menyelesaikan persamaan diferensial, pengoptimalan, dan matriks renggang." Ia menggunakan NumPy yang dioptimalkan super cepat untuk pengolah nomornya. Lihat disini untuk menginstal.
Perhatikan bahwa spatial.distance.cosine menghitung jarak , dan bukan kesamaannya. Jadi, Anda harus mengurangi nilainya dari 1 untuk mendapatkan kesamaan .
sumber
versi lain
numpy
hanya berdasarkansumber
np.inner(a, b) / (norm(a) * norm(b))
lebih baik untuk dipahami.dot
bisa mendapatkan hasil yang sama sepertiinner
vektor.scipy.spatial.distance.cosine
.cos_sim = (a @ b.T) / (norm(a)*norm(b))
Anda dapat menggunakan dokumen
cosine_similarity
formulir fungsisklearn.metrics.pairwise
sumber
cosine_similarity([[1, 0, -1]], [[-1,-1, 0]])
Saya kira kinerja tidak terlalu penting di sini, tetapi saya tidak bisa menolak. Fungsi zip () sepenuhnya menyalin kedua vektor (sebenarnya lebih merupakan transpose matriks) hanya untuk mendapatkan data dalam urutan "Pythonic". Akan menarik untuk mengatur waktu implementasi mur-dan-baut:
Itu melewati noise seperti C dari mengekstraksi elemen satu per satu, tetapi tidak melakukan penyalinan array massal dan menyelesaikan semua yang penting dalam satu perulangan for, dan menggunakan satu akar kuadrat.
ETA: Panggilan cetak yang diperbarui menjadi sebuah fungsi. (Yang asli adalah Python 2.7, bukan 3.3. Arus berjalan di bawah Python 2.7 dengan
from __future__ import print_function
pernyataan.) Outputnya sama.CPYthon 2.7.3 pada 3.0GHz Core 2 Duo:
Jadi, cara unpythonic sekitar 3,6 kali lebih cepat dalam kasus ini.
sumber
cosine_measure
dalam kasus ini?cosine_measure
dancosine_similarity
merupakan implementasi yang berbeda dari kalkulasi yang sama. Setara dengan penskalaan kedua larik masukan menjadi "vektor satuan" dan mengambil perkalian titik.cosine_measure
adalah kode yang diposting sebelumnya oleh pkacprzak. Kode ini adalah alternatif dari solusi semua-standar-Python "lainnya".tanpa menggunakan impor apapun
bisa diganti dengan
tanpa menggunakan numpy.dot () Anda harus membuat fungsi titik Anda sendiri menggunakan pemahaman daftar:
dan kemudian ini hanya masalah sederhana menerapkan rumus kesamaan kosinus:
sumber
Saya melakukan benchmark berdasarkan beberapa jawaban dalam pertanyaan tersebut dan cuplikan berikut diyakini menjadi pilihan terbaik:
Hasilnya membuat saya terkejut bahwa implementasi berdasarkan
scipy
bukan yang tercepat. Saya membuat profil dan menemukan bahwa cosinus di scipy membutuhkan banyak waktu untuk melemparkan vektor dari daftar python ke array numpy.sumber
Anda dapat membulatkannya setelah menghitung:
Jika Anda ingin sangat pendek, Anda dapat menggunakan satu baris ini:
sumber
[2,3,2,5]
, dan makhluk v2[3,2,2,0]
. Ia kembali dengan1.0
, seolah-olah mereka persis sama. Apakah ada yang salah?Anda dapat melakukan ini dengan Python menggunakan fungsi sederhana:
sumber
Menggunakan numpy membandingkan satu daftar angka dengan beberapa daftar (matriks):
sumber
Anda dapat menggunakan fungsi sederhana ini untuk menghitung kesamaan kosinus:
sumber
Jika Anda kebetulan sudah menggunakan PyTorch , Anda harus menggunakan implementasi CosineSimilarity mereka .
Misalkan Anda memiliki dua
n
dimensinumpy.ndarray
s,v1
danv2
, yaitu, bentuk keduanya adalah keduanya(n,)
. Inilah cara Anda mendapatkan kesamaan kosinusnya:Atau misalkan Anda memiliki dua
numpy.ndarray
sw1
danw2
, yang bentuknya keduanya(m, n)
. Berikut ini adalah daftar persamaan kosinus, masing-masing merupakan kesamaan kosinus antara baris dalamw1
dan baris terkait dalamw2
:sumber
Semua jawaban bagus untuk situasi di mana Anda tidak dapat menggunakan NumPy. Jika Anda bisa, berikut ini pendekatan lain:
Ingat juga tentang
EPSILON = 1e-07
mengamankan divisi.sumber