---
title: 'Doğrusal Bağlanım'
source: 'https://academia.sh/tr/kurslar/denetimli-ogrenme/dogrusal-baglanim'
course: 'Denetimli Öğrenme'
language: tr
updated: '2026-08-17T18:10:20+00:00'
license: 'CC BY-SA 4.0'
---

# Doğrusal Bağlanım

En küçük karelerin bir açıklama aracı değil bir kestirim yordamı olarak ölçülmesi ve kursun üç sayısının kurulması: sınama kümesinde taban çizgisi 6,5324 m³ kök hata verirken doğrusal model 5,3096 verir, kazanç 1,2228 m³ ve denenen aday sayısı 1'dir. Artıkların ortalaması eğitim kümesinde bölge başına tam sıfırdır, sınama kümesinde -1,0769 ile +1,3685 arasında gezinir; artık değişkenliği kestirim büyüdükçe 3,566'dan 7,137'ye çıkar. Yedi sütunun 127 alt kümesi denendiğinde doğrulamadan seçilen alt küme sınamada 5,3157 ile tam modelin gerisine düşer, sınamadan seçilseydi 5,2931 raporlanırdı ve fark 0,0226 m³'tür.

Önceki kurs on iki derste özniteliklerin her adımını ölçtü ve kapanışında iki hesabı açık bıraktı.
Birincisi: bütün o ölçümler boyunca model hep aynı iki üç aile arasından seçildi — derinlik 6 bir
karar ağacı, bir eğim temelli doğrusal model, bir uzaklık temelli yordam — ve **ailenin kendisinin
ne kattığı** hiç sorulmadı. İkincisi: derinliğin niçin altı, komşu sayısının niçin on beş olduğu
ve bu sayıların **hangi kümeden okunması gerektiği** hiç ölçülmedi. Aynı kapanış sınama kümesine
en az yirmi dört kez bakıldığını saydı.

Bu kurs iki soruyu birlikte ele alır ve bunun için ölçüyü değiştirir. Öznitelikler **sabit
tutulur**; değişen tek şey modeldir. Her derste üç sayı yan yana durur: **taban çizgisi**,
**ailenin ayrılmış kümedeki sayısı** ve o sayıyı bulmak için **denenen aday sayısı**. Üçüncüsü
yeni ve kursun kuralıdır: **bir modelin sayısı, o sayıyı bulmak için kaç aday denendiği
yazılmadan okunamaz.** Ayar bütçesi yazılmayan sayı ölçülmemiş sayılır. Bu ders üçlüyü kurar ve
en basit aileyle, en küçük karelerle başlar.

- **DM1.** Küme M27/K01 ve K02'nin **kurgu** abone tablosudur; aynı tohumla (20260218) yeniden
  üretilir. Bölme 756 eğitim, 252 doğrulama, 252 sınama satırıdır ve kurs boyunca değişmez.
- **DM2.** Sınıflandırma derslerinde hedef kaçak ya da arıza şüphesi taşıyan abonedir ve taban
  çizgisi **en sık sınıfı söylemektir**: sınama kümesinde 0,7579.
- **DM3.** Bağlanım derslerinde hedef abonenin **üç döneme kadar uzanan okumalarının ortalama
  tüketimidir** (m³) ve taban çizgisi **eğitim kümesinin ortalamasıdır**: her aboneye aynı sayıyı
  söylemek.
- **DM4.** Bağlanım özniteliği, hedefin hesabına giren hiçbir okumadan türetilmez. Oynaklık,
  sıfır okuma ve kişi başına tüketim aynı okuma dizisinden çıktığı için **kullanılmaz**; geriye
  bölge, hane büyüklüğü, memnuniyet ve dönem sayısı kalır.
- **DM5.** Beş bölge göstergesinin toplamı her satırda bire, yani sabit terime eşittir. Biri
  (kuzey) dışarıda bırakılır ve **referans** olur.
