<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://sonsuzus.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://sonsuzus.github.io/" rel="alternate" type="text/html" /><updated>2026-08-07T10:13:25+00:00</updated><id>https://sonsuzus.github.io/feed.xml</id><title type="html">SonsuzUs</title><subtitle>Programlama ve Yazılım</subtitle><author><name>Sonsuz Us</name></author><entry><title type="html">Beyinden Koda: Perceptron ve Doğrusal Ayrılabilirlik</title><link href="https://sonsuzus.github.io/posts/beyinden-koda-perceptron-ve-dogrusal-ayrilabilirlik/" rel="alternate" type="text/html" title="Beyinden Koda: Perceptron ve Doğrusal Ayrılabilirlik" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/beyinden-koda-perceptron-ve-dogrusal-ayrilabilirlik</id><content type="html" xml:base="https://sonsuzus.github.io/posts/beyinden-koda-perceptron-ve-dogrusal-ayrilabilirlik/"><![CDATA[<p>İnsan beyni, milyarlarca nöronun elektriksel ve kimyasal sinyaller aracılığıyla haberleştiği olağanüstü bir bilgi işleme sistemidir. Yapay zekânın ilk araştırmacıları da “Bir nöronun karar verme mekanizmasını matematikle taklit edebilir miyiz?” sorusundan yola çıktı. Bu merak, modern sinir ağlarının mütevazı fakat tarihî atası olan <strong>algılayıcıyı</strong>, yani perceptronu ortaya çıkardı.
``</p>
<h2 id="biyolojik-nörondan-matematiksel-modele">Biyolojik nörondan matematiksel modele</h2>

<p>Biyolojik bir nöron; sinyalleri <strong>dendritleriyle</strong> alır, hücre gövdesinde bir araya getirir ve yeterli uyarılma oluşursa akson üzerinden başka hücrelere iletir. Bu süreç birebir kopyalanmasa da temel fikir matematiksel bir modele dönüştürülebilir.</p>

<table>
  <thead>
    <tr>
      <th>Biyolojik yapı</th>
      <th>Perceptrondaki karşılığı</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Dendrit</td>
      <td>Girdi $x_i$</td>
      <td>Dışarıdan bilgi alır</td>
    </tr>
    <tr>
      <td>Sinaps</td>
      <td>Ağırlık $w_i$</td>
      <td>Sinyalin önemini belirler</td>
    </tr>
    <tr>
      <td>Hücre gövdesi</td>
      <td>Ağırlıklı toplam</td>
      <td>Girdileri birleştirir</td>
    </tr>
    <tr>
      <td>Ateşleme eşiği</td>
      <td>Aktivasyon fonksiyonu</td>
      <td>Çıkış kararını üretir</td>
    </tr>
    <tr>
      <td>Akson</td>
      <td>Tahmin $y$</td>
      <td>Sonucu sonraki birime taşır</td>
    </tr>
  </tbody>
</table>

<p>1943 yılında Warren McCulloch ve Walter Pitts, nöron davranışını mantıksal işlemlerle açıklayan ilk matematiksel modellerden birini geliştirdi. Frank Rosenblatt ise 1957’de bu fikri öğrenebilen bir yapıya dönüştürerek perceptronu tanıttı.</p>

<h2 id="perceptron-nasıl-karar-verir">Perceptron nasıl karar verir?</h2>

<p>Perceptron, her girdiyi ilgili ağırlıkla çarpar, sonuçları toplar ve <strong>bias</strong> adı verilen ek değeri ekler:</p>

\[z = w_1x_1 + w_2x_2 + \cdots + w_nx_n + b\]

<p>Ardından basamak aktivasyon fonksiyonu uygulanır:</p>

\[y = \begin{cases} 1, &amp; z \geq 0 \\ 0, &amp; z &lt; 0 \end{cases}\]

<p>Ağırlıklar girdilerin önemini, bias ise karar sınırının konumunu kontrol eder. Modelin yaptığı şey aslında şudur: “Toplam kanıt yeterince güçlüyse 1, değilse 0 de.” Bir e-postanın spam olup olmadığını düşünürsek “ücretsiz”, “ödül” ve “hemen tıkla” gibi özellikler girdileri temsil edebilir.</p>

<h2 id="öğrenme-süreci">Öğrenme süreci</h2>

<p>Perceptron başlangıçta doğru ağırlıkları bilmez. Her örnek için tahmin üretir ve hata yaptığında ağırlıklarını günceller:</p>

\[w_i \leftarrow w_i + \eta(t-y)x_i\]

\[b \leftarrow b + \eta(t-y)\]

<p>Burada $t$ gerçek etiket, $y$ tahmin ve $\eta$ öğrenme oranıdır. Öğrenme oranı, düzeltme adımlarının ne kadar büyük olacağını belirler. Model doğru tahmin yaptığında $t-y=0$ olur ve ağırlıklar değişmez.</p>

<p>Aşağıdaki Python kodu, AND mantık kapısını öğrenen basit bir perceptron kurar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">X</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">0</span><span class="p">],</span> <span class="p">[</span><span class="mi">1</span><span class="p">,</span> <span class="mi">1</span><span class="p">]])</span>
<span class="n">t</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">1</span><span class="p">])</span>

<span class="n">w</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
<span class="n">b</span> <span class="o">=</span> <span class="mf">0.0</span>
<span class="n">learning_rate</span> <span class="o">=</span> <span class="mf">0.1</span>

<span class="k">for</span> <span class="n">epoch</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">10</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">target</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">X</span><span class="p">,</span> <span class="n">t</span><span class="p">):</span>
        <span class="n">z</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">dot</span><span class="p">(</span><span class="n">w</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="n">b</span>
        <span class="n">prediction</span> <span class="o">=</span> <span class="mi">1</span> <span class="k">if</span> <span class="n">z</span> <span class="o">&gt;=</span> <span class="mi">0</span> <span class="k">else</span> <span class="mi">0</span>
        <span class="n">error</span> <span class="o">=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">prediction</span>

        <span class="n">w</span> <span class="o">+=</span> <span class="n">learning_rate</span> <span class="o">*</span> <span class="n">error</span> <span class="o">*</span> <span class="n">x</span>
        <span class="n">b</span> <span class="o">+=</span> <span class="n">learning_rate</span> <span class="o">*</span> <span class="n">error</span>

<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Ağırlıklar:</span><span class="sh">"</span><span class="p">,</span> <span class="n">w</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Bias:</span><span class="sh">"</span><span class="p">,</span> <span class="n">b</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, her eğitim örneğinde tahmin ile gerçek değer arasındaki farkı hesaplar. Hata varsa ağırlıklar ve bias, doğru sınıfa yaklaşacak yönde değiştirilir.</p>

<h2 id="doğrusal-ayrılabilirlik-meselesi">Doğrusal ayrılabilirlik meselesi</h2>

<p>Perceptronun karar sınırı iki boyutta bir doğru, üç boyutta bir düzlem ve daha yüksek boyutlarda bir <strong>hiperdüzlemdir</strong>:</p>

\[w_1x_1 + w_2x_2 + b = 0\]

<p>Sınıflar tek bir doğruyla birbirinden ayrılabiliyorsa veri <strong>doğrusal ayrılabilir</strong> kabul edilir.</p>

<table>
  <thead>
    <tr>
      <th>Mantık kapısı</th>
      <th style="text-align: right">Doğrusal ayrılabilir mi?</th>
      <th style="text-align: right">Tek perceptron öğrenebilir mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>AND</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
    <tr>
      <td>OR</td>
      <td style="text-align: right">Evet</td>
      <td style="text-align: right">Evet</td>
    </tr>
    <tr>
      <td>XOR</td>
      <td style="text-align: right">Hayır</td>
      <td style="text-align: right">Hayır</td>
    </tr>
  </tbody>
</table>

<p>XOR probleminde aynı sınıfa ait noktalar çapraz köşelerde bulunur; bu nedenle tek bir doğru yeterli olmaz. Bu sınırlama, yapay zekâ tarihinde büyük bir hayal kırıklığı yaratmış olsa da çözüm yeni bir kapı açtı: Birden fazla perceptronu katmanlar hâlinde birleştirmek. Gizli katmanlar ve doğrusal olmayan aktivasyonlar sayesinde çok katmanlı sinir ağları karmaşık karar sınırları öğrenebilir.</p>

<p>Kısacası perceptron küçük bir matematiksel hücredir; ancak ağırlık, bias, öğrenme ve karar sınırı gibi bugün hâlâ kullandığımız temel kavramları taşır. Modern derin öğrenme sistemleri çok daha gelişmiş olsa da onların aile albümündeki ilk ciddi fotoğraflardan biri kesinlikle perceptrondur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay zeka" /><category term="perceptron" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[İnsan beyni, milyarlarca nöronun elektriksel ve kimyasal sinyaller aracılığıyla haberleştiği olağanüstü bir bilgi işleme sistemidir. Yapay zekânın ilk araştırmacıları da “Bir nöronun karar verme mekanizmasını matematikle taklit edebilir miyiz?” sorusundan yola çıktı. Bu merak, modern sinir ağlarının mütevazı fakat tarihî atası olan algılayıcıyı, yani perceptronu ortaya çıkardı.]]></summary></entry><entry><title type="html">Biyometrik Örüntü Tanıma: Parmak İzi ve İris Eşleştirme Sistemi</title><link href="https://sonsuzus.github.io/posts/biyometrik-oruntu-tanima-parmak-izi-ve-iris-eslestirme-sistemi/" rel="alternate" type="text/html" title="Biyometrik Örüntü Tanıma: Parmak İzi ve İris Eşleştirme Sistemi" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/biyometrik-oruntu-tanima-parmak-izi-ve-iris-eslestirme-sistemi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/biyometrik-oruntu-tanima-parmak-izi-ve-iris-eslestirme-sistemi/"><![CDATA[<p>Telefonun kilidini parmağınla açarken cihazın içinde minik bir dedektif çalışır: Görüntüyü temizler, ayırt edici özellikleri çıkarır ve bunları kayıtlı şablonla karşılaştırır. Bu projede gerçek kişisel veriler toplamadan, parmak izi veya iris verisini temsil eden yapay özellik vektörleriyle temel bir biyometrik eşleştirme sisteminin mantığını inceleyeceğiz.</p>

<p>``</p>

<h2 id="biyometrik-eşleştirme-nasıl-çalışır">Biyometrik eşleştirme nasıl çalışır?</h2>

<p>Bir biyometrik sistem ham görüntüleri doğrudan karşılaştırmak yerine genellikle <strong>şablon</strong> adı verilen sayısal temsiller üretir. Parmak izinde çizgi sonları ve çatallanmalar; iriste ise doku frekansları, halkalar ve yerel desenler özellik olarak kullanılabilir.</p>

<p>Tipik işlem hattı şöyledir:</p>

<ol>
  <li>Sensörden görüntü alınır.</li>
  <li>Gürültü azaltılır ve görüntü normalize edilir.</li>
  <li>İlgi bölgesi belirlenir.</li>
  <li>Ayırt edici özellikler çıkarılır.</li>
  <li>Özellik vektörü kayıtlı şablonla karşılaştırılır.</li>
  <li>Benzerlik belirlenen eşiği geçiyorsa eşleşme kabul edilir.</li>
</ol>

<table>
  <thead>
    <tr>
      <th>Aşama</th>
      <th>Parmak izi örneği</th>
      <th>İris örneği</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Ön işleme</td>
      <td>Çizgileri belirginleştirme</td>
      <td>Göz bebeğini ayırma</td>
    </tr>
    <tr>
      <td>Özellik</td>
      <td>Minutiae noktaları</td>
      <td>Doku kodları</td>
    </tr>
    <tr>
      <td>Sorun</td>
      <td>Parmağın kayması</td>
      <td>Göz kapağı ve yansıma</td>
    </tr>
    <tr>
      <td>Temsil</td>
      <td>Nokta ve yön listesi</td>
      <td>İkili veya sayısal vektör</td>
    </tr>
  </tbody>
</table>

<h2 id="benzerliği-matematikle-ölçmek">Benzerliği matematikle ölçmek</h2>

<p>İki özellik vektörü arasındaki uzaklık için Öklid uzaklığı kullanılabilir. Kayıtlı şablon $x$, yeni örnek $y$ ise:</p>

\[d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}\]

<p>Uzaklık küçüldükçe örnekler birbirine daha çok benzer. Benzerlik puanını $[0,1]$ aralığına taşımak için basitçe şu dönüşüm uygulanabilir:</p>

