---
title: 'Birliktelik Kuralları'
source: 'https://academia.sh/tr/kurslar/denetimsiz-ogrenme/birliktelik-kurallari'
course: 'Denetimsiz Öğrenme'
language: tr
updated: '2026-08-17T18:10:23+00:00'
license: 'CC BY-SA 4.0'
---

# Birliktelik Kuralları

Kurgu abone tablosunun 1.329 sepetinde destek tabanını geçen 166 kuralın ölçülmesi: güvene göre ilk altı kuralın altısı da aynı sık öğeyi sonuç gösterir ve kaldıraçları 1,0139 ile 1,0489 arasındadır; güveni 0,50'nin üstündeki 97 kuralın 75'inin kaldıracı 1'e 0,05'ten yakındır. Taban çizgisi rastgele eşleşmenin ürettiği destektir — öğe sütunları ayrı ayrı karıştırıldığında gecikme ile taksitlendirmenin 0,1279 desteği altmış karıştırmanın hiçbirinde 0,0467'yi aşmaz, ama güveni 0,9246 olan bir kuralın desteği rastgele aralığın içinde kalır. Kurs kapanışı on bir dersin tabanını, yöntemin sayısını ve farkını tek tabloda toplar.

Önceki ders bir satırın tek başına durup durmadığını sordu ve yanıtı beş sayısal sütunda aradı.
Abone kayıtlarının sayı olmayan bir yanı daha var: dönem içinde o abonede **hangi olayların
birlikte** geçtiği. Soru biçimini koruyor: iki olayın birlikte görülmesi bir bulgu mudur, yoksa
ikisinin ayrı ayrı ne kadar sık olduğuyla zaten açıklanabilir mi.

Birliktelik kuralları bu soruyu üç ölçütle yanıtlar ve biri tek başına yanıltır. Dersin sayısı,
**güvene göre seçilen kuralların kaçının yalnız sık öğeden geldiğidir**; tabanı, öğeler birbirine
**rastgele eşlendiğinde** çıkan destektir.

- **BA36.** Küme M27/K01–K03'ün **kurgu** abone tablosudur, tohum 20260218, 1.329 abone. Her abone
  bir **öğe kümesi** olarak okunur: dönem içinde o abonede geçen hizmet kayıtları.
- **BA37.** Bağımlılıklar üretece **bilerek** konmuştur ve hangisinin gerçek olduğu yalnız ölçüm
  için bilinir; hiçbir ölçüt bu bilgiyi görmez.
- **BA38.** Üç ölçüt: **destek**, öğe kümesinin sepetlerdeki payı; **güven**, öncül geçtiğinde
  sonucun da geçme payı; **kaldıraç**, güvenin sonucun desteğine bölümü. Kaldıraç **1'den sapma**
  olarak okunur; 1 birlikteliğin yokluğudur.
- **BA39.** Taban çizgisi **rastgele eşleşmenin ürettiği destektir**: her öğenin sütunu sepetler
  arasında ayrı karıştırılır, sıklıklar korunur, birlikte geçme bağı kopar.
- **BA40.** Bu ders yalnız **kural çıkarmanın ölçütlerini** kurar; hangi kuralın kime gösterileceği
  M27/K07'ye bırakılır.

## Sepetler ve Öğe Destekleri

