14-bo‘lim

Klasterlash

K-means, ierarxik klasterlash va DBSCAN - javobsiz ma'lumotdan guruhlarni topish.

🕑 12 daqiqa o‘qish 📄 975 so‘z 👁 5 marta ko‘rilgan
Ushbu bo‘lim mundarijasi
  1. Klasterlash nima?
  2. K-means
  3. k ni qanday tanlash?
  4. Tirsak usuli
  5. Siluet koeffitsiyenti
  6. K-means kamchiliklari
  7. Ierarxik klasterlash
  8. DBSCAN
  9. Uchta usulni solishtirish
  10. Amaliy misol - rasm siqish
  11. Klasterlash natijasini baholash
  12. Xulosa

Endi nazoratsiz o'qitishga o'tamiz: bizda javoblar yo'q, model ma'lumotdagi tuzilmani o'zi topishi kerak.

Klasterlash nima? #

Belgisiz ma'lumotdan guruhlarni topish Kirish: belgisiz nuqtalar Chiqish: 3 ta guruh Guruhlar nomi yo'q - ularning ma'nosini siz aniqlaysiz
Model guruhlarni topadi, siz ularga ma'no berasiz

Qo'llanilishi:

SohaVazifa
MarketingMijozlarni segmentlarga bo'lish
TibbiyotBemorlarni o'xshash guruhlarga ajratish
XavfsizlikOdatiy bo'lmagan xatti-harakatni topish
KontentMaqolalarni mavzular bo'yicha guruhlash
LogistikaYetkazish hududlarini belgilash
RasmRanglarni kamaytirish, siqish

K-means #

Eng mashhur klasterlash algoritmi.

K-means to'rt qadamda 1. Tasodifiy markazlar 2. Nuqtalarni biriktirish 3. Markazlarni ko'chirish o'z guruhining o'rtachasiga 4. Takrorlash markazlar o'zgarmaguncha 2 va 3-qadamlar markazlar barqarorlashguncha takrorlanadi
Algoritm oddiy, lekin juda samarali
Python
import numpy as np
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler

np.random.seed(42)

mijozlar = pd.DataFrame({
    "yosh":          np.concatenate([
        np.random.normal(25, 4, 100),
        np.random.normal(45, 6, 100),
        np.random.normal(60, 5, 100),
    ]),
    "yillik_xarid":  np.concatenate([
        np.random.normal(2, 0.6, 100),
        np.random.normal(8, 1.5, 100),
        np.random.normal(5, 1.2, 100),
    ]),
    "tashrif_soni":  np.concatenate([
        np.random.normal(30, 8, 100),
        np.random.normal(12, 4, 100),
        np.random.normal(6, 2, 100),
    ]),
})

masshtab = StandardScaler()
X = masshtab.fit_transform(mijozlar)

kmeans = KMeans(n_clusters=3, random_state=42, n_init=10)
mijozlar["guruh"] = kmeans.fit_predict(X)

print(mijozlar.groupby("guruh").mean().round(1))
print(mijozlar["guruh"].value_counts().sort_index())
Natija
       yosh  yillik_xarid  tashrif_soni
guruh
0      25.1           2.0          29.8
1      45.3           8.1          11.9
2      59.8           5.0           6.1

guruh
0    100
1    100
2     99
Guruhlarga ma'no bering

Model raqamlar berdi, ma'nosini siz topasiz:

GuruhXarakteristikaNom
0Yosh, kam xarid, tez-tez keladiYosh tadqiqotchilar
1O'rta yosh, katta xaridAsosiy mijozlar
2Katta yosh, kam tashrifKamdan-kam xaridorlar

Endi marketing bo'limi har bir guruh uchun alohida taklif tayyorlaydi.

Masshtablash majburiy

K-means Yevklid masofasi bilan ishlaydi.

yosh 20-70, yillik_xarid 1-10 oralig'ida bo'lsa, guruhlar deyarli faqat yosh bo'yicha shakllanadi.

k ni qanday tanlash? #

Algoritm klaster sonini o'zi topa olmaydi - uni siz berasiz.

Tirsak usuli #

Python
inersiya = []
k_qiymatlari = range(1, 11)

for k in k_qiymatlari:
    model = KMeans(n_clusters=k, random_state=42, n_init=10)
    model.fit(X)
    inersiya.append(model.inertia_)

for k, qiymat in zip(k_qiymatlari, inersiya):
    print(f"k={k}: {qiymat:8.1f}")
Natija
k=1:   900.0
k=2:   448.2
k=3:   206.5
k=4:   178.3
k=5:   156.1
k=6:   140.2
Tirsak usuli: egilish nuqtasini toping Klasterlar soni (k) Inersiya tirsak k = 3 1 2 4 5 6 7 tez tushish deyarli tekis
Tirsakdan keyin klaster qo'shish deyarli foyda bermaydi
Inersiya nima?

