---
title: 'Olasılıksal Kümeleme'
source: 'https://academia.sh/tr/kurslar/denetimsiz-ogrenme/olasiliksal-kumeleme'
course: 'Denetimsiz Öğrenme'
language: tr
updated: '2026-08-17T18:10:23+00:00'
license: 'CC BY-SA 4.0'
---

# Olasılıksal Kümeleme

Bir noktanın her kümeye bir sorumluluk payıyla bağlandığı karışım modelinin ölçülmesi: rastgele atama tabanının uyum puanı -4,2424, yinelemeli kestirimin bulduğu modelinki -3,7755, fark +0,4669. Aynı fark sütun içi karıştırılmış kümede +0,3358 çıkıyor, yani farkın yalnız +0,1311'i veriden geliyor. 756 noktanın 74'ünde en büyük pay 0,60'ın altında ve bu noktalarda ortalama en büyük pay 0,5418. Sert atamaya geçildiğinde ortalama belirsizlik 0,3797'den sıfıra düşüyor ve küme büyüklükleri yumuşak kütleden 28,8 noktaya kadar sapıyor. İkinci bir başlangıçta kararsız noktaların yüzde 43,24'ü, kesin noktaların yüzde 7,20'si küme değiştiriyor.

Önceki dersin yordamı bir noktayı ya bir kümeye yazıyor, ya sınıra koyuyor, ya da dışarıda
bırakıyordu. Üç durum da kesindi ve karar defterinde yalnız sonuç duruyordu. İki yoğun bölgenin
tam ortasına düşen bir abone ile bir kümenin göbeğinde duran abone aynı biçimde kaydediliyor,
kararın ne kadar zor verildiği hiçbir yere yazılmıyordu. Aynı şey merkez temelli ve hiyerarşik
bölmeleme için de geçerliydi: çıktı bir küme numarasıydı, bir güven derecesi değil.

Bu ders atamayı bir sayıya çevirir. Her nokta her kümeye bir **sorumluluk payıyla** bağlanır,
bir noktanın payları toplamı bire eşittir ve payların birbirine yakın olması o noktanın
kararsızlığını doğrudan ölçer. Bunun için kümeler artık merkez listeleri değil, kendi merkezi ve
kendi değişkenliği olan **bileşenler** olarak yazılır; kümenin tamamı bu bileşenlerin bir
**karışım modelidir**. Ölçülecek iki şey vardır: model rastgele bir atamayı ne kadar geçiyor, ve
yumuşak atamanın taşıdığı bilgi sert atamaya inilince ne kadar kayboluyor.

- **KU37.** Küme M27/K01–K03'ten gelen **kurgu** abone tablosunun 756 satırlık eğitim payıdır,
  tohum 20260218. Etiket sütunu bu derste de bir kenarda durur.
- **KU38.** Üç sürekli sütun kullanılır: ortalama tüketim, oynaklık ve kişi başına tüketim.
  Tamsayı değerli sütunlar dışarıda bırakılır, çünkü bir bileşen tek bir tamsayı değerine
  çökebilir ve o sütundaki değişkenliği sıfıra indirebilir.
- **KU39.** Her bileşen bir ağırlık, sütun başına bir merkez ve sütun başına bir değişkenlikle
  tanımlanır. Sütunlar arası bağımlılık modellenmez; bu bir **model kararıdır** ve bileşenlerin
  eksen hizalı olmasını gerektirir.
- **KU40.** Değişkenliğe **0,02 alt sınırı** konur. Alt sınır olmadan bir bileşen tek bir noktaya
  çökebilir, o noktadaki yoğunluk sınırsız büyür ve uyum puanı anlamını yitirir. Sınır ölçekli
  sütunlarda birim değişkenliğin ellide biridir.
- **KU41.** **Uyum puanı**, modelin bir noktaya verdiği yoğunluğun doğal logaritmasının nokta
  başına ortalamasıdır. Yüksek olan daha iyidir ve puan yalnız aynı sütun kümesi üzerinde
  karşılaştırılabilir.
- **KU42.** Taban çizgisi **rastgele atamadır**: noktalar üç gruba rastgele dağıtılır ve
  parametreler o dağıtımdan hesaplanır. Bu taban seçilir, çünkü **aynı model biçimini** ve aynı
  parametre sayısını kullanır; aradaki fark yalnız atamadan gelir, model ailesinden değil.
- **KU43.** Küme sayısı üçtür ve bir **ayar değişkenidir**; seçiminin gerekçesi ve seçimin ne
  kadar keyfi olduğu konunun kapanış dersinde ölçülür.