```python
# ORTAK — KURGUDUR. M27/K01-K03'un abone tablosu ayni tohumla kurulur; bu kez her
# abonenin donem icindeki hizmet kayitlari bir OGE KUMESI olarak tutulur.
# Bagimliliklar uretece BILEREK konmustur ve yalniz olcum icin bilinir.
TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF


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


ABONE = []
for i in range(HAM):
    r = uretec(TOHUM + i)
    r(), r(), r()          # bolge, hane ve memnuniyet bu derste okunmuyor
    if r() >= 0.046:
        ABONE.append(10001 + i)

# (oge, kosul ogesi, kosul saglaninca olasilik, saglanmayinca olasilik)
TABLO = [("mobil_bildirim", None, 0.91, 0.91),        # bagimsiz, cok sik
         ("kesinti_bildirimi", None, 0.55, 0.55),     # bagimsiz, cok sik
         ("gecikme", None, 0.22, 0.22),
         ("taksitlendirme", "gecikme", 0.58, 0.04),   # yerlestirilmis bagimlilik
         ("otomatik_odeme", "gecikme", 0.13, 0.47),   # yerlestirilmis ters bagimlilik
         ("itiraz", None, 0.16, 0.16),
         ("cagri_merkezi", "itiraz", 0.90, 0.58),     # zayif bagimlilik, sik oge
         ("adres_degisikligi", None, 0.08, 0.08),
         ("sayac_degisimi", "adres_degisikligi", 0.36, 0.09),
         ("saha_ziyareti", "sayac_degisimi", 0.86, 0.19),
         ("tarife_degisikligi", None, 0.12, 0.12),
         ("kacak_ihbari", None, 0.05, 0.05)]
OGELER = [t[0] for t in TABLO]

SEPET = []
for no in ABONE:
    r, s = uretec(TOHUM + 37000 + no), set()
    for oge, kosul, p1, p0 in TABLO:
        if r() < (p1 if kosul is None or kosul in s else p0):
            s.add(oge)
    SEPET.append(s)

N = len(SEPET)
D1 = {o: sum(1 for s in SEPET if o in s) / N for o in OGELER}
print(f"kurgu: {N} abone sepeti, {len(OGELER)} oge; "
      f"sepet basina ortalama {sum(len(s) for s in SEPET) / N:.2f} oge")
for o in sorted(OGELER, key=lambda x: -D1[x]):
    print(f"  {o:<20} destek {D1[o]:.4f}")
```

```
kurgu: 1329 abone sepeti, 12 oge; sepet basina ortalama 3.68 oge
  mobil_bildirim       destek 0.9120
  cagri_merkezi        destek 0.6388
  kesinti_bildirimi    destek 0.5403
  otomatik_odeme       destek 0.3973
  saha_ziyareti        destek 0.2671
  gecikme              destek 0.2220
  taksitlendirme       destek 0.1670
  itiraz               destek 0.1497
  sayac_degisimi       destek 0.1332
  tarife_degisikligi   destek 0.1151
  adres_degisikligi    destek 0.0835
  kacak_ihbari         destek 0.0512
```

Destekler geniş bir aralığa yayılıyor: en sık öğe sepetlerin 0,9120'sinde, en seyreği 0,0512'sinde.
Bu dağılım sonraki bölümün tuzağını kurar.

## Güven Tek Başına

```python
# Kural cikarma: onculde bir ya da iki oge, sonucta bir oge. Destek tabani
# bir karardir ve olcumden once sabitlenir.
from itertools import combinations

DESTEK_TABANI, GUVEN_TABANI = 0.05, 0.50


def destek(kume):
    return sum(1 for s in SEPET if kume <= s) / N


KURAL = []
onculler = [frozenset([o]) for o in OGELER] + \
           [frozenset(c) for c in combinations(OGELER, 2)]
for X in onculler:
    dx = destek(X)
    if dx < DESTEK_TABANI:
        continue
    for y in OGELER:
        if y in X:
            continue
        d = destek(X | {y})
        if d < DESTEK_TABANI:
            continue
        g = d / dx
        KURAL.append({"X": X, "y": y, "destek": d, "guven": g,
                      "kaldirac": g / D1[y]})

BIR = sum(1 for k in KURAL if len(k["X"]) == 1)
yakin = [k for k in KURAL if abs(k["kaldirac"] - 1) <= 0.05]
print(f"destek tabani {DESTEK_TABANI:.2f} ve uzerinde {len(KURAL)} kural "
      f"({BIR} tek ogeli oncul, {len(KURAL) - BIR} iki ogeli)")
print(f"kaldiraci 1'e 0,05'ten yakin kural: {len(yakin)} "
      f"({len(yakin) / len(KURAL):.4f})\n")


def yaz(baslik, sirali, adet=8):
    print(baslik)
    print(f"  {'kural':<46} {'destek':>7} {'guven':>7} {'kaldirac':>9}")
    for k in sirali[:adet]:
        ad = " + ".join(sorted(k["X"])) + " -> " + k["y"]
        print(f"  {ad:<46} {k['destek']:>7.4f} {k['guven']:>7.4f} "
              f"{k['kaldirac']:>9.4f}")


yuksek = sorted(KURAL, key=lambda k: (-k["guven"], sorted(k["X"]), k["y"]))
yaz("guvene gore ilk alti kural", yuksek, 6)
ilk = [k for k in yuksek if k["guven"] >= GUVEN_TABANI]
sik = sum(1 for k in ilk if abs(k["kaldirac"] - 1) <= 0.05)
print(f"\nguveni {GUVEN_TABANI:.2f} ve uzerinde {len(ilk)} kural var; "
      f"bunlarin {sik} tanesinin kaldiraci 1'e 0,05'ten yakin ({sik / len(ilk):.4f})")
son = {}
for k in ilk:
    son[k["y"]] = son.get(k["y"], 0) + 1
print("  sonuc ogesine gore: " + ", ".join(
    f"{o} {son[o]} (destek {D1[o]:.4f})" for o in sorted(son, key=lambda x: -son[x])))

tek = [k for k in KURAL if len(k["X"]) == 1]
yaz("\nkaldirac'a gore ilk dort kural (tek ogeli oncul)",
    sorted(tek, key=lambda k: (-k["kaldirac"], sorted(k["X"]), k["y"])), 4)
en_dusuk = min(tek, key=lambda k: (k["kaldirac"], sorted(k["X"]), k["y"]))
print(f"  en dusuk kaldiracli kural: {' + '.join(sorted(en_dusuk['X']))} -> "
      f"{en_dusuk['y']}, destek {en_dusuk['destek']:.4f}, "
      f"guven {en_dusuk['guven']:.4f}, kaldirac {en_dusuk['kaldirac']:.4f}")
```