Har bir nuqtaning o'z klaster markazigacha bo'lgan masofasi kvadratlari yig'indisi.

k oshgani sari u har doim kamayadi. k = n bo'lsa nolga teng bo'ladi - lekin bunday "klasterlash" foydasiz.

Shuning uchun eng kichik inersiyani emas, tirsakni qidiramiz.

Siluet koeffitsiyenti #

Aniqroq usul:

Python
from sklearn.metrics import silhouette_score

for k in range(2, 8):
    model = KMeans(n_clusters=k, random_state=42, n_init=10)
    belgilar = model.fit_predict(X)
    ball = silhouette_score(X, belgilar)
    print(f"k={k}: siluet = {ball:.3f}")
Natija
k=2: siluet = 0.478
k=3: siluet = 0.612
k=4: siluet = 0.481
k=5: siluet = 0.412
k=6: siluet = 0.385
k=7: siluet = 0.361
SiluetMa'nosi
1.0 ga yaqinKlasterlar aniq ajralgan
0.5 atrofidaQoniqarli tuzilma
0 ga yaqinKlasterlar bir-biriga tegib turibdi
ManfiyNuqtalar noto'g'ri klasterga tushgan
Siluet - eng ishonchli usul

Tirsak ba'zan noaniq bo'ladi ("egilish qayerda?"). Siluet esa aniq raqam beradi - eng yuqori qiymatli k ni tanlaysiz.

K-means kamchiliklari #

K-means qachon ishlamaydi? Aylanma shakl K-means faqat to'g'ri chiziq bilan ajratadi Turli o'lcham Katta klasterni bo'lib, kichigini yutib yuboradi Cho'zilgan shakl Doiraviy klaster kutadi - cho'zilganini topa olmaydi
Bunday holatlarda DBSCAN yoki ierarxik klasterlash kerak
KamchilikYechim
k ni oldindan berish kerakTirsak, siluet
Faqat sharsimon klasterlarDBSCAN, GMM
Boshlang'ich markazlarga sezgirn_init=10 (standart)
Chetdagi qiymatlarga sezgirAvval ularni tozalash
Masshtablash majburiyStandardScaler

Ierarxik klasterlash #

Python
from sklearn.cluster import AgglomerativeClustering
from scipy.cluster.hierarchy import dendrogram, linkage
import matplotlib.pyplot as plt

model = AgglomerativeClustering(n_clusters=3, linkage="ward")
belgilar = model.fit_predict(X)

# Dendrogramma
bogliqlik = linkage(X[:50], method="ward")

plt.figure(figsize=(12, 5))
dendrogram(bogliqlik)
plt.title("Dendrogramma")
plt.xlabel("Namunalar")
plt.ylabel("Masofa")
plt.show()
Dendrogramma - birlashishlar daraxti Masofa kesish Chiziqni bu balandlikda kessak - 3 ta klaster hosil bo'ladi
Dendrogramma klaster sonini tanlashda yordam beradi
linkageQanday o'lchaydi
wardIchki tarqoqlikni minimallashtiradi (standart)
completeEng uzoq juftlik masofasi
averageO'rtacha masofa
singleEng yaqin juftlik masofasi
Ierarxik klasterlashning afzalligi

k ni oldindan berish shart emas - dendrogrammani ko'rib, keyin qaror qabul qilasiz.

Kamchiligi: O(n³) murakkablik - 10 000 dan ko'p namunada juda sekin.

DBSCAN #

Zichlikka asoslangan klasterlash.

Python
from sklearn.cluster import DBSCAN

model = DBSCAN(eps=0.5, min_samples=5)
belgilar = model.fit_predict(X)

print(f"Klasterlar: {len(set(belgilar)) - (1 if -1 in belgilar else 0)}")
print(f"Shovqin nuqtalari: {list(belgilar).count(-1)}")
Natija
Klasterlar: 3
Shovqin nuqtalari: 12
DBSCAN ning uchta katta afzalligi
  1. k ni berish shart emas - o'zi topadi
  2. Istalgan shakldagi klasterlarni topa oladi
  3. Chetdagi qiymatlarni -1 deb belgilaydi - anomaliya aniqlash uchun ajoyib

Ikki parametr:

ParametrMa'nosi
epsQo'shni deb hisoblanadigan maksimal masofa
min_samplesZich hudud uchun minimal nuqtalar soni
Python
# eps ni tanlash uchun
from sklearn.neighbors import NearestNeighbors

izlovchi = NearestNeighbors(n_neighbors=5).fit(X)
masofalar, _ = izlovchi.kneighbors(X)
beshinchi = np.sort(masofalar[:, 4])

plt.plot(beshinchi)
plt.ylabel("5-qo'shnigacha masofa")
plt.title("eps ni tirsak nuqtasidan tanlang")
plt.show()
DBSCAN turli zichlikda qiynaladi