- **DM6.** Ölçü **kök ortalama kare hatadır** (m³); ortalama mutlak hata yanına basılır. İkisinin
  ayrıştığı yer `model-degerlendirme/05`'e bırakılır.
- **DM7.** Açıklanan değişim oranı **eğitim ortalamasına göre** tanımlanır: sıfır, taban
  çizgisiyle aynı hatayı yapmaktır. Ayrılmış kümede eksi de çıkabilir.
- **DM8.** Katsayının **nedensel** yorumu bu kursun konusu değildir. İşaretin karıştırıcı bir
  değişkenle dönmesi M26'nın Keşifsel Analiz kursundaki Uygulamalı İstatistik konusunda ölçüldü;
  burada tekrarlanmaz.
- **DM9.** Sınama kümesine her derste yalnız seçim bittikten sonra bakılır ve kaç kez bakıldığı
  yazılır.

## Üç Sayı

Kurulum kümeyi üretir, böler ve iki taban çizgisini basar.

```python
# baglanim.py — MODELDIR. M27/K01'in KURGU abone tablosu ayni tohumla yeniden
# uretilir; hedef abonenin uc donemlik ortalama tuketimidir (m3).
import math

TOHUM, HAM, M32 = 20260218, 1400, 0xFFFFFFFF
BOLGE = [("kuzey", 0.28, 21, 0.00), ("guney", 0.22, 17, -0.10),
         ("dogu", 0.18, 26, 0.30), ("bati", 0.14, 14, -0.05),
         ("merkez", 0.18, 23, 0.05)]


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[1] 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({"no": 10001 + i, "bolge": b, "hane": hane, "memnuniyet": memnun})
for k in ABONE:
    r, v = uretec(TOHUM + 7000 + k["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(
            k["bolge"][2] * math.exp((r() + r() + r() - 1.5) * 0.62)
            * (1 - d * 0.05) * 100 + 0.5) / 100)
        r()
    if not v:
        continue
    ort, oyn, r = sum(v) / len(v), max(v) - min(v), uretec(TOHUM + 51000 + k["no"])
    z = (0.052 * (ort - 20) + 0.85 * (min(v) == 0.0) + 0.026 * oyn
         + 0.24 * (k["hane"] >= 5) - 0.20 * (k["memnuniyet"] >= 4) + k["bolge"][3]
         + 0.9 * (k["no"] - 10001) / 1399 + (r() + r() + r() - 1.5) * 1.30)
    x = {"no": k["no"], "bolge_ad": k["bolge"][0], "hane": k["hane"],
         "memnuniyet": k["memnuniyet"], "donem": len(v), "hedef": round(ort, 2),
         "supheli": int(z > 1.35)}
    for b in BOLGE:
        x["b_" + b[0]] = int(k["bolge"][0] == b[0])
    VERI.append(x)


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]


K = karistir(VERI, TOHUM + 90000)
EGT, DOG, SIN = K[:756], K[756:1008], K[1008:]
ORT = sum(x["hedef"] for x in EGT) / len(EGT)


def kok(kestirim, s):
    return math.sqrt(sum((kestirim(x) - x["hedef"]) ** 2 for x in s) / len(s))


def mutlak(kestirim, s):
    return sum(abs(kestirim(x) - x["hedef"]) for x in s) / len(s)


print(f"abone {len(VERI)}, egitim {len(EGT)}, dogrulama {len(DOG)}, sinama {len(SIN)}")
print(f"siniflandirma taban cizgisi (en sik sinif, sinamada) "
      f"{sum(x['supheli'] == 0 for x in SIN) / len(SIN):.4f}")
print(f"baglanim taban cizgisi (egitim ortalamasi) {ORT:.4f} m3\n")
print(f"{'kume':<12} {'kok hata':>9} {'mutlak hata':>12}")
for ad, s in (("egitim", EGT), ("dogrulama", DOG), ("sinama", SIN)):
    print(f"{ad:<12} {kok(lambda x: ORT, s):>9.4f} {mutlak(lambda x: ORT, s):>12.4f}")
```