```
destek tabani 0.05 ve uzerinde 166 kural (64 tek ogeli oncul, 102 iki ogeli)
kaldiraci 1'e 0,05'ten yakin kural: 115 (0.6928)

guvene gore ilk alti kural
  kural                                           destek   guven  kaldirac
  kesinti_bildirimi + tarife_degisikligi -> mobil_bildirim  0.0662  0.9565    1.0489
  tarife_degisikligi -> mobil_bildirim            0.1076  0.9346    1.0249
  itiraz + otomatik_odeme -> mobil_bildirim       0.0602  0.9302    1.0200
  cagri_merkezi + tarife_degisikligi -> mobil_bildirim  0.0700  0.9300    1.0198
  adres_degisikligi -> mobil_bildirim             0.0775  0.9279    1.0175
  itiraz -> mobil_bildirim                        0.1384  0.9246    1.0139

guveni 0.50 ve uzerinde 97 kural var; bunlarin 75 tanesinin kaldiraci 1'e 0,05'ten yakin (0.7732)
  sonuc ogesine gore: mobil_bildirim 32 (destek 0.9120), cagri_merkezi 28 (destek 0.6388), kesinti_bildirimi 25 (destek 0.5403), saha_ziyareti 4 (destek 0.2671), gecikme 4 (destek 0.2220), taksitlendirme 4 (destek 0.1670)

kaldirac'a gore ilk dort kural (tek ogeli oncul)
  kural                                           destek   guven  kaldirac
  taksitlendirme -> gecikme                       0.1279  0.7658    3.4498
  gecikme -> taksitlendirme                       0.1279  0.5763    3.4498
  saha_ziyareti -> sayac_degisimi                 0.1159  0.4338    3.2572
  sayac_degisimi -> saha_ziyareti                 0.1159  0.8701    3.2572
  en dusuk kaldiracli kural: kesinti_bildirimi -> saha_ziyareti, destek 0.1362, guven 0.2521, kaldirac 0.9437
```

Güvene göre ilk altı kuralın **altısının da sonucu aynı öğe**: sepetlerin 0,9120'sinde geçen
kayıt. Güvenleri 0,9246–0,9565, öncülleri birbiriyle ilgisiz. **Hangi öncül seçilirse seçilsin**
güven 0,91 dolayına oturur; kaldıraç sütunu bunu söylüyor, 1,0139 ile 1,0489 arasında.