\[s(x,y)=\frac{1}{1+d(x,y)}\]

<p>Karar kuralımız $s \geq t$ olabilir. Buradaki $t$ eşik değeridir. Eşiği yükseltmek güvenliği artırabilir ancak gerçek kullanıcıların reddedilmesine de yol açabilir.</p>

<table>
  <thead>
    <tr>
      <th>Eşik tercihi</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Düşük</td>
      <td>Kullanım daha rahat</td>
      <td>Yanlış kabul artabilir</td>
    </tr>
    <tr>
      <td>Yüksek</td>
      <td>Yetkisiz kabul azalabilir</td>
      <td>Yanlış ret artabilir</td>
    </tr>
    <tr>
      <td>Dengeli</td>
      <td>İki hata türünü dengeler</td>
      <td>Test verisi gerektirir</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-basit-prototip">Python ile basit prototip</h2>

<p>Aşağıdaki kod gerçek görüntüler yerine sentetik biyometrik vektörler kullanır. Böylece kişisel veri toplamadan eşleştirme mekanizmasını deneyebiliriz.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">class</span> <span class="nc">BiometricMatcher</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">threshold</span><span class="o">=</span><span class="mf">0.80</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">threshold</span> <span class="o">=</span> <span class="n">threshold</span>
        <span class="n">self</span><span class="p">.</span><span class="n">templates</span> <span class="o">=</span> <span class="p">{}</span>

    <span class="k">def</span> <span class="nf">enroll</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">features</span><span class="p">):</span>
        <span class="n">vector</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">features</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
        <span class="n">norm</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">vector</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">norm</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sh">"</span><span class="s">Sıfır vektörü kaydedilemez.</span><span class="sh">"</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">templates</span><span class="p">[</span><span class="n">user_id</span><span class="p">]</span> <span class="o">=</span> <span class="n">vector</span> <span class="o">/</span> <span class="n">norm</span>

    <span class="k">def</span> <span class="nf">verify</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">user_id</span><span class="p">,</span> <span class="n">sample</span><span class="p">):</span>
        <span class="k">if</span> <span class="n">user_id</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">self</span><span class="p">.</span><span class="n">templates</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span><span class="p">,</span> <span class="mf">0.0</span>

        <span class="n">sample</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">asarray</span><span class="p">(</span><span class="n">sample</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">float</span><span class="p">)</span>
        <span class="n">norm</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">sample</span><span class="p">)</span>
        <span class="k">if</span> <span class="n">norm</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="k">return</span> <span class="bp">False</span><span class="p">,</span> <span class="mf">0.0</span>

        <span class="n">sample</span> <span class="o">=</span> <span class="n">sample</span> <span class="o">/</span> <span class="n">norm</span>
        <span class="n">template</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">templates</span><span class="p">[</span><span class="n">user_id</span><span class="p">]</span>
        <span class="n">distance</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="n">linalg</span><span class="p">.</span><span class="nf">norm</span><span class="p">(</span><span class="n">template</span> <span class="o">-</span> <span class="n">sample</span><span class="p">)</span>
        <span class="n">score</span> <span class="o">=</span> <span class="mi">1</span> <span class="o">/</span> <span class="p">(</span><span class="mi">1</span> <span class="o">+</span> <span class="n">distance</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">score</span> <span class="o">&gt;=</span> <span class="n">self</span><span class="p">.</span><span class="n">threshold</span><span class="p">,</span> <span class="n">score</span>

<span class="n">matcher</span> <span class="o">=</span> <span class="nc">BiometricMatcher</span><span class="p">(</span><span class="n">threshold</span><span class="o">=</span><span class="mf">0.80</span><span class="p">)</span>
<span class="n">matcher</span><span class="p">.</span><span class="nf">enroll</span><span class="p">(</span><span class="sh">"</span><span class="s">kullanici_42</span><span class="sh">"</span><span class="p">,</span> <span class="p">[</span><span class="mf">0.12</span><span class="p">,</span> <span class="mf">0.77</span><span class="p">,</span> <span class="mf">0.31</span><span class="p">,</span> <span class="mf">0.55</span><span class="p">,</span> <span class="mf">0.18</span><span class="p">])</span>

<span class="n">accepted</span><span class="p">,</span> <span class="n">score</span> <span class="o">=</span> <span class="n">matcher</span><span class="p">.</span><span class="nf">verify</span><span class="p">(</span>
    <span class="sh">"</span><span class="s">kullanici_42</span><span class="sh">"</span><span class="p">,</span>
    <span class="p">[</span><span class="mf">0.11</span><span class="p">,</span> <span class="mf">0.75</span><span class="p">,</span> <span class="mf">0.34</span><span class="p">,</span> <span class="mf">0.53</span><span class="p">,</span> <span class="mf">0.20</span><span class="p">]</span>
<span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Kabul: </span><span class="si">{</span><span class="n">accepted</span><span class="si">}</span><span class="s">, skor: </span><span class="si">{</span><span class="n">score</span><span class="si">:</span><span class="p">.</span><span class="mi">3</span><span class="n">f</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">enroll</code> metodu özellik vektörünü normalize ederek saklar. <code class="language-plaintext highlighter-rouge">verify</code> ise yeni örnekle kayıtlı şablonun uzaklığını hesaplar. Normalizasyon, ölçüm ölçeğindeki farklılıkların etkisini azaltır; fakat gerçek sistemlerde dönüş, konum ve sensör kalitesi için çok daha gelişmiş işlemler gerekir.</p>

<h2 id="başarıyı-nasıl-değerlendirebiliriz">Başarıyı nasıl değerlendirebiliriz?</h2>

<p>Sistemi yalnızca “çalıştı” diyerek değerlendirmek yeterli değildir. <strong>FAR</strong> yetkisiz örneklerin kabul oranını, <strong>FRR</strong> ise gerçek kullanıcıların reddedilme oranını gösterir:</p>

\[FAR=\frac{yanlış\ kabuller}{yetkisiz\ denemeler}\]

\[FRR=\frac{yanlış\ retler}{gerçek\ kullanıcı\ denemeleri}\]

<p>Eşiği farklı değerlerde deneyerek bu iki metriği karşılaştırabiliriz. Ayrıca farklı sensör koşulları, gürültü seviyeleri ve kullanıcı gruplarıyla test yapmak olası yanlılıkları ortaya çıkarır.</p>

<p>Son olarak biyometrik veri parola gibi kolayca değiştirilemez. Bu nedenle ham görüntü saklamak yerine şifrelenmiş veya iptal edilebilir şablonlar kullanılmalı; açık rıza, veri minimizasyonu, erişim kontrolü ve silme politikaları tasarımın merkezinde olmalıdır. Küçük dedektifimiz zeki olabilir, ama aynı zamanda mahremiyete saygılı olmak zorundadır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="biyometri" /><category term="örüntü tanıma" /><category term="Python" /><summary type="html"><![CDATA[Telefonun kilidini parmağınla açarken cihazın içinde minik bir dedektif çalışır: Görüntüyü temizler, ayırt edici özellikleri çıkarır ve bunları kayıtlı şablonla karşılaştırır. Bu projede gerçek kişisel veriler toplamadan, parmak izi veya iris verisini temsil eden yapay özellik vektörleriyle temel bir biyometrik eşleştirme sisteminin mantığını inceleyeceğiz.]]></summary></entry><entry><title type="html">Çok Katmanlı Algılayıcılar: MLP’de Katmanlar ve İleri Besleme Mantığı</title><link href="https://sonsuzus.github.io/posts/cok-katmanli-algilayicilar-mlpde-katmanlar-ve-ileri-besleme-mantigi/" rel="alternate" type="text/html" title="Çok Katmanlı Algılayıcılar: MLP’de Katmanlar ve İleri Besleme Mantığı" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/cok-katmanli-algilayicilar-mlpde-katmanlar-ve-ileri-besleme-mantigi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/cok-katmanli-algilayicilar-mlpde-katmanlar-ve-ileri-besleme-mantigi/"><![CDATA[<p>Bir yapay sinir ağının fotoğraftaki rakamı tanıması, müşterinin alışveriş davranışını tahmin etmesi veya bir evin fiyatını hesaplaması ilk bakışta sihir gibi görünebilir. Oysa Çok Katmanlı Algılayıcıların, yani MLP’lerin arkasında düzenli bir matematiksel veri akışı vardır: Bilgiler girişten alınır, katmanlar boyunca dönüştürülür ve anlamlı bir çıktıya çevrilir.</p>

<p>``</p>

<h2 id="mlp-nedir">MLP nedir?</h2>

<p><strong>Multi-Layer Perceptron (MLP)</strong>, birbirine bağlı yapay nöronlardan oluşan ileri beslemeli bir sinir ağıdır. “İleri beslemeli” denmesinin nedeni, verinin girişten çıkışa doğru tek yönde ilerlemesidir. Döngü veya geçmiş durumu saklayan bir bağlantı bulunmaz.</p>

<p>Bir MLP genellikle üç bölümden oluşur:</p>

<table>
  <thead>
    <tr>
      <th>Katman</th>
      <th>Görevi</th>
      <th>Örnek</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Girdi katmanı</td>
      <td>Ham özellikleri kabul eder</td>
      <td>Yaş, gelir, ürün fiyatı</td>
    </tr>
    <tr>
      <td>Gizli katmanlar</td>
      <td>Özellikleri dönüştürür ve örüntüleri öğrenir</td>
      <td>Fiyat-gelir ilişkisini keşfetmek</td>
    </tr>
    <tr>
      <td>Çıktı katmanı</td>
      <td>Tahmin veya sınıf üretir</td>
      <td>“Satın alır” olasılığı</td>
    </tr>
  </tbody>
</table>

<p>Girdi katmanında hesaplama genellikle yapılmaz; değerler yalnızca ilk gizli katmana aktarılır. Asıl öğrenme, ağırlık ve sapma değerlerini kullanan gizli katmanlarda gerçekleşir.</p>

<h2 id="bir-nöron-nasıl-çalışır">Bir nöron nasıl çalışır?</h2>

<p>Bir nöron, kendisine ulaşan değerleri ağırlıklandırır ve toplar. Katman $l$ için bu işlem şöyle gösterilebilir:</p>

\[z^{(l)} = W^{(l)}a^{(l-1)} + b^{(l)}\]

<p>Burada $W$ ağırlık matrisini, $a$ önceki katmanın çıktısını, $b$ ise sapma değerini temsil eder. Elde edilen $z$ değeri doğrudan sonraki katmana gönderilmez; önce bir aktivasyon fonksiyonundan geçirilir:</p>

\[a^{(l)} = f(z^{(l)})\]

<p>Bu küçük görünen $f$ fonksiyonu son derece önemlidir. Aktivasyon kullanılmazsa, art arda eklenen katmanlar matematiksel olarak tek bir doğrusal dönüşüme indirgenir. Başka bir ifadeyle ağ çok katlı görünür, ancak tek katlı bir hesap makinesi gibi davranır.</p>

<h2 id="doğrusal-olmayanlığın-süper-gücü">Doğrusal olmayanlığın süper gücü</h2>

<p>Aktivasyon fonksiyonları MLP’nin eğri karar sınırları ve karmaşık ilişkiler öğrenmesini sağlar.</p>

<table>
  <thead>
    <tr>
      <th>Aktivasyon</th>
      <th>Özellik</th>
      <th>Yaygın kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>ReLU</td>
      <td>$f(x)=max(0,x)$, hızlı ve basit</td>
      <td>Gizli katmanlar</td>
    </tr>
    <tr>
      <td>Sigmoid</td>
      <td>Değeri 0 ile 1 arasına sıkıştırır</td>
      <td>İkili sınıflandırma çıktısı</td>
    </tr>
    <tr>
      <td>Tanh</td>
      <td>Değeri -1 ile 1 arasına taşır</td>
      <td>Bazı gizli katmanlar</td>
    </tr>
    <tr>
      <td>Softmax</td>
      <td>Sınıflar için olasılık dağılımı üretir</td>
      <td>Çok sınıflı çıktı</td>
    </tr>
  </tbody>
</table>

<p>Örneğin XOR problemi tek bir doğrusal çizgiyle ayrılamaz. Gizli katmana ve doğrusal olmayan aktivasyona sahip bir MLP ise girdileri yeni bir temsil uzayına taşıyarak bu problemi çözebilir. Gizli katmanların “temsil öğrenmesi” denilen yeteneği tam olarak budur.</p>

<h2 id="i̇leri-besleme-adım-adım">İleri besleme adım adım</h2>

<p>İleri besleme sırasında eğitim yapılmaz; mevcut ağırlıklarla tahmin hesaplanır. Veri her katmanda şu yolculuğu gerçekleştirir:</p>

<ol>
  <li>Özellik vektörü giriş katmanına verilir.</li>
  <li>Girdiler ağırlıklarla çarpılıp sapmalarla toplanır.</li>
  <li>Sonuç aktivasyon fonksiyonundan geçirilir.</li>
  <li>Üretilen değerler sonraki katmanın girdisi olur.</li>
  <li>Çıktı katmanı nihai tahmini üretir.</li>
</ol>

<p>Aşağıdaki NumPy örneği, tek gizli katmanlı bir ağın ileri beslemesini gerçekleştirir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="k">def</span> <span class="nf">relu</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">np</span><span class="p">.</span><span class="nf">maximum</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">x</span><span class="p">)</span>

<span class="n">x</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.8</span><span class="p">,</span> <span class="mf">0.2</span><span class="p">])</span>