- **KU44.** Yapısız başvuru önceki dersteki gibi **sütun içi yeniden karıştırmayla** kurulur;
  M26/K05'in aracıdır ve sınama kuramı tekrarlanmaz.

## Bileşenlerin Karışımı

Model şudur: kümedeki her nokta, üç bileşenden birinden gelmiş sayılır ama hangisinden geldiği
kaydedilmemiştir. Her bileşen $c$ bir ağırlık $a_c$ taşır (o bileşenden gelen noktaların payı) ve
her sütun için bir merkez $m_{cd}$ ile bir değişkenlik $v_{cd}$ tutar. Bileşenin bir noktaya
verdiği yoğunluk merkezden uzaklaştıkça hızla söner:

$$f_c(x) = \prod_{d} \frac{1}{\sqrt{2\pi v_{cd}}}\,
\exp\left(-\frac{(x_d - m_{cd})^2}{2\,v_{cd}}\right)$$

Bir noktanın bir bileşene bağlanma payı, o bileşenin katkısının toplam katkıya oranıdır:

$$r_{ic} = \frac{a_c\, f_c(x_i)}{\sum_j a_j\, f_j(x_i)}$$

Parametreler bilinmediği için paylar hesaplanamaz, paylar bilinmediği için parametreler
hesaplanamaz. **Yinelemeli kestirim** bu döngüyü kırar: bir tarafı geçici olarak sabitler,
öbürünü hesaplar, sonra yer değiştirir. Her tur uyum puanını artırır ya da yerinde bırakır;
ulaştığı yer başlangıca bağlıdır.

```python
# karisim.py — MODELDIR. M27/K01–K03'un KURGU abone tablosu ayni tohumla uretilir;
# etiket sutunu bu kursta da bir kenarda durur.
import math
import statistics

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [(0.28, 21), (0.22, 17), (0.18, 26), (0.14, 14), (0.18, 23)]


def uretec(t):
    x = ((t ^ (t >> 16)) * 2246822507) & M32
    x = ((x ^ (x >> 13)) * 3266489909) & M32
    s = [(x ^ (x >> 16)) & M32]

    def sonraki():
        s[0] = (s[0] * 1664525 + 1013904223) & M32
        return s[0] / 4294967296
    return sonraki


def ayrik(u, w):
    t = 0.0
    for i, x in enumerate(w):
        t += x
        if u < t:
            return i
    return len(w) - 1


ABONE, VERI = [], []
for i in range(HAM):
    r = uretec(TOHUM + i)
    b = BOLGE[ayrik(r(), [x[0] for x in BOLGE])]
    hane = 1 + ayrik(r(), [0.06, 0.24, 0.30, 0.24, 0.11, 0.05])
    memnun = 1 + ayrik(r(), [0.08, 0.14, 0.27, 0.34, 0.17])
    if r() >= 0.046:
        ABONE.append((10001 + i, b[1], hane, memnun))
for no, taban, hane, memnun in ABONE:
    r, v = uretec(TOHUM + 7000 + no), []
    for d in range(ayrik(r(), [0.05, 0.12, 0.21, 0.62])):
        v.append(0.0 if r() < 0.038 else math.floor(
            taban * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if v:
        ort = round(sum(v) / len(v), 2)
        VERI.append({"ort_tuketim": ort, "oynaklik": round(max(v) - min(v), 2),
                     "kisi_basi": round(ort / hane, 3)})

SEC = ["ort_tuketim", "oynaklik", "kisi_basi"]


def karistir(veri, tohum):
    r, s = uretec(tohum), list(range(len(veri)))
    for i in range(len(s) - 1, 0, -1):
        j = int(r() * (i + 1))
        s[i], s[j] = s[j], s[i]
    return [veri[i] for i in s]


EGT = karistir(VERI, TOHUM + 90000)[:756]
OLCEK = {a: (statistics.fmean(x[a] for x in EGT),
             statistics.pstdev([x[a] for x in EGT])) for a in SEC}
P = [[(x[a] - OLCEK[a][0]) / OLCEK[a][1] for a in SEC] for x in EGT]
K, ALT = 3, 0.02                                 # kume sayisi ve degiskenlik alt siniri


def parametre(P, uye, k):                        # MODELDIR: agirlik, merkez, degiskenlik
    A, M, V = [], [], []
    for c in range(k):
        w = [u[c] for u in uye]
        t = sum(w) + 1e-9
        m = [sum(w[i] * P[i][d] for i in range(len(P))) / t for d in range(len(P[0]))]
        V.append([max(sum(w[i] * (P[i][d] - m[d]) ** 2 for i in range(len(P))) / t, ALT)
                  for d in range(len(P[0]))])
        A.append(t / len(P))
        M.append(m)
    return A, M, V


def sorumluluk(P, A, M, V):                      # yumusak atama ve uyum puani
    R, top = [], 0.0
    for x in P:
        g = [math.log(A[c]) + sum(-0.5 * (math.log(2 * math.pi * V[c][d])
                                          + (x[d] - M[c][d]) ** 2 / V[c][d])
                                  for d in range(len(x))) for c in range(len(A))]
        b = max(g)
        s = sum(math.exp(u - b) for u in g)
        top += b + math.log(s)
        R.append([math.exp(u - b) / s for u in g])
    return R, top / len(P)


def rastgele_uyelik(n, k, tohum):                # TABAN CIZGISI: rastgele atama
    r, U = uretec(tohum), []
    for _ in range(n):
        c = int(r() * k)
        U.append([1.0 if j == c else 0.0 for j in range(k)])
    return U


def kestir(P, k, tohum, tur=80):                 # MODELDIR: yinelemeli kestirim
    U = rastgele_uyelik(len(P), k, tohum)
    for _ in range(tur):
        U, puan = sorumluluk(P, *parametre(P, U, k))
    return U, puan


def sutun_karistir(P, tohum):
    Y = [list(x) for x in P]
    for s in range(len(P[0])):
        for i, j in enumerate(karistir(list(range(len(P))), tohum + s * 17)):
            Y[i][s] = P[j][s]
    return Y


def taban_puani(P, k, tohum):
    return sorumluluk(P, *parametre(P, rastgele_uyelik(len(P), k, tohum), k))[1]


U, PUAN = kestir(P, K, TOHUM + 120000)
TABAN = taban_puani(P, K, TOHUM + 120000)
YAP = sutun_karistir(P, TOHUM + 610000)          # KURGU: sutun ici yeniden karistirma
_, YPUAN = kestir(YAP, K, TOHUM + 120000)
YTABAN = taban_puani(YAP, K, TOHUM + 120000)
print(f"nokta {len(P)}, sutun {len(SEC)}, bilesen {K}")
print(f"{'kume':<16}{'taban cizgisi':>15}{'karisim modeli':>16}{'fark':>10}")
print(f"{'veri':<16}{TABAN:>15.4f}{PUAN:>16.4f}{PUAN - TABAN:>+10.4f}")
print(f"{'karistirilmis':<16}{YTABAN:>15.4f}{YPUAN:>16.4f}{YPUAN - YTABAN:>+10.4f}")
print(f"veriden gelen pay {(PUAN - TABAN) - (YPUAN - YTABAN):+.4f}")
```