Güveni 0,50'nin üstünde 97 kural var ve **75'inin** kaldıracı 1'e 0,05'ten yakın: 0,7732. Sonuç
öğesine göre 32, 28 ve 25 kural en sık üç öğeyi gösteriyor — 97'nin 85'i. Eşiği yükseltmek bunu
düzeltmez; eşik yükseldikçe onu **yalnız sık öğeler** geçebilir.

Kaldıraca göre sıralama başka bir liste veriyor: ilk dörtte iki çift, her çift iki yönde —
taksitlendirme ile gecikme 3,4498, sayaç değişimi ile saha ziyareti 3,2572. Aynı satırlarda güvenin
**bakışımsız**, kaldıracın **bakışımlı** olduğu okunuyor: gecikmeden taksitlendirmeye güven 0,5763,
ters yönde 0,7658, kaldıraç ikisinde de aynı. En düşük kaldıraç 0,9437; 1'in altına düşen bir
kaldıraç birlikte geçmenin rastlantıdan **daha seyrek** olduğunu söyler.

## Rastgele Eşleşme Tabanı

```python
# TABAN CIZGISI: rastgele eslesmenin urettigi destek. Her ogenin sutunu
# sepetler arasinda ayri ayri karistirilir; oge sikliklari birebir korunur,
# birlikte gecme bagi kopar. Kaldirac bu tabanin kapali bicimidir.
BIT = {o: 1 << b for b, o in enumerate(OGELER)}
SUTUN = [[1 if o in s else 0 for s in SEPET] for o in OGELER]
TEKRAR = 60


def ustkume_toplami(maskeler):
    # Her desen icin o deseni kapsayan sepet sayisi: 12 bitlik tek gecis.
    h = [0] * (1 << len(OGELER))
    for m in maskeler:
        h[m] += 1
    for b in range(len(OGELER)):
        for m in range(len(h)):
            if not m & (1 << b):
                h[m] += h[m | (1 << b)]
    return h


def karistirilmis(tohum):
    rr, yeni = uretec(tohum), [0] * N
    for b, sut in enumerate(SUTUN):
        c = list(sut)
        for i in range(N - 1, 0, -1):
            j = int(rr() * (i + 1))
            c[i], c[j] = c[j], c[i]
        for i in range(N):
            if c[i]:
                yeni[i] |= 1 << b
    return yeni


RAST = [ustkume_toplami(karistirilmis(TOHUM + 41000 + t)) for t in range(TEKRAR)]
ORNEK = (("gecikme", "taksitlendirme"), ("sayac_degisimi", "saha_ziyareti"),
         ("tarife_degisikligi", "mobil_bildirim"), ("itiraz", "mobil_bildirim"))
desen = lambda k: sum(BIT[o] for o in k["X"]) | BIT[k["y"]]
rastgele = lambda k: [R[desen(k)] / N for R in RAST]

print(f"{TEKRAR} karistirmada rastgele eslesmenin urettigi destek\n")
print(f"  {'kural':<38} {'gercek':>7} {'rastgele':>9} {'en cok':>7} {'kaldirac':>9}")
for k in sorted((k for k in KURAL if len(k["X"]) == 1
                 and (sorted(k["X"])[0], k["y"]) in ORNEK),
                key=lambda k: -k["kaldirac"]):
    r = rastgele(k)
    print(f"  {sorted(k['X'])[0] + ' -> ' + k['y']:<38} {k['destek']:>7.4f} "
          f"{sum(r) / len(r):>9.4f} {max(r):>7.4f} {k['kaldirac']:>9.4f}")

DISARIDA = {i: k["destek"] > max(rastgele(k)) or k["destek"] < min(rastgele(k))
            for i, k in enumerate(KURAL)}
print(f"\n{len(KURAL)} kural iki olcute gore ayni anda ayriliyor")
print(f"  {'':<22} {'aralik icinde':>14} {'aralik disinda':>15}")
for ad, kosul in (("kaldirac 1'e yakin", True), ("kaldirac 1'den uzak", False)):
    g = [i for i, k in enumerate(KURAL) if (abs(k["kaldirac"] - 1) <= 0.05) == kosul]
    ic = sum(1 for i in g if not DISARIDA[i])
    print(f"  {ad:<22} {ic:>14} {len(g) - ic:>15}")

dt = destek(frozenset(["gecikme", "otomatik_odeme"]))
print(f"\ndestek tabaninin altinda kalan bir bagimlilik: gecikme + otomatik_odeme "
      f"destek {dt:.4f}, kaldirac {dt / (D1['gecikme'] * D1['otomatik_odeme']):.4f}; "
      f"taban {DESTEK_TABANI:.2f} oldugu icin kural listesine hic girmiyor")
```