<span class="n">W1</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.5</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.3</span><span class="p">],</span>
               <span class="p">[</span><span class="mf">0.7</span><span class="p">,</span>  <span class="mf">0.4</span><span class="p">],</span>
               <span class="p">[</span><span class="o">-</span><span class="mf">0.2</span><span class="p">,</span> <span class="mf">0.9</span><span class="p">]])</span>
<span class="n">b1</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.1</span><span class="p">,</span> <span class="mf">0.0</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.1</span><span class="p">])</span>

<span class="n">W2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([[</span><span class="mf">0.6</span><span class="p">,</span> <span class="o">-</span><span class="mf">0.5</span><span class="p">,</span> <span class="mf">0.8</span><span class="p">]])</span>
<span class="n">b2</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([</span><span class="mf">0.2</span><span class="p">])</span>

<span class="n">hidden</span> <span class="o">=</span> <span class="nf">relu</span><span class="p">(</span><span class="n">W1</span> <span class="o">@</span> <span class="n">x</span> <span class="o">+</span> <span class="n">b1</span><span class="p">)</span>
<span class="n">output</span> <span class="o">=</span> <span class="n">W2</span> <span class="o">@</span> <span class="n">hidden</span> <span class="o">+</span> <span class="n">b2</span>

<span class="nf">print</span><span class="p">(</span><span class="n">output</span><span class="p">)</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">W1 @ x</code> girişleri gizli nöronlarla birleştirir, <code class="language-plaintext highlighter-rouge">relu</code> doğrusal olmayan dönüşümü uygular ve <code class="language-plaintext highlighter-rouge">W2 @ hidden</code> gizli temsilden sonucu hesaplar. Gerçek bir eğitim sürecinde çıktı ile hedef arasındaki hata ölçülür; geri yayılım da ağırlıkları günceller.</p>