```
nokta 756, sutun 3, bilesen 3
kume              taban cizgisi  karisim modeli      fark
veri                    -4.2424         -3.7755   +0.4669
karistirilmis           -4.2443         -3.9085   +0.3358
veriden gelen pay +0.1311
```

Rastgele atama tabanı **-4,2424**, karışım modeli **-3,7755**, fark **+0,4669**. Taban çizgisi
burada bilinçli olarak zor seçilmiştir: rastgele atama da üç bileşen kurar, aynı sayıda parametre
hesaplar ve aynı yoğunluk biçimini kullanır. Tek eksiği, hangi noktanın hangi bileşene ait
olduğunu **öğrenmemesidir**. Böylece fark model ailesinden değil, yalnız atamadan gelir.

İkinci satır bu farkın ne kadarının veriden geldiğini söyler. Sütunları kendi içinde karıştırılan
kümede aynı yordam **+0,3358** kazanıyor. Yani kazancın yaklaşık dörtte üçü, sütunlar arasında
hiçbir ilişki kalmadığında bile duruyor. Sebep açıktır: üç bileşen, tek bir bileşenin
yakalayamayacağı çarpık ve uzun kuyruklu bir dağılımı eksen eksen daha iyi sarar; bu, verideki
küme yapısı hakkında hiçbir şey söylemez, modelin esnekliği hakkında bir şey söyler. Sütunlar
arası yapıya düşen pay **+0,1311**, yani toplam farkın yaklaşık yüzde yirmi sekizi. Kursun sorusu
tam burada karşılığını buluyor: fark ölçütten mi veriden mi geliyor sorusunun yanıtı çoğu zaman
"ikisinden de" olur ve payları ayırmadan sayı okunamaz.

## Yumuşak Atamanın Taşıdığı Belirsizlik