Agar bir klaster zich, ikkinchisi siyrak bo'lsa, bitta eps ikkalasiga ham mos kelmaydi.

Bunday holatda HDBSCAN ni sinab ko'ring - u zichlik farqini o'zi hisobga oladi.

Uchta usulni solishtirish #

K-meansIerarxikDBSCAN
k kerakmiHaYo'q (keyin tanlanadi)Yo'q
Klaster shakliSharsimonHar xilHar xil
Chetdagi qiymatlarKlasterga qo'shiladiKlasterga qo'shiladiAlohida belgilanadi
TezlikJuda tezSekinO'rtacha
Katta ma'lumotHaYo'qQisman
Takrorlanuvchanlikrandom_state bilanHaHa

Amaliy misol - rasm siqish #

Python
from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import matplotlib.image as mpimg

rasm = mpimg.imread("rasm.jpg")
shakl = rasm.shape

# Har bir piksel - RGB nuqta
piksellar = rasm.reshape(-1, 3)

# 16 ta asosiy rangga qisqartiramiz
kmeans = KMeans(n_clusters=16, random_state=42, n_init=10)
kmeans.fit(piksellar)

yangi_piksellar = kmeans.cluster_centers_[kmeans.labels_]
siqilgan = yangi_piksellar.reshape(shakl).astype("uint8")

print(f"Asl ranglar:     {len(np.unique(piksellar, axis=0))}")
print(f"Siqilgan:        16")
Natija
Asl ranglar:     147832
Siqilgan:        16
Bu haqiqiy qo'llanish

Rasm 147 832 rangdan 16 rangga qisqardi - hajmi sezilarli kamaydi, lekin ko'rinishi tanib bo'ladigan darajada qoldi.

GIF formati aynan shu prinsipda ishlaydi.

Klasterlash natijasini baholash #

Python
from sklearn.metrics import (
    silhouette_score, calinski_harabasz_score, davies_bouldin_score,
)

belgilar = KMeans(n_clusters=3, random_state=42, n_init=10).fit_predict(X)

print(f"Siluet:           {silhouette_score(X, belgilar):.3f}  (yuqori yaxshi)")
print(f"Calinski-Harabasz: {calinski_harabasz_score(X, belgilar):.1f}  (yuqori yaxshi)")
print(f"Davies-Bouldin:    {davies_bouldin_score(X, belgilar):.3f}  (past yaxshi)")
Eng muhim baho - amaliy foyda

Metrikalar foydali, lekin yakuniy savol boshqa:

"Bu guruhlar biznes uchun ma'noli va foydalimi?"

Agar marketing bo'limi topilgan segmentlar bilan ishlay olsa - klasterlash muvaffaqiyatli. Siluet 0.72 bo'lgani bilan guruhlar tushunarsiz bo'lsa - foydasi yo'q.

Amaliy topshiriq
  1. Uch guruhli sun'iy mijozlar ma'lumotini yarating.
  2. Masshtablang va K-means bilan klasterlang.
  3. Har bir guruhning o'rtacha ko'rsatkichlarini chiqaring.
  4. Guruhlarga ma'noli nom bering.
  5. Tirsak usuli grafigini chizing.
  6. Siluet koeffitsiyentini 2 dan 8 gacha hisoblang.
  7. Masshtablashsiz klasterlang - natija qanday o'zgardi?
  8. AgglomerativeClustering bilan solishtiring va dendrogramma chizing.
  9. DBSCAN bilan sinang, eps ni sozlang, shovqin nuqtalarini sanang.
  10. Ikki belgi bilan klasterlarni rangli nuqtali diagrammada chizing.

Xulosa #

  • Klasterlash - javobsiz ma'lumotdan guruhlarni topish.
  • Model guruhlarni topadi, ma'nosini siz berasiz.
  • K-means: markazlarni tasodifiy qo'y, biriktir, ko'chir, takrorla.
  • Masshtablash majburiy - algoritm masofa bilan ishlaydi.
  • Tirsak usuli va siluet koeffitsiyenti k ni tanlashga yordam beradi.
  • Siluet aniqroq: eng yuqori qiymatli k ni tanlang.
  • K-means faqat sharsimon klasterlarni topadi.
  • Ierarxik klasterlash dendrogramma beradi, k ni keyin tanlaysiz.
  • DBSCAN k ni talab qilmaydi, istalgan shaklni topadi va chetdagi qiymatlarni belgilaydi.
  • Yakuniy baho - metrika emas, amaliy foyda.

Keyingi bo'limda o'lchamni kamaytirishni o'rganamiz.

Xatolik topdingizmi?

Imlo xatosi, ishlamaydigan kod yoki noto‘g‘ri ma‘lumotni ko‘rsangiz - bizga xabar bering. Har bir xabar administrator tomonidan ko‘rib chiqiladi.