```
abone 1260, egitim 756, dogrulama 252, sinama 252
siniflandirma taban cizgisi (en sik sinif, sinamada) 0.7579
baglanim taban cizgisi (egitim ortalamasi) 19.7665 m3

kume          kok hata  mutlak hata
egitim          6.1995       4.9017
dogrulama       6.4193       5.1148
sinama          6.5324       5.0806
```

İki taban çizgisi de öğrenmeyen yordamlardır ve ikisi de bu kurs boyunca sabit kalır.
Sınıflandırmada 0,7579 sayısı önceki iki kurstan olduğu gibi devralınır. Bağlanımda taban çizgisi
her aboneye 19,7665 m³ söyler ve sınama kümesinde 6,5324 m³ kök hata verir: kalan bütün sayıların
ölçüleceği sıfır noktası.

## En Küçük Kareler Bir Kestirim Yordamıdır

En küçük kareler, kare hata toplamını en küçük yapan katsayıları çözer. Çözüm kapalı biçimdedir:
sütunların birbiriyle çarpımlarından kurulan bir denklem takımı eleme ile çözülür.

```python
ALAN = ["b_guney", "b_dogu", "b_bati", "b_merkez", "hane", "memnuniyet", "donem"]


def coz(A, b):                              # kismi pivotlamali eleme
    n = len(b)
    for i in range(n):
        p = max(range(i, n), key=lambda k: abs(A[k][i]))
        A[i], A[p], b[i], b[p] = A[p], A[i], b[p], b[i]
        for k in range(i + 1, n):
            f = A[k][i] / A[i][i]
            for j in range(i, n):
                A[k][j] -= f * A[i][j]
            b[k] -= f * b[i]
    w = [0.0] * n
    for i in range(n - 1, -1, -1):
        w[i] = (b[i] - sum(A[i][j] * w[j] for j in range(i + 1, n))) / A[i][i]
    return w


def satir(x, alan):
    return [1.0] + [float(x[a]) for a in alan]


def en_kucuk_kare(s, alan):                 # MODELDIR: dogrusal baglanim
    X = [satir(x, alan) for x in s]
    y = [x["hedef"] for x in s]
    p = len(X[0])
    A = [[sum(X[i][a] * X[i][b] for i in range(len(X))) for b in range(p)]
         for a in range(p)]
    return coz(A, [sum(X[i][a] * y[i] for i in range(len(X))) for a in range(p)])


def kestirici(w, alan):
    return lambda x: sum(a * b for a, b in zip(w, satir(x, alan)))


def oran(kestirim, s):                      # aciklanan degisim orani
    return 1 - (sum((kestirim(x) - x["hedef"]) ** 2 for x in s)
                / sum((ORT - x["hedef"]) ** 2 for x in s))


W = en_kucuk_kare(EGT, ALAN)
f = kestirici(W, ALAN)
print(f"sabit terim {W[0]:>8.3f}   (kuzey referans)")
for i, a in enumerate(ALAN):
    print(f"{a:<12} {W[i + 1]:>8.3f}")
print(f"\n{'kume':<12} {'taban kok':>10} {'model kok':>10} {'fark':>8} "
      f"{'mutlak':>8} {'oran':>7}")
for ad, s in (("egitim", EGT), ("dogrulama", DOG), ("sinama", SIN)):
    t = kok(lambda x: ORT, s)
    print(f"{ad:<12} {t:>10.4f} {kok(f, s):>10.4f} {t - kok(f, s):>+8.4f} "
          f"{mutlak(f, s):>8.4f} {oran(f, s):>7.4f}")
print(f"\ndenenen aday sayisi 1")
```