Sorumluluk payı, sert atamanın atmak zorunda olduğu bilgiyi tutar. Bir noktanın payları
$0{,}98 / 0{,}01 / 0{,}01$ ise atama kesindir; $0{,}40 / 0{,}38 / 0{,}22$ ise atama bir seçimdir
ve seçimin ne kadar ince olduğu paylarda yazılıdır. Belirsizliği tek sayıya indirmek için
payların **doğal logaritmayla ağırlıklı toplamı** kullanılır; bu sayı tek bir paya bütün ağırlık
verildiğinde sıfır, paylar eşit dağıldığında en büyük değerine ulaşır.

```python
def belirsizlik(r):
    return -sum(p * math.log(p) for p in r if p > 1e-12)


SERT = [max(range(K), key=lambda c: r[c]) for r in U]
kars = [i for i, r in enumerate(U) if max(r) < 0.60]
A, _, _ = parametre(P, U, K)
print(f"en buyuk sorumluluk payi 0.60'in altinda olan nokta {len(kars)}; "
      f"bu noktalarda ortalama en buyuk pay {sum(max(U[i]) for i in kars) / len(kars):.4f}")
print(f"ilk iki payi 0.10'dan yakin {sum(1 for r in U if sorted(r)[-1] - sorted(r)[-2] < 0.10)}"
      f"; en buyuk payi 0.99 ve ustu {sum(1 for r in U if max(r) >= 0.99)}")
print(f"ortalama belirsizlik: yumusak atamada "
      f"{sum(belirsizlik(r) for r in U) / len(U):.4f}, sert atamada 0.0000, "
      f"ust sinir {math.log(K):.4f}")
print(f"{'kume':<8}{'yumusak kutle':>15}{'sert sayim':>12}{'fark':>8}")
for c in range(K):
    print(f"{c:<8}{A[c] * len(P):>15.1f}{SERT.count(c):>12}"
          f"{SERT.count(c) - A[c] * len(P):>+8.1f}")
```

```
en buyuk sorumluluk payi 0.60'in altinda olan nokta 74; bu noktalarda ortalama en buyuk pay 0.5418
ilk iki payi 0.10'dan yakin 28; en buyuk payi 0.99 ve ustu 94
ortalama belirsizlik: yumusak atamada 0.3797, sert atamada 0.0000, ust sinir 1.0986
kume      yumusak kutle  sert sayim    fark
0                 217.8         189   -28.8
1                 200.3         213   +12.7
2                 337.9         354   +16.1
```

Eşik 0,60 seçilmiştir, çünkü üç bileşende eşit dağılım 0,3333 eder ve 0,60'ın altındaki bir en
büyük pay, o noktanın ağırlığının **çoğunluğunun tek bir kümede toplanmadığı** anlamına gelir.
756 noktanın **74'ü** bu durumdadır ve bu noktalarda en büyük pay ortalama **0,5418**. Yirmi
sekiz noktada ilk iki pay birbirinden 0,10'dan az farklıdır — bu noktalarda sert atamanın
seçtiği küme ile ikinci sıradaki küme neredeyse eşit haklıdır. Öbür uçta 94 nokta 0,99 ve üstü
bir payla tek bir kümeye bağlıdır.

Ortalama belirsizlik yumuşak atamada **0,3797**, üst sınırı **1,0986**. Sert atamaya geçildiğinde
bu sayı tanım gereği **sıfıra** düşer: her nokta tek bir kümeye tam ağırlıkla yazılır ve 74
noktanın kararsız olduğu bilgisi tabloda kalmaz. Kaybın somut karşılığı küme büyüklüklerindedir.
Yumuşak atamada birinci kümenin kütlesi 217,8 nokta ederken sert atama o kümeye 189 nokta yazar;
aradaki **28,8 noktalık** sapma, sınırdaki noktaların tamamının bir tarafa yuvarlanmasından
gelir. Kümelerin göreli büyüklüğüne dayanan her karar bu yuvarlamayı devralır.

## Payların Sınanması

Buraya kadar sorumluluk payının anlamlı olduğu varsayıldı. Bu sınanabilir bir iddiadır: pay
gerçekten kararın zorluğunu ölçüyorsa, kararsız noktalar koşullar biraz değiştiğinde küme
değiştirmeli, kesin noktalar değiştirmemelidir. Değiştirilecek koşul hazırdır — yinelemeli
kestirim başlangıca duyarlıdır ve konunun ikinci dersi bunu merkez temelli bölmelemede ölçmüştü.
İkinci bir başlangıçla koşulan model, kümeler merkezleri üzerinden eşleştirildikten sonra
birinciyle karşılaştırılır.