<p>MLP’ler tablo verileri, sınıflandırma ve regresyon problemleri için güçlü bir başlangıç noktasıdır. Ancak katman veya nöron sayısını rastgele artırmak başarı garantisi değildir. Uygun veri ölçekleme, aktivasyon seçimi ve aşırı öğrenmeye karşı düzenlileştirme gerekir. Kısacası MLP, bilgiyi katman katman işleyen matematiksel bir montaj hattıdır; ileri besleme ise bu hattın girişten tahmine uzanan tek yönlü üretim turudur.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="yapay sinir ağları" /><category term="MLP" /><category term="derin öğrenme" /><summary type="html"><![CDATA[Bir yapay sinir ağının fotoğraftaki rakamı tanıması, müşterinin alışveriş davranışını tahmin etmesi veya bir evin fiyatını hesaplaması ilk bakışta sihir gibi görünebilir. Oysa Çok Katmanlı Algılayıcıların, yani MLP’lerin arkasında düzenli bir matematiksel veri akışı vardır: Bilgiler girişten alınır, katmanlar boyunca dönüştürülür ve anlamlı bir çıktıya çevrilir.]]></summary></entry><entry><title type="html">Denetimli Öğrenme Arenası: k-NN, Karar Ağaçları ve SVM</title><link href="https://sonsuzus.github.io/posts/denetimli-ogrenme-arenasi-k-nn-karar-agaclari-ve-svm/" rel="alternate" type="text/html" title="Denetimli Öğrenme Arenası: k-NN, Karar Ağaçları ve SVM" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/denetimli-ogrenme-arenasi-k-nn-karar-agaclari-ve-svm</id><content type="html" xml:base="https://sonsuzus.github.io/posts/denetimli-ogrenme-arenasi-k-nn-karar-agaclari-ve-svm/"><![CDATA[<p>Bir e-postanın spam olup olmadığını, bir müşterinin aboneliğini iptal edip etmeyeceğini veya bir tümörün iyi huylu olup olmadığını tahmin etmek istediğimizi düşünelim. Geçmiş örneklerin doğru cevapları elimizdeyse denetimli öğrenmenin kapısından içeri gireriz. Bu yaklaşımda algoritma, etiketlenmiş verilerden örüntüler öğrenerek daha önce görmediği örnekler hakkında karar verir.</p>

<p>``</p>

<h2 id="denetimli-öğrenmenin-temel-mantığı">Denetimli öğrenmenin temel mantığı</h2>

<p>Bir veri kümesindeki her örnek, özellikler ve hedef etiketten oluşur. Özellik vektörünü $x$, etiketi $y$ ile gösterirsek eğitim kümesi şu biçimdedir:</p>

\[D = \{(x_1,y_1),(x_2,y_2),\ldots,(x_n,y_n)\}\]

<p>Amaç, gerçek ilişkiyi mümkün olduğunca iyi temsil eden $f(x)$ fonksiyonunu öğrenmektir. Sınıflandırmada çıktı ayrık bir sınıftır: spam veya normal, hasta veya sağlıklı gibi. Regresyonda ise ev fiyatı gibi sürekli bir değer tahmin edilir.</p>

<p>Modelin yalnızca eğitim örneklerini ezberlemesi yeterli değildir. Asıl başarı, görülmemiş veriler üzerinde doğru tahmin yapabilmesidir. Eğitim başarısı yüksek fakat test başarısı düşükse <strong>aşırı öğrenme</strong>, model iki tarafta da zayıfsa <strong>yetersiz öğrenme</strong> gündemdedir.</p>

<table>
  <thead>
    <tr>
      <th>Algoritma</th>
      <th>Temel fikir</th>
      <th>Güçlü yönü</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>k-NN</td>
      <td>En yakın komşular oy verir</td>
      <td>Basit ve sezgiseldir</td>
      <td>Ölçeklendirmeye duyarlıdır</td>
    </tr>
    <tr>
      <td>Karar Ağacı</td>
      <td>Sorularla veriyi dallara ayırır</td>
      <td>Kolay açıklanabilir</td>
      <td>Aşırı öğrenebilir</td>
    </tr>
    <tr>
      <td>SVM</td>
      <td>Sınıflar arasındaki marjı büyütür</td>
      <td>Karmaşık sınırlarda etkilidir</td>
      <td>Parametre seçimi önemlidir</td>
    </tr>
  </tbody>
</table>

<h2 id="k-en-yakın-komşu-mahalle-ne-diyorsa-o">k-En Yakın Komşu: Mahalle ne diyorsa o</h2>

<p>k-NN, yeni bir örneğin eğitim kümesindeki en yakın $k$ komşusunu bulur ve çoğunluğun etiketini seçer. Öklid uzaklığı yaygın bir ölçüdür:</p>

\[d(x,z)=\sqrt{\sum_{j=1}^{m}(x_j-z_j)^2}\]

<p>$k=1$ seçimi gürültüye karşı hassas olabilir; çok büyük $k$ ise farklı sınıfları birbirine karıştırabilir. Ayrıca yaş ile gelir gibi farklı ölçeklerdeki özellikler kullanılacaksa standartlaştırma yapılmalıdır. Aksi hâlde büyük sayılara sahip özellik, mesafe hesabının megafonunu ele geçirir.</p>

<h2 id="karar-ağaçları-evet-mi-hayır-mı">Karar Ağaçları: Evet mi, hayır mı?</h2>

<p>Karar ağacı, veriyi art arda sorularla böler. Örneğin “Gelir 40.000’den yüksek mi?” sorusu iki dal oluşturabilir. En faydalı bölünmeyi belirlemek için Gini safsızlığı kullanılabilir:</p>

\[Gini = 1-\sum_{i=1}^{C}p_i^2\]

<p>Saf bir düğümde örneklerin tamamı aynı sınıftadır. Ağacın kontrolsüz büyümesi ezberlemeye yol açabileceğinden <code class="language-plaintext highlighter-rouge">max_depth</code> ve <code class="language-plaintext highlighter-rouge">min_samples_split</code> gibi sınırlar önemlidir.</p>

<h2 id="destek-vektör-makineleri-en-geniş-güvenlik-koridoru">Destek Vektör Makineleri: En geniş güvenlik koridoru</h2>

<p>SVM, sınıfları ayıran bir hiper düzlem bulur ve bu düzlemle en yakın örnekler arasındaki marjı en büyük yapmaya çalışır. Kararı belirleyen kritik örneklere <strong>destek vektörleri</strong> denir. Doğrusal ayrım mümkün değilse RBF gibi çekirdekler, veriyi açıkça dönüştürmeden daha karmaşık karar sınırları kurabilir. <code class="language-plaintext highlighter-rouge">C</code> parametresi hatalara verilen cezayı, <code class="language-plaintext highlighter-rouge">gamma</code> ise tek bir örneğin etki alanını kontrol eder.</p>

<h2 id="python-ile-üç-modeli-karşılaştırmak">Python ile üç modeli karşılaştırmak</h2>

<p>Aşağıdaki kod, özellikleri standartlaştırır ve modelleri aynı test kümesinde değerlendirir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.datasets</span> <span class="kn">import</span> <span class="n">load_breast_cancer</span>
<span class="kn">from</span> <span class="n">sklearn.model_selection</span> <span class="kn">import</span> <span class="n">train_test_split</span>
<span class="kn">from</span> <span class="n">sklearn.preprocessing</span> <span class="kn">import</span> <span class="n">StandardScaler</span>
<span class="kn">from</span> <span class="n">sklearn.pipeline</span> <span class="kn">import</span> <span class="n">make_pipeline</span>
<span class="kn">from</span> <span class="n">sklearn.neighbors</span> <span class="kn">import</span> <span class="n">KNeighborsClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.tree</span> <span class="kn">import</span> <span class="n">DecisionTreeClassifier</span>
<span class="kn">from</span> <span class="n">sklearn.svm</span> <span class="kn">import</span> <span class="n">SVC</span>

<span class="n">X</span><span class="p">,</span> <span class="n">y</span> <span class="o">=</span> <span class="nf">load_breast_cancer</span><span class="p">(</span><span class="n">return_X_y</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
<span class="n">X_train</span><span class="p">,</span> <span class="n">X_test</span><span class="p">,</span> <span class="n">y_train</span><span class="p">,</span> <span class="n">y_test</span> <span class="o">=</span> <span class="nf">train_test_split</span><span class="p">(</span>
    <span class="n">X</span><span class="p">,</span> <span class="n">y</span><span class="p">,</span> <span class="n">test_size</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span> <span class="n">stratify</span><span class="o">=</span><span class="n">y</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span>
<span class="p">)</span>

<span class="n">models</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">k-NN</span><span class="sh">"</span><span class="p">:</span> <span class="nf">make_pipeline</span><span class="p">(</span><span class="nc">StandardScaler</span><span class="p">(),</span> <span class="nc">KNeighborsClassifier</span><span class="p">(</span><span class="n">n_neighbors</span><span class="o">=</span><span class="mi">5</span><span class="p">)),</span>
    <span class="sh">"</span><span class="s">Karar Ağacı</span><span class="sh">"</span><span class="p">:</span> <span class="nc">DecisionTreeClassifier</span><span class="p">(</span><span class="n">max_depth</span><span class="o">=</span><span class="mi">4</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">),</span>
    <span class="sh">"</span><span class="s">SVM</span><span class="sh">"</span><span class="p">:</span> <span class="nf">make_pipeline</span><span class="p">(</span><span class="nc">StandardScaler</span><span class="p">(),</span> <span class="nc">SVC</span><span class="p">(</span><span class="n">kernel</span><span class="o">=</span><span class="sh">"</span><span class="s">rbf</span><span class="sh">"</span><span class="p">))</span>
<span class="p">}</span>

<span class="k">for</span> <span class="n">name</span><span class="p">,</span> <span class="n">model</span> <span class="ow">in</span> <span class="n">models</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
    <span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">name</span><span class="p">,</span> <span class="n">model</span><span class="p">.</span><span class="nf">score</span><span class="p">(</span><span class="n">X_test</span><span class="p">,</span> <span class="n">y_test</span><span class="p">))</span>
</code></pre></div></div>

<p>Doğruluk tek başına her zaman yeterli değildir. Dengesiz sınıflarda kesinlik, duyarlılık, F1 skoru ve karmaşıklık matrisi de incelenmelidir. Sonuçta en iyi algoritma diye evrensel bir şampiyon yoktur; veri yapısına, açıklanabilirlik ihtiyacına ve hata maliyetine en uygun yarışmacı vardır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="sınıflandırma" /><category term="python" /><summary type="html"><![CDATA[Bir e-postanın spam olup olmadığını, bir müşterinin aboneliğini iptal edip etmeyeceğini veya bir tümörün iyi huylu olup olmadığını tahmin etmek istediğimizi düşünelim. Geçmiş örneklerin doğru cevapları elimizdeyse denetimli öğrenmenin kapısından içeri gireriz. Bu yaklaşımda algoritma, etiketlenmiş verilerden örüntüler öğrenerek daha önce görmediği örnekler hakkında karar verir.]]></summary></entry><entry><title type="html">Etiketsiz Verinin Dedektifleri: K-Means ve Hiyerarşik Kümeleme</title><link href="https://sonsuzus.github.io/posts/etiketsiz-verinin-dedektifleri-k-means-ve-hiyerarsik-kumeleme/" rel="alternate" type="text/html" title="Etiketsiz Verinin Dedektifleri: K-Means ve Hiyerarşik Kümeleme" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/etiketsiz-verinin-dedektifleri-k-means-ve-hiyerarsik-kumeleme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/etiketsiz-verinin-dedektifleri-k-means-ve-hiyerarsik-kumeleme/"><![CDATA[<p>Bir veri kümesinde hangi kayıtların birbirine benzediğini biliyor, fakat onları açıklayan hazır etiketlere sahip olmuyoruz. İşte denetimsiz öğrenme tam bu noktada sahneye çıkar: Veriye “Bunlar hangi sınıfa ait?” diye sormak yerine, “Burada kendiliğinden oluşan nasıl bir yapı var?” diye bakar. Müşteri segmentasyonu, belge gruplama, anomali keşfi ve biyolojik veri analizi bu yaklaşımın yaygın kullanım alanlarıdır.
``</p>

<h2 id="denetimsiz-öğrenmenin-temel-mantığı">Denetimsiz öğrenmenin temel mantığı</h2>

<p>Denetimli öğrenmede modele hem özellikler hem de doğru cevaplar verilir. Denetimsiz öğrenmede ise yalnızca $X = {x_1, x_2, …, x_n}$ gözlemleri bulunur. Algoritma, gözlemler arasındaki uzaklık veya benzerlik ilişkilerinden yararlanarak gizli yapıyı keşfetmeye çalışır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Denetimli öğrenme</th>
      <th>Denetimsiz öğrenme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Etiket</td>
      <td>Vardır</td>
      <td>Yoktur</td>
    </tr>
    <tr>
      <td>Temel amaç</td>
      <td>Tahmin yapmak</td>
      <td>Yapı keşfetmek</td>
    </tr>
    <tr>
      <td>Örnek görev</td>
      <td>Spam sınıflandırma</td>
      <td>Müşteri segmentasyonu</td>
    </tr>
    <tr>
      <td>Değerlendirme</td>
      <td>Accuracy, F1</td>
      <td>Silhouette, küme içi varyans</td>
    </tr>
  </tbody>
</table>

<p>Kümelemenin kalbi benzerlik ölçümüdür. Sayısal verilerde sık kullanılan Öklid uzaklığı iki nokta için şöyle hesaplanır:</p>

\[d(x,y)=\sqrt{\sum_{j=1}^{m}(x_j-y_j)^2}\]

<p>Ölçekler farklıysa uzaklık yanıltıcı olabilir. Örneğin yaş 18–70, gelir ise binlerce birim aralığındaysa gelir özelliği hesaplamayı domine eder. Bu nedenle standardizasyon çoğu zaman zorunludur.</p>

<h2 id="k-means-merkezlerin-etrafında-toplanmak">K-Means: Merkezlerin etrafında toplanmak</h2>

<p>K-Means, veriyi önceden belirlenen $K$ adet kümeye ayırır. Önce rastgele merkezler seçer, her noktayı en yakın merkeze atar, ardından merkezleri yeniden hesaplar. Atamalar değişmeyene kadar bu döngü sürer.</p>

<p>Amaç fonksiyonu, noktaların kendi küme merkezlerine uzaklıklarının karelerini küçültmektir:</p>

\[J=\sum_{k=1}^{K}\sum_{x_i \in C_k}\lVert x_i-\mu_k\rVert^2\]

<p>Aşağıdaki örnek müşterileri yıllık gelir ve harcama puanına göre gruplar:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.preprocessing</span> <span class="kn">import</span> <span class="n">StandardScaler</span>
<span class="kn">from</span> <span class="n">sklearn.cluster</span> <span class="kn">import</span> <span class="n">KMeans</span>

<span class="n">X</span> <span class="o">=</span> <span class="n">customers</span><span class="p">[[</span><span class="sh">'</span><span class="s">annual_income</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">spending_score</span><span class="sh">'</span><span class="p">]]</span>
<span class="n">X_scaled</span> <span class="o">=</span> <span class="nc">StandardScaler</span><span class="p">().</span><span class="nf">fit_transform</span><span class="p">(</span><span class="n">X</span><span class="p">)</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">KMeans</span><span class="p">(</span><span class="n">n_clusters</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">,</span> <span class="n">n_init</span><span class="o">=</span><span class="mi">10</span><span class="p">)</span>
<span class="n">customers</span><span class="p">[</span><span class="sh">'</span><span class="s">cluster</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">fit_predict</span><span class="p">(</span><span class="n">X_scaled</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="n">cluster_centers_</span><span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">StandardScaler</code>, özellikleri karşılaştırılabilir ölçeğe getirir. <code class="language-plaintext highlighter-rouge">fit_predict</code> modeli eğitir ve her müşteriye bir küme numarası atar. Ancak bu numaralar sıralama ifade etmez; “küme 2”, “küme 1”den daha iyi değildir.</p>

<p>Doğru $K$ değerini seçmek için dirsek yöntemi veya Silhouette skoru kullanılabilir. Silhouette değeri $-1$ ile $1$ arasındadır; değerin $1$’e yaklaşması, kümelerin daha belirgin ayrıldığını gösterir.</p>

<h2 id="hiyerarşik-kümeleme-verinin-aile-ağacı">Hiyerarşik kümeleme: Verinin aile ağacı</h2>

<p>Hiyerarşik kümeleme, kümelerin iç içe geçmiş ilişkilerini bir dendrogram üzerinde gösterir. Birleştirici yaklaşımda her gözlem başlangıçta ayrı bir kümedir; en yakın kümeler adım adım birleşir. Bölücü yaklaşım ise tüm veriyi tek kümeden başlayarak parçalar.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">scipy.cluster.hierarchy</span> <span class="kn">import</span> <span class="n">linkage</span><span class="p">,</span> <span class="n">dendrogram</span>
<span class="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">Z</span> <span class="o">=</span> <span class="nf">linkage</span><span class="p">(</span><span class="n">X_scaled</span><span class="p">,</span> <span class="n">method</span><span class="o">=</span><span class="sh">'</span><span class="s">ward</span><span class="sh">'</span><span class="p">)</span>
<span class="nf">dendrogram</span><span class="p">(</span><span class="n">Z</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">ylabel</span><span class="p">(</span><span class="sh">'</span><span class="s">Birleşme uzaklığı</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</code></pre></div></div>

<p>Ward yöntemi, birleşmeler sonucunda oluşan küme içi varyans artışını düşük tutmaya çalışır. Dendrogramın uzun dikey boşluklarından yatay kesilmesi, makul küme sayıları hakkında görsel ipucu verir.</p>

<table>
  <thead>
    <tr>
      <th>Ölçüt</th>
      <th>K-Means</th>
      <th>Hiyerarşik kümeleme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Küme sayısı</td>
      <td>Başta belirtilir</td>
      <td>Sonradan seçilebilir</td>
    </tr>
    <tr>
      <td>Çıktı</td>
      <td>Düz küme etiketleri</td>
      <td>Dendrogram ve etiketler</td>
    </tr>
    <tr>
      <td>Hız</td>
      <td>Büyük veride genellikle hızlı</td>
      <td>Büyük veride maliyetli</td>
    </tr>
    <tr>
      <td>Küme şekli</td>
      <td>Küresel kümelerde başarılı</td>
      <td>Bağlantı yöntemine bağlı</td>
    </tr>
    <tr>
      <td>Aykırı değer</td>
      <td>Hassas</td>
      <td>Yönteme göre hassas</td>
    </tr>
  </tbody>
</table>

<h2 id="hangisini-seçmeliyiz">Hangisini seçmeliyiz?</h2>

<p>Büyük, sayısal ve yaklaşık küresel gruplara sahip verilerde K-Means iyi bir başlangıçtır. Küme sayısı bilinmiyorsa veya gruplar arasındaki soy ağacı benzeri ilişki incelenecekse hiyerarşik kümeleme daha açıklayıcıdır. Yine de sonuçlar mutlak gerçek olarak görülmemelidir. Özellik seçimi, ölçekleme, uzaklık metriği ve alan bilgisi değiştiğinde kümeler de değişebilir. Denetimsiz öğrenme sihirli bir etiket makinesi değil; verinin fısıltılarını duyulur hâle getiren güçlü bir keşif aracıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="denetimsiz öğrenme" /><category term="K-Means" /><category term="hiyerarşik kümeleme" /><summary type="html"><![CDATA[Bir veri kümesinde hangi kayıtların birbirine benzediğini biliyor, fakat onları açıklayan hazır etiketlere sahip olmuyoruz. İşte denetimsiz öğrenme tam bu noktada sahneye çıkar: Veriye “Bunlar hangi sınıfa ait?” diye sormak yerine, “Burada kendiliğinden oluşan nasıl bir yapı var?” diye bakar. Müşteri segmentasyonu, belge gruplama, anomali keşfi ve biyolojik veri analizi bu yaklaşımın yaygın kullanım alanlarıdır.]]></summary></entry><entry><title type="html">Ezberci Modeller Kulübüne Son: Overfitting ve Düzenlileştirme</title><link href="https://sonsuzus.github.io/posts/ezberci-modeller-kulubune-son-overfitting-ve-duzenlilestirme/" rel="alternate" type="text/html" title="Ezberci Modeller Kulübüne Son: Overfitting ve Düzenlileştirme" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/ezberci-modeller-kulubune-son-overfitting-ve-duzenlilestirme</id><content type="html" xml:base="https://sonsuzus.github.io/posts/ezberci-modeller-kulubune-son-overfitting-ve-duzenlilestirme/"><![CDATA[<p>Bir makine öğrenmesi modeli eğitim örneklerini kusursuz tahmin ederken yeni veriler karşısında afallıyorsa karşımızda çalışkan değil, ezberci bir öğrenci vardır. <strong>Aşırı öğrenme (overfitting)</strong> adı verilen bu durum, modelin verideki gerçek örüntülerle birlikte gürültüyü ve tesadüfi ayrıntıları da öğrenmesiyle ortaya çıkar. Neyse ki Dropout, L1/L2 düzenlileştirme ve erken durdurma gibi yöntemlerle modele biraz disiplin kazandırabiliriz.
``</p>
<h2 id="overfitting-neden-oluşur">Overfitting neden oluşur?</h2>

<p>Bir modelin amacı yalnızca eğitim hatasını küçültmek değil, daha önce görmediği örneklerde de başarılı olmaktır. Model gereğinden fazla karmaşıksa sınırlı sayıdaki eğitim verisine özel kurallar geliştirebilir. Örneğin çok derin bir karar ağacı, her yaprağa tek örnek düşene kadar dallanarak veriyi neredeyse ezberleyebilir.</p>

<p>Genelleme performansını anlamak için veri genellikle eğitim, doğrulama ve test kümelerine ayrılır. Eğitim kaybı azalırken doğrulama kaybının yükselmeye başlaması önemli bir alarmdır.</p>

<table>
  <thead>
    <tr>
      <th>Durum</th>
      <th style="text-align: right">Eğitim hatası</th>
      <th style="text-align: right">Doğrulama hatası</th>
      <th>Yorum</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Underfitting</td>
      <td style="text-align: right">Yüksek</td>
      <td style="text-align: right">Yüksek</td>
      <td>Model fazla basit</td>
    </tr>
    <tr>
      <td>İdeal öğrenme</td>
      <td style="text-align: right">Düşük</td>
      <td style="text-align: right">Düşük</td>
      <td>Örüntüler genelleniyor</td>
    </tr>
    <tr>
      <td>Overfitting</td>
      <td style="text-align: right">Çok düşük</td>
      <td style="text-align: right">Yüksek</td>
      <td>Model ayrıntıları ezberliyor</td>
    </tr>
  </tbody>
</table>

<p>Bu problem, <strong>bias-variance dengesi</strong> ile de açıklanır. Basit modeller yüksek bias nedeniyle gerçek ilişkiyi kaçırırken aşırı karmaşık modeller yüksek variance nedeniyle veri değişikliklerine fazla duyarlı olur. Hedef, iki uç arasında uygun dengeyi bulmaktır.</p>

<h2 id="l1-ve-l2-düzenlileştirme">L1 ve L2 düzenlileştirme</h2>

<p>Düzenlileştirme, standart kayıp fonksiyonuna büyük ağırlıkları cezalandıran bir terim ekler:</p>

\[J = L(y, \hat{y}) + \lambda R(w)\]

<p>Burada $L$ tahmin hatası, $R(w)$ ceza fonksiyonu ve $\lambda$ cezanın gücüdür. Lambda büyüdükçe model daha sade davranır; ancak aşırı büyük bir değer underfitting yaratabilir.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th>Ceza</th>
      <th>Temel etkisi</th>
      <th> </th>
      <th> </th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>L1 (Lasso)</td>
      <td>$\lambda \sum_i</td>
      <td>w_i</td>
      <td>$</td>
      <td>Bazı ağırlıkları sıfırlar, özellik seçimi sağlar</td>
    </tr>
    <tr>
      <td>L2 (Ridge)</td>
      <td>$\lambda \sum_i w_i^2$</td>
      <td>Ağırlıkları küçültür, daha dengeli dağıtır</td>
      <td> </td>
      <td> </td>
    </tr>
  </tbody>
</table>

<p>L1, gereksiz özellikleri oyundan çıkaran sert bir teknik direktör gibidir. L2 ise oyuncuları kovmak yerine hepsinin egosunu küçültür. Birlikte kullanıldıklarında <strong>Elastic Net</strong> yaklaşımı ortaya çıkar.</p>

<h2 id="dropout-nöronlara-zorunlu-izin">Dropout: Nöronlara zorunlu izin</h2>

<p>Dropout, sinir ağlarında eğitim sırasında bazı nöronları rastgele geçici olarak devre dışı bırakır. Böylece ağ belirli nöronlara bağımlı olamaz ve farklı temsil yolları öğrenir. Bir nöronun tutulma olasılığı $p$ ise kabaca şu maske uygulanır:</p>

\[h' = m \odot h, \quad m_i \sim Bernoulli(p)\]

<p>TensorFlow/Keras ile örnek bir ağ şöyle kurulabilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">tensorflow.keras</span> <span class="kn">import</span> <span class="n">Sequential</span>
<span class="kn">from</span> <span class="n">tensorflow.keras.layers</span> <span class="kn">import</span> <span class="n">Dense</span><span class="p">,</span> <span class="n">Dropout</span>

<span class="n">model</span> <span class="o">=</span> <span class="nc">Sequential</span><span class="p">([</span>
    <span class="nc">Dense</span><span class="p">(</span><span class="mi">128</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">"</span><span class="s">relu</span><span class="sh">"</span><span class="p">,</span> <span class="n">input_shape</span><span class="o">=</span><span class="p">(</span><span class="mi">50</span><span class="p">,)),</span>
    <span class="nc">Dropout</span><span class="p">(</span><span class="mf">0.4</span><span class="p">),</span>  <span class="c1"># Eğitimde nöronların %40'ını geçici kapatır
</span>    <span class="nc">Dense</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">"</span><span class="s">relu</span><span class="sh">"</span><span class="p">),</span>
    <span class="nc">Dropout</span><span class="p">(</span><span class="mf">0.2</span><span class="p">),</span>
    <span class="nc">Dense</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">activation</span><span class="o">=</span><span class="sh">"</span><span class="s">sigmoid</span><span class="sh">"</span><span class="p">)</span>
<span class="p">])</span>
</code></pre></div></div>

<p>Dropout yalnızca eğitim sırasında etkindir. Tahmin aşamasında tüm nöronlar kullanılır; kütüphane gerekli ölçeklemeyi otomatik olarak yönetir.</p>

<h2 id="early-stopping-zamanında-bırakmak">Early stopping: Zamanında bırakmak</h2>

<p>Erken durdurma, doğrulama kaybını izler ve iyileşme sona erdiğinde eğitimi durdurur. Böylece modelin eğitim verisini ezberlemeye başladığı bölgeye fazla ilerlenmez.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">tensorflow.keras.callbacks</span> <span class="kn">import</span> <span class="n">EarlyStopping</span>

<span class="n">stopper</span> <span class="o">=</span> <span class="nc">EarlyStopping</span><span class="p">(</span>
    <span class="n">monitor</span><span class="o">=</span><span class="sh">"</span><span class="s">val_loss</span><span class="sh">"</span><span class="p">,</span>
    <span class="n">patience</span><span class="o">=</span><span class="mi">5</span><span class="p">,</span>
    <span class="n">restore_best_weights</span><span class="o">=</span><span class="bp">True</span>
<span class="p">)</span>

<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span>
    <span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">,</span>
    <span class="n">validation_split</span><span class="o">=</span><span class="mf">0.2</span><span class="p">,</span>
    <span class="n">epochs</span><span class="o">=</span><span class="mi">100</span><span class="p">,</span>
    <span class="n">callbacks</span><span class="o">=</span><span class="p">[</span><span class="n">stopper</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">patience=5</code>, doğrulama kaybı beş dönem boyunca iyileşmezse eğitimi bitirir. <code class="language-plaintext highlighter-rouge">restore_best_weights=True</code> ise son ağırlıklar yerine en başarılı dönemin ağırlıklarını geri yükler.</p>

<h2 id="hangisini-kullanmalı">Hangisini kullanmalı?</h2>

<p>Bu yöntemler rakip değil, takım arkadaşıdır. L1/L2 model ağırlıklarını sınırlar, Dropout nöron bağımlılığını azaltır, early stopping ise eğitim süresini kontrol eder. En iyi değerler doğrulama kümesi ve hiperparametre aramasıyla belirlenmelidir. Test kümesine sürekli bakmak ise test verisini de dolaylı biçimde ezberlemek demektir. Kısacası iyi model, sınav sorularını hatırlayan değil; konuyu öğrenip yeni soruları çözebilendir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="overfitting" /><category term="düzenlileştirme" /><summary type="html"><![CDATA[Bir makine öğrenmesi modeli eğitim örneklerini kusursuz tahmin ederken yeni veriler karşısında afallıyorsa karşımızda çalışkan değil, ezberci bir öğrenci vardır. Aşırı öğrenme (overfitting) adı verilen bu durum, modelin verideki gerçek örüntülerle birlikte gürültüyü ve tesadüfi ayrıntıları da öğrenmesiyle ortaya çıkar. Neyse ki Dropout, L1/L2 düzenlileştirme ve erken durdurma gibi yöntemlerle modele biraz disiplin kazandırabiliriz.]]></summary></entry><entry><title type="html">Ham Veriden Güçlü Modellere: Veri Ön İşleme ve Öznitelik Mühendisliği</title><link href="https://sonsuzus.github.io/posts/ham-veriden-guclu-modellere-veri-on-isleme-ve-oznitelik-muhendisligi/" rel="alternate" type="text/html" title="Ham Veriden Güçlü Modellere: Veri Ön İşleme ve Öznitelik Mühendisliği" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/ham-veriden-guclu-modellere-veri-on-isleme-ve-oznitelik-muhendisligi</id><content type="html" xml:base="https://sonsuzus.github.io/posts/ham-veriden-guclu-modellere-veri-on-isleme-ve-oznitelik-muhendisligi/"><![CDATA[<p>Bir makine öğrenmesi modelinin başarısı yalnızca seçilen algoritmaya bağlı değildir. Çoğu zaman modelden daha kritik olan şey, modele verilen verinin kalitesidir. Gürültülü, eksik veya tutarsız verilerle en gelişmiş algoritma bile bocalarken; iyi temizlenmiş ve anlamlı özniteliklerle zenginleştirilmiş bir veri kümesi, daha basit modelleri bile yıldız oyuncuya dönüştürebilir.</p>

<p>``</p>

<h2 id="veri-ön-işleme-neden-gereklidir">Veri ön işleme neden gereklidir?</h2>

<p>Gerçek dünya verileri nadiren kullanıma hazır gelir. Yaş sütununda negatif değerler, şehir bilgisinde farklı yazımlar, sensör kayıtlarında boş hücreler veya gelir değişkeninde uç değerler bulunabilir. Veri ön işleme, bu sorunları model eğitilmeden önce sistematik biçimde düzeltme sürecidir.</p>

<p>Temel amaç, gözlenen veriyi gerçek olguyu daha iyi temsil eden bir forma dönüştürmektir. Bir ölçümün şu şekilde oluştuğunu düşünebiliriz:</p>

\[x_{gözlenen} = x_{gerçek} + hata\]

<p>Temizleme işlemleri hata bileşenini azaltmaya çalışır. Ancak aşırı temizlik de bilgi kaybına yol açabilir. Örneğin yüksek tutarlı bir alışveriş kaydı veri hatası değil, gerçekten önemli bir müşteri davranışı olabilir.</p>

<table>
  <thead>
    <tr>
      <th>Sorun</th>
      <th>Yaygın çözüm</th>
      <th>Olası risk</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Eksik değer</td>
      <td>Ortalama, medyan veya modelle tahmin</td>
      <td>Dağılımın bozulması</td>
    </tr>
    <tr>
      <td>Uç değer</td>
      <td>Sınırlandırma veya dönüşüm</td>
      <td>Nadir olayların kaybedilmesi</td>
    </tr>
    <tr>
      <td>Farklı ölçekler</td>
      <td>Standardizasyon</td>
      <td>Yorumlanabilirliğin azalması</td>
    </tr>
    <tr>
      <td>Kategorik veri</td>
      <td>One-hot encoding</td>
      <td>Çok fazla sütun oluşması</td>
    </tr>
    <tr>
      <td>Tutarsız metin</td>
      <td>Normalleştirme</td>
      <td>Anlamlı ayrımların silinmesi</td>
    </tr>
  </tbody>
</table>

<h2 id="eksik-değerleri-akıllıca-yönetmek">Eksik değerleri akıllıca yönetmek</h2>

<p>Eksik değerleri doğrudan silmek pratik görünse de veri azsa pahalı bir seçimdir. Sayısal değişkenlerde ortalama kullanılabilir; fakat uç değerlere karşı daha dayanıklı olduğu için medyan çoğu zaman güvenlidir. Kategorik alanlarda en sık sınıf veya <code class="language-plaintext highlighter-rouge">Bilinmiyor</code> gibi ayrı bir kategori tercih edilebilir.</p>

<p>Eksikliğin kendisi de bilgi taşıyabilir. Örneğin gelir bilgisini paylaşmayan müşterilerin davranışları farklı olabilir. Bu durumda hem değeri doldurmak hem de <code class="language-plaintext highlighter-rouge">gelir_eksik_mi</code> adlı ikili bir öznitelik oluşturmak yararlıdır.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">pandas</span> <span class="k">as</span> <span class="n">pd</span>

<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">gelir_eksik_mi</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">gelir</span><span class="sh">'</span><span class="p">].</span><span class="nf">isna</span><span class="p">().</span><span class="nf">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">gelir</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">gelir</span><span class="sh">'</span><span class="p">].</span><span class="nf">fillna</span><span class="p">(</span><span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">gelir</span><span class="sh">'</span><span class="p">].</span><span class="nf">median</span><span class="p">())</span>
</code></pre></div></div>

<p>Bu kod, eksikliği işaretler ve gelir sütunundaki boşlukları medyanla doldurur. Böylece model hem sayısal değeri kullanabilir hem de eksiklik davranışını öğrenebilir.</p>

<h2 id="ölçekleme-ve-kategorik-dönüşümler">Ölçekleme ve kategorik dönüşümler</h2>

<p>Mesafe veya gradyan tabanlı algoritmalar değişken ölçeklerinden etkilenir. Bir sütun 0–1, diğeri 0–100.000 aralığındaysa büyük değerli değişken modele gereğinden fazla yön verebilir. Standardizasyon şu formülle yapılır:</p>

\[z = (x - μ) / σ\]

<p>Burada $μ$ ortalama, $σ$ standart sapmadır. Sonuçta değişken yaklaşık sıfır ortalamaya ve birim standart sapmaya taşınır.</p>

<p>Kategorik veriler ise doğrudan sayısal sıraya çevrilmemelidir. İstanbul, Ankara ve İzmir’i 1, 2 ve 3 yapmak, modelde sahte bir büyüklük ilişkisi oluşturur. Sırasız kategoriler için one-hot encoding; doğal sırası bulunan eğitim seviyesi gibi alanlar için ordinal encoding daha uygundur.</p>

<h2 id="öznitelik-mühendisliği-veriye-anlam-katmak">Öznitelik mühendisliği: Veriye anlam katmak</h2>

<p>Öznitelik mühendisliği, mevcut sütunlardan problemi daha iyi açıklayan yeni bilgiler üretmektir. Doğum tarihinden yaş, sipariş tarihinden hafta sonu bilgisi veya fiyat ve miktardan toplam harcama türetilebilir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">toplam_harcama</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">fiyat</span><span class="sh">'</span><span class="p">]</span> <span class="o">*</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">miktar</span><span class="sh">'</span><span class="p">]</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">siparis_saati</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">siparis_tarihi</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">hour</span>
<span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">hafta_sonu</span><span class="sh">'</span><span class="p">]</span> <span class="o">=</span> <span class="n">veri</span><span class="p">[</span><span class="sh">'</span><span class="s">siparis_tarihi</span><span class="sh">'</span><span class="p">].</span><span class="n">dt</span><span class="p">.</span><span class="n">dayofweek</span><span class="p">.</span><span class="nf">isin</span><span class="p">([</span><span class="mi">5</span><span class="p">,</span> <span class="mi">6</span><span class="p">]).</span><span class="nf">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">)</span>
</code></pre></div></div>

<p>İyi bir öznitelik yalnızca matematiksel değil, alan bilgisine dayalıdır. Finans uygulamasında gelirden çok borç/gelir oranı anlamlı olabilir:</p>

\[borç\ oranı = toplam\ borç / aylık\ gelir\]

<h2 id="en-kritik-tehlike-veri-sızıntısı">En kritik tehlike: Veri sızıntısı</h2>

<p>Ön işleme adımları yalnızca eğitim verisi üzerinde öğrenilmelidir. Tüm veri kümesinin ortalamasını kullanmak, test verisinden eğitim sürecine bilgi sızdırır. Bu nedenle önce eğitim-test ayrımı yapılmalı; doldurma, ölçekleme ve kodlama işlemleri bir pipeline içinde uygulanmalıdır.</p>

<p>Sonuç olarak kaliteli veri hazırlama; temizleme, eksik değer yönetimi, uygun dönüşüm ve yaratıcı öznitelik üretiminin birleşimidir. Modeli değiştirmeden önce veriye bakmak çoğu zaman en güçlü optimizasyondur: Çünkü iyi özellikler, algoritmanın dünyayı daha anlaşılır görmesini sağlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="veri ön işleme" /><category term="öznitelik mühendisliği" /><category term="makine öğrenmesi" /><summary type="html"><![CDATA[Bir makine öğrenmesi modelinin başarısı yalnızca seçilen algoritmaya bağlı değildir. Çoğu zaman modelden daha kritik olan şey, modele verilen verinin kalitesidir. Gürültülü, eksik veya tutarsız verilerle en gelişmiş algoritma bile bocalarken; iyi temizlenmiş ve anlamlı özniteliklerle zenginleştirilmiş bir veri kümesi, daha basit modelleri bile yıldız oyuncuya dönüştürebilir.]]></summary></entry><entry><title type="html">Hata Yüzeyinde Yolculuk: Gradient Descent, Adam ve RMSprop</title><link href="https://sonsuzus.github.io/posts/hata-yuzeyinde-yolculuk-gradient-descent-adam-ve-rmsprop/" rel="alternate" type="text/html" title="Hata Yüzeyinde Yolculuk: Gradient Descent, Adam ve RMSprop" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/hata-yuzeyinde-yolculuk-gradient-descent-adam-ve-rmsprop</id><content type="html" xml:base="https://sonsuzus.github.io/posts/hata-yuzeyinde-yolculuk-gradient-descent-adam-ve-rmsprop/"><![CDATA[<p>Bir makine öğrenmesi modelini eğitmek, sisli bir dağda en alçak noktayı bulmaya benzer. Modelin parametreleri bulunduğumuz konumu, hata fonksiyonu yüksekliği, optimizasyon algoritması ise hangi yöne adım atacağımızı belirler. Gradient Descent bu yolculuğun klasik pusulasıyken Adam ve RMSprop, arazi koşullarına göre adımlarını ayarlayan daha modern navigasyon sistemleridir.
``</p>
<h2 id="optimizasyonun-temel-amacı">Optimizasyonun temel amacı</h2>

<p>Bir modelin tahminleri ile gerçek değerler arasındaki fark, <strong>kayıp fonksiyonu</strong> üzerinden ölçülür. Parametreleri $\theta$ ile gösterirsek amaç şu problemi çözmektir:</p>

\[\theta^* = \arg\min_{\theta} J(\theta)\]

<p>Burada $J(\theta)$ hata yüzeyini, $\theta^*$ ise mümkün olan en düşük hatayı sağlayan parametreleri temsil eder. Gradyan, bu yüzeyde hatanın en hızlı arttığı yönü gösterir. Dolayısıyla hatayı azaltmak için gradyanın tersine ilerleriz:</p>

\[\theta_{t+1} = \theta_t - \eta \nabla J(\theta_t)\]

<p>$\eta$ öğrenme oranıdır. Çok küçük seçilirse eğitim kaplumbağa hızına düşer; çok büyük seçilirse algoritma minimum noktanın üzerinden zıplayabilir.</p>

<h2 id="gradient-descent-çeşitleri">Gradient Descent çeşitleri</h2>

<p>Geleneksel Gradient Descent, her güncellemede bütün veri kümesini kullanır. Bu yöntem kararlı olsa da büyük veri kümelerinde pahalıdır. <strong>Stochastic Gradient Descent</strong> (SGD) her adımda tek örnek kullanır. Gürültülü hareket eder fakat yerel çukurlardan kaçmasına yardımcı olabilecek kadar hareketlidir. Mini-batch yaklaşımı ise küçük veri gruplarıyla çalışarak iki yöntemi dengeler.</p>

<table>
  <thead>
    <tr>
      <th>Yöntem</th>
      <th style="text-align: right">Güncelleme verisi</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Batch Gradient Descent</td>
      <td style="text-align: right">Tüm veri</td>
      <td>Kararlı gradyan</td>
      <td>Yavaş ve bellek maliyetli</td>
    </tr>
    <tr>
      <td>SGD</td>
      <td style="text-align: right">Tek örnek</td>
      <td>Hızlı güncelleme</td>
      <td>Fazla dalgalanma</td>
    </tr>
    <tr>
      <td>Mini-batch SGD</td>
      <td style="text-align: right">Küçük grup</td>
      <td>Paralelleştirmeye uygun</td>
      <td>Batch boyutu ayarlanmalı</td>
    </tr>
  </tbody>
</table>

<h2 id="momentum-yokuş-aşağı-yuvarlanan-top">Momentum: Yokuş aşağı yuvarlanan top</h2>

<p>Momentum, geçmiş gradyanları kullanarak güncellemelerin yönünü yumuşatır:</p>

\[v_t = \beta v_{t-1} + (1-\beta)\nabla J(\theta_t)\]

\[\theta_{t+1} = \theta_t - \eta v_t\]

<p>Bunu yokuş aşağı yuvarlanan bir top gibi düşünebiliriz. Top doğru yönde hız kazanırken sağa sola oluşan küçük salınımlar bastırılır. Özellikle uzun ve dar hata vadilerinde klasik SGD’den daha hızlı ilerler.</p>

<h2 id="rmsprop-ve-adam-nasıl-çalışır">RMSprop ve Adam nasıl çalışır?</h2>

<p>RMSprop, her parametre için gradyan karelerinin hareketli ortalamasını tutar:</p>

\[s_t = \rho s_{t-1} + (1-\rho)g_t^2\]

<p>Güncelleme, $\theta_{t+1}=\theta_t-\eta g_t/(\sqrt{s_t}+\epsilon)$ biçimindedir. Sık ve büyük gradyan alan parametrelerin adımı küçülürken seyrek güncellenenlerin adımı görece büyür.</p>

<p>Adam, Momentum’un birinci moment tahminiyle RMSprop’un ikinci moment tahminini birleştirir. Ayrıca başlangıçtaki yanlılığı düzeltir. Böylece farklı ölçeklerdeki parametreler için otomatik uyarlanan adımlar üretir.</p>

<table>
  <thead>
    <tr>
      <th>Algoritma</th>
      <th>Temel fikir</th>
      <th>Güçlü olduğu durum</th>
      <th>Dikkat edilmesi gereken</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>SGD</td>
      <td>Sabit öğrenme oranı</td>
      <td>İyi genelleme</td>
      <td>Hassas ayar ister</td>
    </tr>
    <tr>
      <td>Momentum</td>
      <td>Geçmiş yönleri biriktirme</td>
      <td>Dar hata vadileri</td>
      <td>Ek momentum katsayısı</td>
    </tr>
    <tr>
      <td>RMSprop</td>
      <td>Kare gradyan ortalaması</td>
      <td>Değişken ve gürültülü problemler</td>
      <td>Öğrenme oranına duyarlı olabilir</td>
    </tr>
    <tr>
      <td>Adam</td>
      <td>Momentum + RMSprop</td>
      <td>Hızlı başlangıç, seyrek gradyanlar</td>
      <td>Her zaman en iyi genellemeyi sağlamaz</td>
    </tr>
  </tbody>
</table>

<h2 id="python-ile-küçük-bir-karşılaştırma">Python ile küçük bir karşılaştırma</h2>

<p>Aşağıdaki PyTorch kodu, aynı model için optimizasyon algoritmasının nasıl değiştirileceğini gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">torch</span>

<span class="n">model</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">nn</span><span class="p">.</span><span class="nc">Linear</span><span class="p">(</span><span class="mi">10</span><span class="p">,</span> <span class="mi">1</span><span class="p">)</span>
<span class="n">loss_fn</span> <span class="o">=</span> <span class="n">torch</span><span class="p">.</span><span class="n">nn</span><span class="p">.</span><span class="nc">MSELoss</span><span class="p">()</span>

<span class="n">optimizers</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">"</span><span class="s">sgd</span><span class="sh">"</span><span class="p">:</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="nc">SGD</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.01</span><span class="p">,</span> <span class="n">momentum</span><span class="o">=</span><span class="mf">0.9</span><span class="p">),</span>
    <span class="sh">"</span><span class="s">rmsprop</span><span class="sh">"</span><span class="p">:</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="nc">RMSprop</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.001</span><span class="p">),</span>
    <span class="sh">"</span><span class="s">adam</span><span class="sh">"</span><span class="p">:</span> <span class="n">torch</span><span class="p">.</span><span class="n">optim</span><span class="p">.</span><span class="nc">Adam</span><span class="p">(</span><span class="n">model</span><span class="p">.</span><span class="nf">parameters</span><span class="p">(),</span> <span class="n">lr</span><span class="o">=</span><span class="mf">0.001</span><span class="p">)</span>
<span class="p">}</span>

<span class="n">optimizer</span> <span class="o">=</span> <span class="n">optimizers</span><span class="p">[</span><span class="sh">"</span><span class="s">adam</span><span class="sh">"</span><span class="p">]</span>

<span class="k">for</span> <span class="n">features</span><span class="p">,</span> <span class="n">targets</span> <span class="ow">in</span> <span class="n">data_loader</span><span class="p">:</span>
    <span class="n">optimizer</span><span class="p">.</span><span class="nf">zero_grad</span><span class="p">()</span>
    <span class="n">predictions</span> <span class="o">=</span> <span class="nf">model</span><span class="p">(</span><span class="n">features</span><span class="p">)</span>
    <span class="n">loss</span> <span class="o">=</span> <span class="nf">loss_fn</span><span class="p">(</span><span class="n">predictions</span><span class="p">,</span> <span class="n">targets</span><span class="p">)</span>
    <span class="n">loss</span><span class="p">.</span><span class="nf">backward</span><span class="p">()</span>
    <span class="n">optimizer</span><span class="p">.</span><span class="nf">step</span><span class="p">()</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">zero_grad()</code> eski gradyanları temizler, <code class="language-plaintext highlighter-rouge">backward()</code> türevleri hesaplar, <code class="language-plaintext highlighter-rouge">step()</code> ise parametreleri seçilen algoritmaya göre günceller.</p>

<h2 id="hangisini-seçmeliyiz">Hangisini seçmeliyiz?</h2>

<p>Adam çoğu derin öğrenme projesinde güçlü bir başlangıç seçeneğidir; hızlı yakınsar ve az ayar gerektirir. Bununla birlikte SGD ve Momentum, uygun öğrenme oranı zamanlamasıyla daha iyi genelleme sağlayabilir. RMSprop ise tekrarlayan sinir ağları ve gürültülü hedeflerde hâlâ kullanışlıdır. En doğru yaklaşım, doğrulama kaybını izlemek, birkaç algoritmayı aynı koşullarda denemek ve yalnızca eğitim hızına değil modelin görülmemiş verideki başarısına da bakmaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="optimizasyon" /><category term="gradient-descent" /><category term="makine-öğrenmesi" /><summary type="html"><![CDATA[Bir makine öğrenmesi modelini eğitmek, sisli bir dağda en alçak noktayı bulmaya benzer. Modelin parametreleri bulunduğumuz konumu, hata fonksiyonu yüksekliği, optimizasyon algoritması ise hangi yöne adım atacağımızı belirler. Gradient Descent bu yolculuğun klasik pusulasıyken Adam ve RMSprop, arazi koşullarına göre adımlarını ayarlayan daha modern navigasyon sistemleridir.]]></summary></entry><entry><title type="html">Kütüphanesiz Yapay Sinir Ağıyla El Yazısı Rakamları Tanıma</title><link href="https://sonsuzus.github.io/posts/kutuphanesiz-yapay-sinir-agiyla-el-yazisi-rakamlari-tanima/" rel="alternate" type="text/html" title="Kütüphanesiz Yapay Sinir Ağıyla El Yazısı Rakamları Tanıma" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/kutuphanesiz-yapay-sinir-agiyla-el-yazisi-rakamlari-tanima</id><content type="html" xml:base="https://sonsuzus.github.io/posts/kutuphanesiz-yapay-sinir-agiyla-el-yazisi-rakamlari-tanima/"><![CDATA[<p>Bir yapay sinir ağının gerçekten nasıl öğrendiğini anlamanın en iyi yolu, hazır makine öğrenmesi kütüphanelerini bir kenara bırakıp bütün parçaları kendimiz yazmaktır. Bu projede yalnızca Python dilinin temel özelliklerini kullanarak MNIST benzeri el yazısı rakamlarını tanıyan, girişten çıkışa ve hatadan geriye doğru öğrenebilen küçük bir sinir ağı geliştireceğiz.</p>

<p>``</p>

<h2 id="problemi-sayılara-dönüştürmek">Problemi sayılara dönüştürmek</h2>

<p>28×28 piksellik gri tonlamalı bir rakam resmi, ağ açısından resim değil, 784 sayıdan oluşan bir vektördür. Her pikseli 255’e bölerek değerleri $[0,1]$ aralığına taşırız:</p>

\[x_i = \frac{piksel_i}{255}\]

<p>Çıkış katmanında ise 10 nöron bulunur. Örneğin doğru cevap 3 ise hedef vektörü $[0,0,0,1,0,0,0,0,0,0]$ olur. Buna <strong>one-hot kodlama</strong> denir.</p>

<table>
  <thead>
    <tr>
      <th>Katman</th>
      <th style="text-align: right">Nöron sayısı</th>
      <th>Görevi</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Giriş</td>
      <td style="text-align: right">784</td>
      <td>Piksel değerlerini almak</td>
    </tr>
    <tr>
      <td>Gizli</td>
      <td style="text-align: right">64</td>
      <td>Çizgi, kıvrım ve kenar örüntülerini öğrenmek</td>
    </tr>
    <tr>
      <td>Çıkış</td>
      <td style="text-align: right">10</td>
      <td>0-9 sınıflarını puanlamak</td>
    </tr>
  </tbody>
</table>

<p>Bir nöron önce ağırlıklı toplam hesaplar:</p>

\[z_j = \sum_i x_i w_{ij} + b_j\]

<p>Ardından doğrusal olmayan sigmoid fonksiyonu uygulanır:</p>

\[\sigma(z)=\frac{1}{1+e^{-z}}\]

<p>Doğrusal olmayan aktivasyon kullanılmazsa çok sayıda katman, matematiksel olarak tek bir doğrusal dönüşüme dönüşür. Başka bir deyişle ağ büyür, fakat zekâsı pek büyümez.</p>

<h2 id="ağı-sıfırdan-kodlamak">Ağı sıfırdan kodlamak</h2>

<p>Aşağıdaki Python kodu matris kütüphanesi kullanmaz. Ağırlıkları üretmek için kendi basit sözde rastgele sayı üretecimizi bile yazıyoruz:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">seed</span> <span class="o">=</span> <span class="mi">123456</span>

<span class="k">def</span> <span class="nf">rnd</span><span class="p">():</span>
    <span class="k">global</span> <span class="n">seed</span>
    <span class="n">seed</span> <span class="o">=</span> <span class="p">(</span><span class="mi">1103515245</span> <span class="o">*</span> <span class="n">seed</span> <span class="o">+</span> <span class="mi">12345</span><span class="p">)</span> <span class="o">%</span> <span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="mi">31</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">seed</span> <span class="o">/</span> <span class="p">(</span><span class="mi">2</span> <span class="o">**</span> <span class="mi">31</span><span class="p">)</span> <span class="o">-</span> <span class="mf">0.5</span>

<span class="k">def</span> <span class="nf">sigmoid</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="k">return</span> <span class="mf">1.0</span> <span class="o">/</span> <span class="p">(</span><span class="mf">1.0</span> <span class="o">+</span> <span class="mf">2.718281828</span> <span class="o">**</span> <span class="p">(</span><span class="o">-</span><span class="nf">max</span><span class="p">(</span><span class="o">-</span><span class="mi">30</span><span class="p">,</span> <span class="nf">min</span><span class="p">(</span><span class="mi">30</span><span class="p">,</span> <span class="n">x</span><span class="p">))))</span>

<span class="k">def</span> <span class="nf">matrix</span><span class="p">(</span><span class="n">rows</span><span class="p">,</span> <span class="n">cols</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">[[</span><span class="nf">rnd</span><span class="p">()</span> <span class="o">*</span> <span class="mf">0.1</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">cols</span><span class="p">)]</span> <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">rows</span><span class="p">)]</span>

<span class="n">INPUT</span><span class="p">,</span> <span class="n">HIDDEN</span><span class="p">,</span> <span class="n">OUTPUT</span> <span class="o">=</span> <span class="mi">784</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">10</span>
<span class="n">w1</span> <span class="o">=</span> <span class="nf">matrix</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">,</span> <span class="n">INPUT</span><span class="p">)</span>
<span class="n">b1</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">]</span> <span class="o">*</span> <span class="n">HIDDEN</span>
<span class="n">w2</span> <span class="o">=</span> <span class="nf">matrix</span><span class="p">(</span><span class="n">OUTPUT</span><span class="p">,</span> <span class="n">HIDDEN</span><span class="p">)</span>
<span class="n">b2</span> <span class="o">=</span> <span class="p">[</span><span class="mf">0.0</span><span class="p">]</span> <span class="o">*</span> <span class="n">OUTPUT</span>

<span class="k">def</span> <span class="nf">forward</span><span class="p">(</span><span class="n">x</span><span class="p">):</span>
    <span class="n">hidden</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">):</span>
        <span class="n">z</span> <span class="o">=</span> <span class="n">b1</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">+</span> <span class="nf">sum</span><span class="p">(</span><span class="n">w1</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">INPUT</span><span class="p">))</span>
        <span class="n">hidden</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">z</span><span class="p">))</span>

    <span class="n">output</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">OUTPUT</span><span class="p">):</span>
        <span class="n">z</span> <span class="o">=</span> <span class="n">b2</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">+</span> <span class="nf">sum</span><span class="p">(</span><span class="n">w2</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">hidden</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">))</span>
        <span class="n">output</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">sigmoid</span><span class="p">(</span><span class="n">z</span><span class="p">))</span>
    <span class="k">return</span> <span class="n">hidden</span><span class="p">,</span> <span class="n">output</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">forward</code> fonksiyonu tahmin üretir; ancak öğrenme için hatayı ağırlıklara geri dağıtmamız gerekir. Ortalama karesel hata kullanırsak temel hedefimiz şudur:</p>

\[L=\frac{1}{2}\sum_k(y_k-\hat{y}_k)^2\]

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">train</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">rate</span><span class="o">=</span><span class="mf">0.1</span><span class="p">):</span>
    <span class="n">hidden</span><span class="p">,</span> <span class="n">output</span> <span class="o">=</span> <span class="nf">forward</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>

    <span class="n">out_delta</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">(</span><span class="n">output</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">-</span> <span class="n">target</span><span class="p">[</span><span class="n">k</span><span class="p">])</span> <span class="o">*</span> <span class="n">output</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">output</span><span class="p">[</span><span class="n">k</span><span class="p">])</span>
        <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">OUTPUT</span><span class="p">)</span>
    <span class="p">]</span>

    <span class="n">hid_delta</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">):</span>
        <span class="n">error</span> <span class="o">=</span> <span class="nf">sum</span><span class="p">(</span><span class="n">out_delta</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">w2</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">OUTPUT</span><span class="p">))</span>
        <span class="n">hid_delta</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">error</span> <span class="o">*</span> <span class="n">hidden</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="p">(</span><span class="mi">1</span> <span class="o">-</span> <span class="n">hidden</span><span class="p">[</span><span class="n">j</span><span class="p">]))</span>

    <span class="k">for</span> <span class="n">k</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">OUTPUT</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">):</span>
            <span class="n">w2</span><span class="p">[</span><span class="n">k</span><span class="p">][</span><span class="n">j</span><span class="p">]</span> <span class="o">-=</span> <span class="n">rate</span> <span class="o">*</span> <span class="n">out_delta</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">*</span> <span class="n">hidden</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
        <span class="n">b2</span><span class="p">[</span><span class="n">k</span><span class="p">]</span> <span class="o">-=</span> <span class="n">rate</span> <span class="o">*</span> <span class="n">out_delta</span><span class="p">[</span><span class="n">k</span><span class="p">]</span>

    <span class="k">for</span> <span class="n">j</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">HIDDEN</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">INPUT</span><span class="p">):</span>
            <span class="n">w1</span><span class="p">[</span><span class="n">j</span><span class="p">][</span><span class="n">i</span><span class="p">]</span> <span class="o">-=</span> <span class="n">rate</span> <span class="o">*</span> <span class="n">hid_delta</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">*</span> <span class="n">x</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="n">b1</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">-=</span> <span class="n">rate</span> <span class="o">*</span> <span class="n">hid_delta</span><span class="p">[</span><span class="n">j</span><span class="p">]</span>
</code></pre></div></div>

<h2 id="eğitim-ve-tahmin">Eğitim ve tahmin</h2>

<p>Her eğitim resmi için piksel listesini normalize eder, doğru rakamın hedef değerini 1 yapar ve <code class="language-plaintext highlighter-rouge">train</code> fonksiyonunu çağırırız. Bu işlemin tüm veri üzerinde bir kez yapılmasına <strong>epoch</strong> denir. Eğitimden sonra tahmin, en yüksek çıkış değerinin indeksidir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">predict</span><span class="p">(</span><span class="n">pixels</span><span class="p">):</span>
    <span class="n">x</span> <span class="o">=</span> <span class="p">[</span><span class="n">p</span> <span class="o">/</span> <span class="mf">255.0</span> <span class="k">for</span> <span class="n">p</span> <span class="ow">in</span> <span class="n">pixels</span><span class="p">]</span>
    <span class="n">_</span><span class="p">,</span> <span class="n">scores</span> <span class="o">=</span> <span class="nf">forward</span><span class="p">(</span><span class="n">x</span><span class="p">)</span>
    <span class="k">return</span> <span class="nf">max</span><span class="p">(</span><span class="nf">range</span><span class="p">(</span><span class="mi">10</span><span class="p">),</span> <span class="n">key</span><span class="o">=</span><span class="k">lambda</span> <span class="n">i</span><span class="p">:</span> <span class="n">scores</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Avantaj</th>
      <th>Dezavantaj</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sıfırdan ağ</td>
      <td>Matematiği görünür kılar</td>
      <td>Yavaş çalışır</td>
    </tr>
    <tr>
      <td>Hazır kütüphane</td>
      <td>Hızlı ve optimize</td>
      <td>Ayrıntıları gizleyebilir</td>
    </tr>
  </tbody>
</table>

<p>Bu ağ modern modellerle yarışmayacaktır; fakat ileri yayılım, geri yayılım, gradyan inişi ve sınıflandırmanın nasıl birleştiğini açıkça gösterir. Sonraki adım olarak mini-batch eğitimi, ReLU, softmax ve çapraz entropi eklenebilir. Artık sinir ağı gizemli bir kara kutu değil; bolca döngü, türev ve sabırdan oluşan anlaşılır bir makinedir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="yapay sinir ağı" /><category term="Python" /><category term="MNIST" /><summary type="html"><![CDATA[Bir yapay sinir ağının gerçekten nasıl öğrendiğini anlamanın en iyi yolu, hazır makine öğrenmesi kütüphanelerini bir kenara bırakıp bütün parçaları kendimiz yazmaktır. Bu projede yalnızca Python dilinin temel özelliklerini kullanarak MNIST benzeri el yazısı rakamlarını tanıyan, girişten çıkışa ve hatadan geriye doğru öğrenebilen küçük bir sinir ağı geliştireceğiz.]]></summary></entry><entry><title type="html">Makine Öğrenmesi Paradigmaları: Veriden Öğrenmenin Üç Farklı Yolu</title><link href="https://sonsuzus.github.io/posts/makine-ogrenmesi-paradigmalari-veriden-ogrenmenin-uc-farkli-yolu/" rel="alternate" type="text/html" title="Makine Öğrenmesi Paradigmaları: Veriden Öğrenmenin Üç Farklı Yolu" /><published>2026-08-07T00:00:00+00:00</published><updated>2026-08-07T00:00:00+00:00</updated><id>https://sonsuzus.github.io/posts/makine-ogrenmesi-paradigmalari-veriden-ogrenmenin-uc-farkli-yolu</id><content type="html" xml:base="https://sonsuzus.github.io/posts/makine-ogrenmesi-paradigmalari-veriden-ogrenmenin-uc-farkli-yolu/"><![CDATA[<p>Makine öğrenmesi, bilgisayarlara her olasılık için ayrı bir kural yazmak yerine örneklerden davranış geliştirme imkânı verir. Ancak “veriden öğrenmek” tek bir yöntemi ifade etmez. Kimi sistemler doğru cevaplarla çalışır, kimileri verinin içindeki gizli yapıyı keşfeder, kimileri ise deneme-yanılma yoluyla ödül toplamayı öğrenir. Denetimli, denetimsiz ve pekiştirmeli öğrenme; yalnızca farklı algoritmalar değil, öğrenmenin doğasına ilişkin üç ayrı felsefi yaklaşımdır.
``</p>

<h2 id="öğrenmek-ne-anlama-gelir">Öğrenmek ne anlama gelir?</h2>

<p>Klasik programlamada insan kuralları ve girdileri verir, bilgisayar sonucu üretir. Makine öğrenmesinde ise girdilerle birlikte örnek sonuçlar veya bir değerlendirme mekanizması sunulur; sistem uygun kuralları kendisi yaklaşık olarak çıkarır.</p>

<p>Bu süreç genellikle bir amaç fonksiyonunun iyileştirilmesidir. Bir modelin parametreleri $\theta$, tahmini $f_\theta(x)$ ve gerçek cevap $y$ olsun. Denetimli öğrenmede hedef çoğunlukla şu kaybı küçültmektir:</p>

\[\theta^* = \arg\min_\theta \frac{1}{n}\sum_{i=1}^{n} L(f_\theta(x_i), y_i)\]

<p>Buradaki kritik fikir şudur: Sistem “gerçeği” doğrudan öğrenmez; verilen veri, hedef ve ölçüm yöntemi altında başarılı olan bir temsil öğrenir.</p>

<h2 id="üç-paradigmanın-karşılaştırması">Üç paradigmanın karşılaştırması</h2>

<table>
  <thead>
    <tr>
      <th>Paradigma</th>
      <th>Öğrenme sinyali</th>
      <th>Temel soru</th>
      <th>Tipik kullanım</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Denetimli</td>
      <td>Etiket veya doğru cevap</td>
      <td>Bu girdi için sonuç nedir?</td>
      <td>Sınıflandırma, regresyon</td>
    </tr>
    <tr>
      <td>Denetimsiz</td>
      <td>Yalnızca ham veri</td>
      <td>Bu veride nasıl bir yapı var?</td>
      <td>Kümeleme, boyut indirgeme</td>
    </tr>
    <tr>
      <td>Pekiştirmeli</td>
      <td>Ödül ve ceza</td>
      <td>Uzun vadede hangi eylem daha iyi?</td>
      <td>Robotik, oyunlar, kontrol</td>
    </tr>
  </tbody>
</table>

<h3 id="denetimli-öğrenme-öğretmenli-eğitim">Denetimli öğrenme: Öğretmenli eğitim</h3>

<p>Denetimli öğrenmede veri kümesi $(x_i, y_i)$ çiftlerinden oluşur. Örneğin bir e-postanın özellikleri $x$, “spam” etiketi ise $y$ olabilir. Model, tahminleriyle etiketler arasındaki hatayı azaltır.</p>

<p>Felsefi açıdan bu yaklaşım, bilginin dışarıdan sağlanan doğru örneklerle kazanıldığını varsayar. Güçlüdür; fakat öğretmenin hatalarını da miras alır. Etiketlerde önyargı varsa model bunu şaşırtıcı bir disiplinle öğrenebilir.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.linear_model</span> <span class="kn">import</span> <span class="n">LogisticRegression</span>

<span class="c1"># Özelliklerden ikili sınıf etiketini tahmin eden model
</span><span class="n">model</span> <span class="o">=</span> <span class="nc">LogisticRegression</span><span class="p">()</span>
<span class="n">model</span><span class="p">.</span><span class="nf">fit</span><span class="p">(</span><span class="n">X_train</span><span class="p">,</span> <span class="n">y_train</span><span class="p">)</span>
<span class="n">tahminler</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">predict</span><span class="p">(</span><span class="n">X_test</span><span class="p">)</span>
</code></pre></div></div>

<p>Lojistik regresyon, sınıf olasılığını sigmoid fonksiyonuyla modeller: $\sigma(z)=1/(1+e^{-z})$. Basit görünmesine rağmen metin sınıflandırma ve risk tahmini gibi alanlarda güçlü bir başlangıçtır.</p>

<h3 id="denetimsiz-öğrenme-haritasız-keşif">Denetimsiz öğrenme: Haritasız keşif</h3>

<p>Denetimsiz öğrenmede doğru cevap anahtarı yoktur. Algoritma benzerlik, yoğunluk veya istatistiksel bağımlılık gibi ölçütlerle yapılar arar. K-means, noktaları merkezlerine olan kareli uzaklığı küçülterek $k$ kümeye ayırır:</p>

\[J = \sum_{j=1}^{k}\sum_{x_i \in C_j}\lVert x_i-\mu_j\rVert^2\]

<p>Burada “doğru küme” mutlak değildir. Müşteriler yaşa göre başka, alışveriş davranışına göre başka biçimde gruplanabilir. Dolayısıyla sonuç, seçilen özelliklerin ve benzerlik tanımının bir yorumudur.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">sklearn.cluster</span> <span class="kn">import</span> <span class="n">KMeans</span>

<span class="c1"># Etiketsiz müşterileri üç davranış grubuna ayırır
</span><span class="n">model</span> <span class="o">=</span> <span class="nc">KMeans</span><span class="p">(</span><span class="n">n_clusters</span><span class="o">=</span><span class="mi">3</span><span class="p">,</span> <span class="n">random_state</span><span class="o">=</span><span class="mi">42</span><span class="p">)</span>
<span class="n">kume_numaralari</span> <span class="o">=</span> <span class="n">model</span><span class="p">.</span><span class="nf">fit_predict</span><span class="p">(</span><span class="n">musteri_ozellikleri</span><span class="p">)</span>
</code></pre></div></div>

<h3 id="pekiştirmeli-öğrenme-sonuçlardan-ders-çıkarmak">Pekiştirmeli öğrenme: Sonuçlardan ders çıkarmak</h3>

<p>Pekiştirmeli öğrenmede bir ajan, durum $s$ içinde eylem $a$ seçer; çevre yeni durum ve ödül üretir. Amaç anlık ödülü değil, indirgenmiş toplam getiriyi büyütmektir:</p>

\[G_t = \sum_{k=0}^{\infty}\gamma^k r_{t+k+1}\]

<p>$\gamma$, gelecekteki ödüllere verilen önemi belirler. Bu paradigma davranışçı öğrenmeye benzer: Ajan hangi eylemin doğru olduğunu önceden bilmez, sonuçları deneyimler. En büyük ikilem keşif ve sömürüdür; yeni seçenekler mi denenmeli, yoksa bilinen iyi davranış mı tekrarlanmalıdır?</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Denetimli</th>
      <th>Denetimsiz</th>
      <th>Pekiştirmeli</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Geri bildirim</td>
      <td>Anında ve açık</td>
      <td>Doğrudan yok</td>
      <td>Gecikmeli olabilir</td>
    </tr>
    <tr>
      <td>Veri üretimi</td>
      <td>Genellikle sabit</td>
      <td>Genellikle sabit</td>
      <td>Etkileşimle oluşur</td>
    </tr>
    <tr>
      <td>Başlıca risk</td>
      <td>Aşırı öğrenme</td>
      <td>Anlamsız desenler</td>
      <td>Yanlış ödül tasarımı</td>
    </tr>
  </tbody>
</table>

<h2 id="hangisi-seçilmeli">Hangisi seçilmeli?</h2>

<p>Elinizde güvenilir etiketler varsa denetimli öğrenme, yapıyı keşfetmek istiyorsanız denetimsiz öğrenme, ardışık kararlar ve çevresel etkileşim söz konusuysa pekiştirmeli öğrenme uygundur. Gerçek sistemlerde bu sınırlar bulanıktır: Bir robot görüntüleri denetimli öğrenmeyle tanıyabilir, denetimsiz yöntemle temsil çıkarabilir ve hareketlerini pekiştirmeli öğrenmeyle geliştirebilir. Kısacası mesele en havalı algoritmayı seçmek değil, eldeki geri bildirim türünü doğru anlamaktır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="makine öğrenmesi" /><category term="yapay zekâ" /><category term="algoritmalar" /><summary type="html"><![CDATA[Makine öğrenmesi, bilgisayarlara her olasılık için ayrı bir kural yazmak yerine örneklerden davranış geliştirme imkânı verir. Ancak “veriden öğrenmek” tek bir yöntemi ifade etmez. Kimi sistemler doğru cevaplarla çalışır, kimileri verinin içindeki gizli yapıyı keşfeder, kimileri ise deneme-yanılma yoluyla ödül toplamayı öğrenir. Denetimli, denetimsiz ve pekiştirmeli öğrenme; yalnızca farklı algoritmalar değil, öğrenmenin doğasına ilişkin üç ayrı felsefi yaklaşımdır.]]></summary></entry></feed>