```
sabit terim   21.820   (kuzey referans)
b_guney        -3.383
b_dogu          4.598
b_bati         -5.851
b_merkez        2.340
hane            0.062
memnuniyet     -0.148
donem          -0.550

kume          taban kok  model kok     fark   mutlak    oran
egitim           6.1995     5.0757  +1.1238   3.7461  0.3297
dogrulama        6.4193     5.3225  +1.0969   4.0005  0.3125
sinama           6.5324     5.3096  +1.2228   4.0020  0.3393

denenen aday sayisi 1
```

Üçlü tamamlandı: taban çizgisi 6,5324, ailenin sayısı 5,3096, denenen aday sayısı 1. Kazanç
1,2228 m³, yani tabanın yüzde 18,7'si. Aday sayısının bir olması bu dersin ayrıcalığıdır — sütun
kümesi baştan yazıldı, hiçbir ayar değişkeni yok, çözüm kapalı biçimde tek seferde geldi. Kursun
kalan derslerinde bu sayı bir daha bir olmayacak.

Aynı katsayı listesi iki ayrı işe koşulabilir ve ikisi aynı şey değildir. Bölge katsayıları
kurgudaki taban tüketim düzeylerinin sırasını doğru veriyor: doğu en yüksek, batı en düşük. Ama
bu dersin ölçüsü katsayının doğruluğu değil, **görülmemiş bir abonede yapılan hatadır**. Sınama
kümesindeki açıklanan değişim oranı 0,3393'tür ve tabana göre tanımlıdır: sıfır, her aboneye
eğitim ortalamasını söylemekle aynı hatayı yapmak demektir.

## Varsayımlar Sayıyla Denetlenir

Doğrusal bağlanımın varsayımları vardır: artıkların ortalaması sıfırdır, değişkenlikleri
kestirimden bağımsızdır, uçlar simetriktir. Bunlar kuram olarak değil, sayı olarak denetlenir.

```python
def artiklar(kestirim, s):
    return [kestirim(x) - x["hedef"] for x in s]


def orta(v):                                # makine hassasiyetindeki artik sifirdir
    m = sum(v) / len(v)
    return m if abs(m) > 5e-5 else 0.0


print(f"{'bolge':<9} {'egitimde ort':>13} {'sinamada n':>11} {'sinamada ort':>13}")
for b in BOLGE:
    e = [x for x in EGT if x["bolge_ad"] == b[0]]
    v = [x for x in SIN if x["bolge_ad"] == b[0]]
    print(f"{b[0]:<9} {orta(artiklar(f, e)):>+13.4f} {len(v):>11} "
          f"{orta(artiklar(f, v)):>+13.4f}")
sirali = sorted(SIN, key=f)
n = len(sirali) // 4
print(f"\n{'dilim':<7} {'kestirim ort':>13} {'artik ort':>10} {'artik degiskenlik':>19}")
for k in range(4):
    d = sirali[k * n:(k + 1) * n] if k < 3 else sirali[3 * n:]
    v = artiklar(f, d)
    m = sum(v) / len(v)
    s2 = math.sqrt(sum((q - m) ** 2 for q in v) / len(v))
    print(f"dilim {k + 1:<1} {sum(f(x) for x in d) / len(d):>13.2f} {m:>+10.3f} "
          f"{s2:>19.3f}")
v = artiklar(f, SIN)
m = sum(v) / len(v)
s2 = math.sqrt(sum((q - m) ** 2 for q in v) / len(v))
print(f"\nsinamada iki degiskenlik disina dusen artik "
      f"{sum(1 for q in v if abs(q - m) > 2 * s2)}, "
      f"eksi yonde {sum(1 for q in v if q - m < -2 * s2)}, "
      f"arti yonde {sum(1 for q in v if q - m > 2 * s2)}")
```