```python
U2, PUAN2 = kestir(P, K, TOHUM + 555000)
_, M, _ = parametre(P, U, K)
_, M2, _ = parametre(P, U2, K)
ESLE = [min(range(K), key=lambda c: math.dist(M2[j], M[c])) for j in range(K)]
SERT2 = [ESLE[max(range(K), key=lambda c: r[c])] for r in U2]
degisen = [i for i in range(len(P)) if SERT[i] != SERT2[i]]
kesin = [i for i, r in enumerate(U) if max(r) >= 0.90]
dk = sum(1 for i in degisen if max(U[i]) < 0.60)
de = sum(1 for i in degisen if max(U[i]) >= 0.90)
print(f"ikinci baslangicin uyum puani {PUAN2:.4f} (birincisi {PUAN:.4f}); "
      f"kume eslestirmesi {ESLE}")
print(f"kume degistiren nokta {len(degisen)} / {len(P)}")
print(f"kararsiz noktalarda degisim {dk}/{len(kars)} = {dk / len(kars):.4f}")
print(f"kesin noktalarda (pay >= 0.90) degisim {de}/{len(kesin)} = {de / len(kesin):.4f}")
```

```
ikinci baslangicin uyum puani -3.7827 (birincisi -3.7755); kume eslestirmesi [1, 0, 2]
kume degistiren nokta 125 / 756
kararsiz noktalarda degisim 32/74 = 0.4324
kesin noktalarda (pay >= 0.90) degisim 29/403 = 0.0720
```

İki koşum farklı yerlerde duruyor: uyum puanları **-3,7755** ve **-3,7827**. Aradaki fark
küçüktür ama bölmeleme farkı küçük değildir — 756 noktanın **125'i** küme değiştiriyor. Bu, yalnız
uyum puanına bakarak "model yakınsadı" demenin yeterli olmadığını gösterir.

Asıl sayı ayrışmadadır. Kararsız 74 noktanın **32'si**, yani yüzde **43,24**'ü küme değiştiriyor.
Payı 0,90 ve üstü olan 403 noktanın ise yalnız **29'u**, yüzde **7,20**'si. Oran altı katın
üzerinde. Sorumluluk payı, hesaplandığı modelin dışında bir şeyi doğru kestiriyor: bir noktanın
atamasının ne kadar kırılgan olduğunu. Sert atama bu bilgiyi taşımaz — bir küme numarası, yüzde
43 ihtimalle değişecek bir numara ile yüzde 7 ihtimalle değişecek bir numarayı aynı biçimde
gösterir.

## Özet

- Karışım modeli kümeleri merkez ve değişkenlikle tanımlanan bileşenler olarak yazar; her nokta
  her bileşene bir sorumluluk payıyla bağlanır ve paylar toplamı birdir.
- Rastgele atama tabanı -4,2424, modelin uyum puanı -3,7755, fark +0,4669; taban aynı model
  biçimini ve aynı parametre sayısını kullandığı için fark yalnız atamadan gelir.
- Aynı fark sütun içi karıştırılmış kümede +0,3358 çıkıyor; sütunlar arası yapıya düşen pay
  +0,1311, yani toplam farkın yaklaşık yüzde yirmi sekizi. Geri kalanı modelin esnekliğidir.
- 756 noktanın 74'ünde en büyük pay 0,60'ın altında (ortalama 0,5418) ve 28 noktada ilk iki pay
  0,10'dan yakın. Sert atamaya geçince ortalama belirsizlik 0,3797'den sıfıra düşer ve bir kümenin
  sayımı yumuşak kütlesinden 28,8 nokta sapar.
- Sorumluluk payı modelin dışında da bir şey ölçüyor: ikinci bir başlangıçta kararsız noktaların
  yüzde 43,24'ü, kesin noktaların yüzde 7,20'si küme değiştiriyor.

## Sonraki Adım

Bu derste küme sayısı üç alındı ve bu seçim gerekçelendirilmedi. Önceki üç derste de benzer
seçimler yapıldı: kaç küme, hangi kesme yüksekliği, hangi komşuluk yarıçapı. Her seferinde
seçimin sonucu oynattığı gösterildi ama seçimin **kendisinin** nasıl yapılacağı ertelendi. Konunun
kapanış dersi bu soruyu alır ve yanıtın olmadığını sayıyla gösterir: aynı veri üzerinde üç ayrı
iç geçerlilik ölçütü üç ayrı küme sayısı seçer, hiçbiri diğerinden daha doğru değildir, ve tümüyle
rastgele üretilmiş yapısız bir kümede aynı üç ölçüt yine bir küme sayısı seçer. Ardından etiket,
bu kursta ilk ve tek kez, **dış geçerlilik** için açılır ve etiketin işaret ettiği küme sayısıyla
iç ölçütlerin seçtiklerinin uyuşmadığı sayılır.
