0% au considerat acest document util (0 voturi)
24 vizualizări11 pagini

Dbscan

Încărcat de

Alexia Mihniova
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
24 vizualizări11 pagini

Dbscan

Încărcat de

Alexia Mihniova
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

**DBSCAN** (Density-Based Spatial Clustering of Applications with Noise) este un algoritm de grupare

(clustering) care grupează datele pe baza densității acestora. În loc să presupună că grupurile au forme
geometrice clare (precum cercuri sau pătrate), DBSCAN poate găsi grupuri de orice formă, atât timp cât
există suficiente puncte apropiate între ele.

### Cum funcționează DBSCAN:

1. **Identifică punctele dense**: DBSCAN consideră că un grup este un set de puncte care sunt suficient
de apropiate între ele. Acesta caută "puncte dense" care au multe vecine în apropiere.

2. **Definește două valori importante**:

- **Epsilon (ε)**: Distanța maximă între două puncte pentru a fi considerate vecine.

- **MinPts**: Numărul minim de puncte necesar pentru a forma un grup (cluster). Dacă un punct are
suficiente puncte vecine într-o regiune de distanță mai mică decât ε, atunci acel punct este considerat
un punct "de interior" al unui cluster.

3. **Puncte de interior, frontieră și zgomot**:

- **Puncte de interior** sunt punctele care au cel puțin MinPts vecine în apropiere.

- **Puncte de frontieră** sunt punctele care sunt în apropierea unui punct de interior, dar nu au
suficiente vecine pentru a fi considerate puncte de interior.
- **Punctele de zgomot** sunt punctele care nu fac parte din niciun cluster și nu au suficiente vecine
pentru a fi considerate puncte de frontieră.

4. **Formarea clusterelor**: DBSCAN începe de la un punct aleatoriu și, dacă acel punct are suficient de
multe vecine (conform ε și MinPts), formează un cluster. Algoritmul extinde acest cluster adăugând
puncte de frontieră și continuă până când toate punctele sunt atribuite unui cluster sau sunt marcate ca
zgomot.

### Avantaje:

- Poate identifica grupuri de orice formă.

- Nu necesită să știm dinainte câte grupuri există.

- Poate să gestioneze zgomotul (puncte care nu se potrivesc niciunui cluster).

### Dezavantaje:

- Algoritmul poate fi sensibil la alegerea parametrilor ε și MinPts.

- Nu funcționează bine pe date care au densități foarte variabile între grupuri.

În esență, DBSCAN găsește grupuri de puncte care sunt apropiate între ele și separă punctele care nu se
potrivesc în niciun grup ca fiind "zgomot".

Codul:

Pentru a incepe a rezolva in primul rand trebuie sa organizam baza de date

1. Baza noastra de date are forma


Pentru a putea lucre cu aceasta trebuie ca datele noastre sa fie de tip integer. Pentru a face asta
impartim coloada interest in mai multe coloane de tip Boolean :

data = pd.get_dummies(data, columns=['Interests'])


Astfel setul nostrum de Dte arata astfel

Urmeaza sa le transfomrmam in tipul integer:

Pentru Preferred_Gendrer:

Impartim in doua coloane separate

Age_Min,Age_Max
20,35

Pentru Distanta folosim o biblioteca aparte: geopy

ef get_distance(loc1, loc2):
geolocator = Nominatim(user_agent="geoapi")
try:
loc1 = [Link](loc1)
loc2 = [Link](loc2)

if loc1 and loc2: # Verificăm dacă locațiile au fost găsite


coords_1 = ([Link], [Link])
coords_2 = ([Link], [Link])
distance = geodesic(coords_1, coords_2).km
return distance
else:
return None # Dacă nu se găsește locația, returnăm None
except Exception as e:
print(f"Error while calculating distance: {e}")
return None
Aceasta functie ne permite sa aflam coordonatele oraselor, de exemplu pentru Cluj -
325.0443863317239
2. Pentru a putea lucre cu Algoritmele din ML este nevoie sa facem Standartizarea

standardizarea este un proces de preprocesare a datelor care transformă variabilele astfel încât să
aibă o distribuție cu o medie de 0 și o deviație standard de 1. Acest pas este crucial pentru multe
algoritmi, mai ales cei care folosesc distanțe sau care sunt sensibili la scala datelor.

from [Link] import StandardScaler

# Selectăm coloanele de interes pentru clustering


df_features = df_subset[['Age'] + ['Height']+ ['Age_Min'] + ['Age_Max'] +
[col for col in df_subset.columns if
[Link]('Interests_')] +
['Location']]

# Normalizarea datelor
scaler = StandardScaler()
df_scaled = scaler.fit_transform(df_features)

# Dacă vrei să vezi cum arată datele normalizate


print(df_scaled)
Dupa standartizare elementele noastre devin

3. Acum e timpul sa lucram cu Algoritmul DBSCAN din Machine Learning

from [Link] import DBSCAN


import [Link] as plt
import seaborn as sns