```
bolge      egitimde ort  sinamada n  sinamada ort
kuzey           +0.0000          68       -1.0370
guney           +0.0000          58       -0.0391
dogu            +0.0000          36       -1.0769
bati            +0.0000          32       +1.3685
merkez          +0.0000          58       +0.5708

dilim    kestirim ort  artik ort   artik degiskenlik
dilim 1         15.33     +1.192               3.566
dilim 2         18.67     -1.007               4.746
dilim 3         21.29     -0.237               4.883
dilim 4         23.85     -0.498               7.137

sinamada iki degiskenlik disina dusen artik 17, eksi yonde 11, arti yonde 6
```

İlk sütun bir denetim değil, bir kimliktir. Eğitim kümesinde her bölgenin artık ortalaması **tam
sıfırdır** ve bunun nedeni modelin iyi olması değildir: bölge göstergeleri sütun olarak modelin
içindedir ve en küçük kareler çözümü her sütunu artıklara dik yapar. Bu sayı hiçbir zaman
sıfırdan farklı çıkamaz, dolayısıyla hiçbir şey söylemez. Söyleyen sütun üçüncüsüdür: aynı
ortalamalar sınama kümesinde -1,0769 ile +1,3685 arasında geziniyor. Batı bölgesindeki otuz iki
abonede model ortalama 1,37 m³ fazla söylüyor.

İkinci tablo daha keskin bir bozulma gösteriyor. Artıkların değişkenliği kestirim büyüdükçe
3,566'dan 7,137'ye, yani iki katına çıkıyor. Model, az tüketen abonelerde çok daha isabetli, çok
tüketenlerde çok daha kaba. Eşit değişkenlik varsayımının tutmamasının sebebi kurgunun kendisinde:
tüketim çarpımsal bir dağılımdan üretiliyor, dolayısıyla büyük değerlerin saçılması da büyük. Son
satır aynı asimetriyi öteki yönden veriyor — iki değişkenlik uzağındaki on yedi artığın on biri
bir yönde, altısı öteki yönde.

Bozulan varsayımlar bir açıklama çalışmasında katsayıların oynama payını geçersiz kılardı; M26'nın
Uygulamalı İstatistik konusu bu hesabı yaptı. Kestirim hedefinde ise ölçü tektir ve zaten
alınmıştır: 5,3096. Varsayım denetimi burada sayıyı geçersiz kılmaz, **sayının nerede kötü
olduğunu** söyler.

## Ayar Bütçesi Yazılmayan Sayı Ölçülmemiş Sayılır

Bu derste tek bir aday denendi. Yedi sütunun boş olmayan bütün alt kümeleri denenirse ne olur.

```python
import itertools

en_dogrulama, en_sinama, aday = None, None, 0
for r in range(1, len(ALAN) + 1):
    for c in itertools.combinations(ALAN, r):
        aday += 1
        g = kestirici(en_kucuk_kare(EGT, list(c)), list(c))
        d, s = kok(g, DOG), kok(g, SIN)
        if en_dogrulama is None or d < en_dogrulama[0]:
            en_dogrulama = (d, s, c)
        if en_sinama is None or s < en_sinama[1]:
            en_sinama = (d, s, c)
print(f"denenen aday sayisi {aday}")
print(f"tam model            dogrulama {kok(f, DOG):.4f}  sinama {kok(f, SIN):.4f}")
print(f"dogrulamadan secilen dogrulama {en_dogrulama[0]:.4f}  "
      f"sinama {en_dogrulama[1]:.4f}  {len(en_dogrulama[2])} sutun")
print(f"sinamadan secilen    dogrulama {en_sinama[0]:.4f}  "
      f"sinama {en_sinama[1]:.4f}  {len(en_sinama[2])} sutun")
print(f"secim sinamada yapilsaydi rapor edilecek sayi {en_sinama[1]:.4f}, "
      f"durustu {en_dogrulama[1]:.4f}, fark {en_dogrulama[1] - en_sinama[1]:.4f} m3")
print(f"disarida birakilan sutun: "
      f"{[a for a in ALAN if a not in en_dogrulama[2]]}")
```