```
60 karistirmada rastgele eslesmenin urettigi destek

  kural                                   gercek  rastgele  en cok  kaldirac
  gecikme -> taksitlendirme               0.1279    0.0362  0.0467    3.4498
  sayac_degisimi -> saha_ziyareti         0.1159    0.0354  0.0451    3.2572
  tarife_degisikligi -> mobil_bildirim    0.1076    0.1043  0.1099    1.0249
  itiraz -> mobil_bildirim                0.1384    0.1363  0.1407    1.0139

166 kural iki olcute gore ayni anda ayriliyor
                          aralik icinde  aralik disinda
  kaldirac 1'e yakin                107               8
  kaldirac 1'den uzak                26              25

destek tabaninin altinda kalan bir bagimlilik: gecikme + otomatik_odeme destek 0.0316, kaldirac 0.3584; taban 0.05 oldugu icin kural listesine hic girmiyor
```

Taban çizgisi ilk iki satırda. Gecikme ile taksitlendirme sepetlerin 0,1279'unda birlikte geçiyor;
sütunlar karıştırıldığında aynı çift ortalama 0,0362'ye iniyor ve altmış karıştırmanın **en yükseği
0,0467**. Fark 0,0917 ve veriden geliyor.

Son iki satır tersini gösteriyor. Güveni 0,9246 olan kuralın desteği 0,1384; rastgele eşleşme aynı
çifti ortalama 0,1363'e, en yüksek 0,1407'ye taşıyor. **Gerçek destek rastgele aralığın içinde**;
kural yüksek güveni tümüyle sonucun kendi sıklığından alıyor. Kaldıraç bu tabanın kapalı biçimidir:
desteklerin çarpımına bölmek, karıştırmanın ortalamada ürettiğine bölmektir.

İki ölçüt çaprazlandığında 166 kural dört kutuya dağılıyor: kaldıracı 1'e yakın 115 kuralın 107'si
rastgele aralığın içinde, kaldıracı uzak 51 kuralın 26'sı da. Toplam 133 kural rastgele eşleşmenin
ürettiğinden ayırt edilemiyor. Ters yöndeki 8 satır da anlamlıdır: destek büyüdükçe aralık daralır
ve 1,04'lük bir kaldıraç bile dışarı düşer. Kaldıracın sapması yetmez, **sapmanın rastlantıyla ne
sıklıkta üretildiği** de gerekir.

Son satır başka bir yüz açıyor. Gecikme ile otomatik ödeme arasındaki kurgu bağımlılığın kaldıracı
0,3584, listedeki her şeyden uzak; ama ikisi birlikte sepetlerin yalnız 0,0316'sında geçtiği için
destek tabanının altında kalıyor ve listeye **hiç girmiyor**. Taban 0,03 olsaydı bu kural listenin
başında olurdu.

## Özet

- Güvene göre ilk altı kuralın altısının da sonucu sepetlerin 0,9120'sinde geçen aynı öğedir;
  kaldıraçları 1,0139–1,0489.
- Güveni 0,50'nin üstündeki 97 kuralın 75'inin kaldıracı 1'e 0,05'ten yakındır ve 85'i en sık üç
  öğeyi sonuç gösterir.
- Taban rastgele eşleşmenin ürettiği destektir: gecikme ile taksitlendirmenin 0,1279'luk desteği
  altmış karıştırmanın hiçbirinde 0,0467'yi aşmaz, ama güveni 0,9246 olan kuralın desteği rastgele
  aralığın içinde kalır.
- 166 kuralın 133'ü rastgele eşleşmenin ürettiğinden ayırt edilemiyor.
- Destek tabanı bir karardır: kaldıracı 0,3584 olan gerçek bir bağımlılık, desteği 0,0316 olduğu
  için 0,05'lik tabanın altında kalır ve listeye hiç girmez.

