Praktikum 2
Pada percobaan kali ini kita akan membuat pencarian sederhana menggunakan FAISS. Install FAISS terlebih dahulu menggunakan FAISS-CPU, jika ingin menggunakan GPU, dapat lakukan instalasi FAISS-GPU.
!pip install faiss-cpu
#!pip install faiss-gpu
import numpy as np
import faiss
import matplotlib.pyplot as plt
import time
# 1. Buat dataset 2D sederhana
np.random.seed(42)
X = np.random.rand(1000, 2).astype('float32') # 1000 titik 2D
query = np.array([[0.5, 0.5]], dtype='float32') # query di tengah
# 2. Exact NN dengan IndexFlatL2 (brute force tapi cepat)
index_flat = faiss.IndexFlatL2(2) # L2 = Euclidean distance
index_flat.add(X)
start = time.time()
D_flat, I_flat = index_flat.search(query, 3) # cari 3 tetangga terdekat
end = time.time()
time_flat = end - start
# 3. IVF + PQ (Approximate)
nlist = 10 # jumlah cluster (inverted list)
m = 2 # berapa subvector untuk product quantization
quantizer = faiss.IndexFlatL2(2) # dipakai IVF untuk cluster awal
index_ivfpq = faiss.IndexIVFPQ(quantizer, 2, nlist, m, 8) # 8 bit per subvector
index_ivfpq.train(X) # training centroid
index_ivfpq.add(X)
start = time.time()
D_ivfpq, I_ivfpq = index_ivfpq.search(query, 3)
end = time.time()
time_ivfpq = end - start
# 4. Print hasil
print("Exact NN (Flat) indices:", I_flat, "distances:", D_flat)
print("IVF+PQ indices:", I_ivfpq, "distances:", D_ivfpq)
print("Waktu Exact:", time_flat)
print("Waktu IVF+PQ:", time_ivfpq)
# 5. Visualisasi
plt.scatter(X[:,0], X[:,1], alpha=0.4, label="Dataset")
plt.scatter(query[:,0], query[:,1], c='red', marker='*', s=200, label="Query")
# Tetangga dari Flat
plt.scatter(X[I_flat[0],0], X[I_flat[0],1], c='blue', s=100, edgecolor='k', label="Exact NN")
# Tetangga dari IVF+PQ
plt.scatter(X[I_ivfpq[0],0], X[I_ivfpq[0],1], c='green', marker='x', s=100, label="IVF+PQ NN")
plt.legend()
plt.title("Perbandingan Exact NN vs FAISS IVF+PQ")
plt.show()
Berikut adalah hasilnya:

Lakukan percobaan pada metric distance yang berbeda, 1000 vs 1jt data, 2D vs 5D data. catat hasilnya pada tabel yang anda buat sendiri seperti pada praktikum 1.
Last updated