```
denenen aday sayisi 127
tam model            dogrulama 5.3225  sinama 5.3096
dogrulamadan secilen dogrulama 5.3073  sinama 5.3157  6 sutun
sinamadan secilen    dogrulama 5.4150  sinama 5.2931  6 sutun
secim sinamada yapilsaydi rapor edilecek sayi 5.2931, durustu 5.3157, fark 0.0226 m3
disarida birakilan sutun: ['memnuniyet']
```

Üç satır üç ayrı sayı veriyor ve üçü de aynı model ailesinden, aynı özniteliklerden, aynı
bölmeden çıkıyor. Aralarındaki tek fark **kaç aday denendiği** ve **seçimin hangi kümeden
okunduğudur**.

Doğrulama kümesinden okunan seçim memnuniyet sütununu atıyor ve doğrulamada 5,3073 ile tam
modelin 5,3225'ini geçiyor. Aynı seçim sınamada 5,3157 veriyor — yani **tam modelin gerisinde**.
Yüz yirmi yedi aday arasından doğrulamaya bakarak seçmek, hiç seçmemekten kötü bir sonuç üretti;
252 satırlık bir küme üzerinde 127 kez en küçüğü aramak, o kümenin kendi saçılmasını da seçer.

Son iki satır kursun kuralını sayıya çeviriyor. Seçim sınama kümesinden yapılsaydı raporlanacak
sayı 5,2931 olurdu; dürüst sayı 5,3157'dir ve fark 0,0226 m³'tür. Farkın işareti sabittir —
seçimin yapıldığı kümedeki sayı hiçbir zaman daha kötü çıkamaz. Bu yüzden 5,3096 ile 5,2931
arasındaki karşılaştırma ancak yanlarına 1 ve 127 yazıldığında anlam taşır.

## Özet

- Kursun üç sayısı kuruldu: taban çizgisi, ailenin ayrılmış kümedeki sayısı ve denenen aday
  sayısı. Sınıflandırmada taban 0,7579, bağlanımda 6,5324 m³'tür.
- En küçük kareler yedi sütunla sınama kümesinde 5,3096 m³ veriyor; kazanç 1,2228 m³ ve denenen
  aday sayısı 1'dir. Bu, kursun aday sayısı bir olan tek dersidir.
- Artık ortalaması eğitim kümesinde bölge başına tam sıfırdır ve bu bir denetim değil, en küçük
  kareler çözümünün kimliğidir; aynı ortalama sınama kümesinde -1,0769 ile +1,3685 arasında gezinir.
- Eşit değişkenlik varsayımı tutmuyor: artık değişkenliği kestirim büyüdükçe 3,566'dan 7,137'ye
  çıkıyor. Kestirim hedefinde bu, sayıyı geçersiz kılmaz; sayının nerede kötü olduğunu söyler.
- Yedi sütunun 127 alt kümesi denendiğinde doğrulamadan seçilen alt küme sınamada 5,3157 ile tam
  modelin gerisine düşüyor; sınamadan seçilseydi 5,2931 raporlanırdı ve fark 0,0226 m³'tür.

## Sonraki Adım

Bu derste model bir düzlemdi ve sütunları verildiği gibi kullanıldı. Oysa hane büyüklüğü ile
tüketim arasındaki ilişkinin bir doğru olması gerekmez; iki kişilik haneden dört kişiliğe
geçerken artan tüketim, dört kişilikten altıya geçerken aynı oranda artmayabilir. Doğrusal
olmayan bir ilişkiyi doğrusal bir modelle kurmanın yolu vardır ve sütun eklemekten ibarettir:
karesi, küpü, ikili çarpımları. Sonraki ders bu genişletmeyi dereceyle ölçer — derece 1'den 8'e
süpürülür, her derecenin eğitim ve ayrılmış küme sayıları yan yana basılır, seçim doğrulama
kümesinden okunur ve sınama kümesinden okunsaydı hangi derecenin seçileceği aynı tabloda
gösterilir.