## Kurs Kapanışı

On bir dersin hesabı tek tabloda ve her sayı kendi dersinden okundu. Üçlü her satırda aynıdır,
ama **satırlar ortak bir birim taşımaz**: etiket yokken ölçütü de her ders kendisi seçer. Son sütun
bunu yazar — uzaklık ve hata satırlarında küçük olan iyidir, oran ve puan satırlarında büyük olan.
Fark, yöntemin sayısı eksi tabandır.

| Ders | Taban çizgisi | Yöntemin sayısı | Fark | Ölçüt |
|---|---|---|---|---|
| Kümeleme 01 | rastgele atama 5,9790 | 3,8910 | −2,0880 | küme içi uzaklık |
| Kümeleme 02 | rastgele atama 5,9181 | 2,2570 | −3,6611 | küme içi uzaklık |
| Kümeleme 03 | rastgele atama 6,2340 | 4,5419 | −1,6922 | küme içi uzaklık |
| Kümeleme 04 | rastgele işaretleme 1,0200 | 1,7551 | +0,7351 | komşu uzaklığı |
| Kümeleme 05 | rastgele atama −4,2424 | −3,7755 | +0,4669 | uyum puanı |
| Kümeleme 06 | tek küme 0,6539 | 0,5235 | −0,1304 | uyum göstergesi |
| Boyut azaltma 01 | sütun ortalaması 3,3411 | 2,7762 | −0,5650 | geri kurma hatası |
| Boyut azaltma 02 | sütun ortalaması 3,3411 | 2,7464 | −0,5947 | geri kurma hatası |
| Boyut azaltma 03 | rastgele yerleşim 0,0390 | 0,5032 | +0,4642 | komşuluk korunma oranı |
| Boyut azaltma 04 | rastgele işaretleme 0,0488 | 0,6190 | +0,5702 | kesinlik |
| Boyut azaltma 05 | rastgele eşleşme 0,0362 | 0,1279 | +0,0917 | kuralın desteği |

İkinci sütun her derste ayrı bir yordamla üretildi: rastgele atama, tek küme, rastgele işaretleme,
sütun ortalamasıyla geri kurma, rastgele yerleşim, rastgele eşleşme. Denetimli kursta taban hazırdı
— en sık etiketi söylemek — burada her ders tabanını kendisi kurdu. **Kursun kuralı budur:
etiketsiz bir sonuç, rastgele bir sonuçtan ne kadar ayrıldığı kadar vardır; tabanı kurulmayan
kümeleme ölçülmemiş sayılır.** Üç satır dipnotsuz okunamaz: Kümeleme 06'da 0,5235 tabanının
altındadır, Kümeleme 04'ün +0,7351'i veriden değil ölçütten gelir, Boyut azaltma 03'ün 0,5032'si
altı adayın en iyisidir ve dürüst aralık 0,3940–0,5032'dir.

Kursun ikinci iddiası aynı tablodan okunur: denetimsiz sonuçta doğru cevap yoktur, **ölçüt seçimi
cevabı belirler**. Ölçüt değiştirildiğinde cevabın da değiştiği ders sayısı **on** — üç benzerlik
tanımı üç bölmeleme, üç bağlantı ölçütü aynı yükseklikte 3, 37 ve 56 küme, üç iç geçerlilik ölçütü
3, 6 ve 10 seçti; kümeleme 04'te iki ölçüt ters sıralama verdi, boyut azaltma 03'te birinin
koruduğunu öbürü attı, burada da güven ile kaldıraç iki ayrı liste çıkardı.

Yirmi bir derste — on biri etiketsiz — her yöntem özniteliklerin **verildiği** varsayımıyla
çalıştı. Ölçekleme, kodlama, üretme ve azaltma hep **elle** karar verildi ve her kararın bedeli
ayrı ayrı ölçüldü. Bu kararları da verinin kendisinden öğrenen bir yordamın neyi kazandırdığı ve
neyi görünmez kıldığı hiç sorulmadı. Sonraki kurs, Derin Öğrenme, bu soruyla açılır.