# Aplicăm DBSCAN
dbscan = DBSCAN(eps=6, min_samples=2) # eps: distanța maximă între două
puncte pentru a fi considerate vecini, min_samples: nr. minim de puncte
într-un vecin
df_subset['Cluster'] = dbscan.fit_predict(df_scaled)

# Vizualizarea rezultatelor
# Etichetele de cluster vor fi -1 pentru zgomot (puncte care nu fac parte
din niciun cluster)
print(df_subset['Cluster'].value_counts()) # Afișează câte puncte sunt
în fiecare cluster

# Dacă vrei să vizualizezi clusterele


[Link](figsize=(8, 6))
[Link](data=df_subset, x='Age_Min', y='Age_Max', hue='Cluster',
palette='Set1', style='Cluster', markers=['o', 's', 'D'])
[Link]('Clusterele utilizatorilor în funcție de vârsta minimă și
maximă')
[Link]()
df_subset['Cluster'].value_counts()

Aceasta metoda ne permite sa grupam elementele in mai multe ,,Clusters,, (grupe)


Pentru a putea lucre cu acest algoritm trebuie sa aflam epsilon(eps) si k-distance(k-distance)

Pentru epsilon :

from [Link] import NearestNeighbors


import numpy as np
neighbors = NearestNeighbors(n_neighbors=6)
[Link](df_scaled)
distances, indices = [Link](df_scaled)
mean_distances = [Link](axis=1)
#sorted descendingly
sorted_vals = [Link](mean_distances)[::-1]
[Link](sorted_vals)
Pentru min_samples:

from [Link] import NearestNeighbors


import numpy as np
neighbors = NearestNeighbors(n_neighbors=4) # n_neighbors = min_samples
[Link](df_scaled)
distances, indices = [Link](df_scaled)
distances = [Link](distances[:, -1]) # Ultima coloană conține
distanțele maxime pentru fiecare punct
[Link](distances)
[Link]('k-distance plot')
[Link]()
Dupa graphic luam datele pentru care avem o crestere exponentiala dar si verificam ca algorimtul sa ne
poata da cat mai multe grupe, in cazul nostrum vom folosi eps=6, min_samples=2

Acum ne-a ramas doar sac reem o functie ce preda persoanele (Id-urile) din aceleasi grupe cu ID-ul dorit
dar sa tinem in cont si de Preferred_Gender:

def get_suggested_users(user_id, df, preferred_gender):


"""
Găsește utilizatorii din același cluster cu user_id dat și care au
genul preferat.

Parametri:
- user_id: ID-ul utilizatorului pentru care căutăm potriviri.
- df: DataFrame-ul care conține datele și clusterele.
- preferred_gender: Genul preferat al utilizatorului.

Returnează:
- DataFrame cu utilizatorii potriviți.
"""
# Verifică dacă user_id există în DataFrame
if user_id not in df['ID'].values:
print(f"Eroare: Utilizatorul cu ID {user_id} nu există în baza de
date.")
return [Link]()

# Obține clusterul utilizatorului dat


user_cluster = [Link][df['ID'] == user_id, 'Cluster'].values[0]

# Selectează toți utilizatorii din același cluster


suggested_users = df[df['Cluster'] == user_cluster]

# Exclude utilizatorul dat


suggested_users = suggested_users[suggested_users['ID'] != user_id]

# Filtrează utilizatorii după genul preferat


suggested_users = suggested_users[suggested_users['gender'] ==
preferred_gender]

return suggested_users

# Exemplu de utilizare
# Coloane de test
df_subset['ID'] = id_column # ID-urile utilizatorilor
df_subset['Preferred_Gender'] = data['Preferred_Gender'] # Genurile
preferate
df_subset['gender'] = gender # Genurile reale ale utilizatorilor

user_id = 1 # ID-ul utilizatorului pentru care căutăm potriviri

# Verificăm genul preferat al utilizatorului


if user_id in df_subset['ID'].values:
pr = df_subset.loc[df_subset['ID'] == user_id,
'Preferred_Gender'].values[0]

# Obține utilizatorii potriviți


suggested_users = get_suggested_users(user_id, df_subset, pr)

# Afișează rezultatul
print(f"Utilizatori potriviți pentru utilizatorul cu ID {user_id} și
genul preferat '{pr}':")
print(suggested_users[['ID', 'Age', 'Height', 'Cluster', 'gender']])
# Coloanele relevante
else:
print(f"Eroare: Utilizatorul cu ID {user_id} nu există în baza de
date.")
Observam ca codul returneaza toate persoanele asemanatoare dupa caracteristici tinand cont de
Preferred_Gender
Acest algoritm nu este unul potrivit in cazul nostrum
deoarece are probleme in gsirea grupurilor de
personae!!!

Pbservam ca (in cel mai bun caz)) obtinem in primul grup de personae un numar mult mai mare decat in
celelalte cee ace este in defavoare persoanelor alfate in grupurile 1-11 in momentel gasirii similaritatilor

S-ar putea să vă placă și