Pentru Collaborative Filtering:
Algoritmul are dificultăți în a face recomandări pentru utilizatori noi sau articole noi care nu
au fost evaluate.
Scalabilitate: Cu creșterea numărului de utilizatori și articole, complexitatea calculului
crește, ceea ce poate duce la probleme de performanță.
Explicație - Collaborative Filtering
Collaborative Filtering este o tehnică utilizată pentru a face recomandări pe baza preferințelor
și comportamentului altor utilizatori. În contextul unei aplicații de dating, această tehnică ar
funcționa astfel:
1. Colectarea datelor: Se adună informații despre utilizatorii existenți, cum ar fi ce
profiluri le-au plăcut sau cu care au interacționat (like-uri, mesaje, swipes).
2. Matrix de preferințe: Se creează o matrice în care rândurile sunt utilizatorii, iar
coloanele sunt alți utilizatori. Fiecare celulă conține informații despre interacțiunea dintre
cei doi utilizatori. De exemplu, dacă User 1 a dat "like" la User 2, această informație ar fi
stocată în matrice.
3. Similaritatea dintre utilizatori: Algoritmul compară preferințele și comportamentul
fiecărui utilizator pentru a găsi similarități. De exemplu, dacă doi utilizatori au apreciat
aceleași profiluri sau au preferințe similare în ceea ce privește vârsta, locația și interesele,
aceștia ar fi considerați similari.
4. Recomandări: Pe baza acestor similarități, algoritmul poate sugera utilizatorilor profiluri
noi care sunt similare cu cele pe care le-au apreciat sau care au interacționat alți
utilizatori similari.
Există două tipuri de Collaborative Filtering:
User-based: Recomandă utilizatorilor profiluri care au fost apreciate de alți utilizatori
similari.
Item-based: Recomandă profiluri similare celor pe care un utilizator le-a apreciat deja.
Această tehnică poate ajuta la găsirea unor potriviri bazate pe comportamente și preferințe reale,
nu doar pe criterii predefinite.
Alegerea între Collaborative Filtering bazat pe utilizatori (user-based) sau pe articole (item-
based) pentru aplicația ta de dating depinde de mai mulți factori. Iată o comparație pentru a te
ajuta să decizi:
1. User-Based Collaborative Filtering (UBCF)
Cum funcționează: Recomandările se bazează pe similaritățile dintre utilizatori. Se
caută utilizatori care au preferințe și comportamente similare, iar aplicația va recomanda
persoane pe baza a ceea ce utilizatori similari au apreciat sau ales.
Avantaje:
o Poate genera recomandări personalizate în funcție de preferințele și interesele
similare ale altor utilizatori.
o Este eficient atunci când există mulți utilizatori cu comportamente similare.
Dezavantaje:
o Dacă nu ai o bază mare de date sau dacă utilizatorii au preferințe unice, poate să
nu fie eficient.
o Poate să fie mai costisitor din punct de vedere computațional pentru a găsi
utilizatori similari, mai ales pe măsură ce baza de date crește.
Recomandare: UBCF este mai potrivit dacă aplicația ta de dating are o bază de
utilizatori semnificativă și poți găsi utilizatori cu preferințe similare. Este util în cazul în
care există diversitate în preferințele utilizatorilor.
2. Item-Based Collaborative Filtering (IBCF)
Cum funcționează: Recomandările se bazează pe similaritățile dintre articole (în cazul
tău, profiluri). Se analizează ce articole (profiluri) sunt preferate în comun de utilizatori și
se oferă recomandări pe baza similarităților dintre aceste articole.
Avantaje:
o Mai stabil și mai scalabil decât UBCF, deoarece nu depinde de comportamentul
dinamic al utilizatorilor.
o Poate să funcționeze mai bine cu baze de date mai mici, unde preferințele
utilizatorilor nu sunt foarte diverse.
o Dacă cineva a dat "like" unui profil cu anumite caracteristici, i se pot recomanda
profiluri cu caracteristici similare.
Dezavantaje:
o Poate să nu fie la fel de personalizat ca UBCF, deoarece se concentrează pe
similitudini între articole, nu pe preferințele exacte ale utilizatorilor.
Recomandare: IBCF este mai potrivit dacă ai mai puțini utilizatori și poți defini clar
atributele care fac profilurile similare (de exemplu, interese comune, locație).
Funcționează bine atunci când ai date structurate despre preferințele utilizatorilor pentru
diferite caracteristici ale profilurilor.
Dacă ai sub 1.000 de utilizatori, Item-Based Collaborative Filtering (IBCF) ar fi o alegere mai
potrivită. Iată motivele:
1. Scalabilitate și Stabilitate: IBCF este mai scalabil pentru un număr mic de utilizatori
deoarece se bazează pe similaritățile între profiluri, nu pe comportamentul utilizatorilor.
Dacă profilurile au atribute bine definite (ex. interese comune, vârstă, locație), poți
genera recomandări coerente chiar și cu o bază de utilizatori mai mică.
2. Lipsa Suficientelor Date Comportamentale: Cu mai puțini utilizatori, este posibil să nu
ai suficiente date comportamentale (like-uri, mesaje, interacțiuni) pentru a antrena un
algoritm User-Based. IBCF nu depinde de aceste date și poate funcționa doar pe baza
caracteristicilor profilurilor.
3. Ușurință în Implementare: Poți începe mai ușor cu IBCF, analizând care profiluri sunt
similare și recomandând în funcție de aceste similarități. De exemplu, dacă un utilizator a
apreciat un profil cu interese în sport și călătorii, îi poți recomanda alte profiluri cu
aceleași interese.
Deci, pentru o bază de utilizatori sub 1.000, Item-Based Collaborative Filtering este mai
eficient și mai ușor de implementat în stadiile inițiale ale aplicației tale de dating.
Pentru aceasta metoda folosim Cosine similarity pentru a determina perechile
Asemănarea cosinusului înseamnă măsurarea unghiului dintre doi vectori. Vectorii comparați cuprind un
subset de evaluări pentru utilizator sau articol dat. Scorul de asemănare cosinus poate fi orice valoare
între -1 și 1. Cu cât este mai mare scorul cosinus, cu atât se consideră mai asemănătoare doi itemi.
Unele surse recomandă această valoare pentru spațiile caracteristice cu dimensiuni mari. În filtrarea
colaborativă, punctele vectoriale sunt extrase direct din matricea articolului utilizator. Asemănarea
cosinusului este reprezentată de această formulă, unde x și y semnifică doi vectori în spațiul vectorial
Explicarea codului:
import pandas as pd
from [Link] import cosine_similarity
from sklearn.feature_extraction.text import CountVectorizer
# 1. Încărcare date din CSV
data = pd.read_csv("dating_data.csv")
data['Combined_Features'] = data[['Interests', 'Location',
'Preferred_Gender', 'Age_Preference_Range']].agg(' '.join, axis=1)
data['Combined_Features'] (Pentru a selecta criteriile de compatibilitate), axis =1 pe randuri
vectorizer = CountVectorizer()
inițializează un nou obiect CountVectorizer din biblioteca scikit-learn. La acest moment, nu se
face nicio analiză a datelor; pur și simplu se creează un instrument (un vectorizator) care va fi utilizat
ulterior pentru a transforma datele textuale în formă numerică.
feature_matrix = vectorizer.fit_transform(data['Combined_Features'])
identifica toti termenii unici din 'Combined_Features'
transform: Transformă documentele (profilurile) în vectori numerici bazat pe vocabularul
creat. Fiecare document va fi reprezentat ca un vector în care fiecare element corespunde
frecvenței fiecărui termen din vocabular.
feature_matrix
similarity_matrix = cosine_similarity(feature_matrix)
Calculează matricea de similaritate bazată pe similitudinea cosinus între profilurile utilizatorilor
Rezultatul este o matrice pătrată, unde fiecare element i,ji,ji,j reprezintă similaritatea cosinus între
profilul iii și profilul jjj.
def get_similar_profiles
Functia găseste profiluri similare pentru un utilizator dat, bazându-se pe matricea de similaritate
calculată anterior
profile_index = [Link][data['ID'] == profile_id].tolist()[0]
Obtinem indexul pentru persoana Dorita
.tolist()[0] – in caz ca avem mai multe indexuri la fel, se returnneaza o lista de indexuri si se extrage
prima
similarity_scores = list(enumerate(similarity_matrix[profile_index])) are rolul de a crea o listă de
scoruri de similaritate pentru un anumit profil
list(enumerate adduce rezultatul de tipul unei liste [(0, 0.0), (1, 0.85), (2, 0.65), (3, 0.9), (4, 0.75)] unde
prima cifra e index si a doua similatritatea cosinus. Aceasta este pentru a putea face mai apoi sortarea
sorted_profiles = sorted(similarity_scores, key=lambda x: x[1],
reverse=True)
aici se sorteaza similarity_scores dupa key=lambda x: x[1], adica dupa similatritatea cosinus in ordine
descrescatoare
sorted_profiles = [int([Link][i[0]]['ID']) for i in sorted_profiles if
i[0] != profile_index]
este responsabilă pentru extragerea ID-urilor profilurilor similare, excluzând profilul curent.
int([Link][i[0]]['ID'])
Returneaza Id pentru indexul gasit, adica pana acum lucram cu index si la sarsit stocam insasi id-ul.