<?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://program.sonsuz.us/feed.xml" rel="self" type="application/atom+xml" /><link href="https://program.sonsuz.us/" rel="alternate" type="text/html" /><updated>2026-10-27T06:05:47+00:00</updated><id>https://program.sonsuz.us/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">Bir Dakika mı, Sonsuzluk mu? Oyunlarda Zaman Algısının Tasarımı</title><link href="https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi/" rel="alternate" type="text/html" title="Bir Dakika mı, Sonsuzluk mu? Oyunlarda Zaman Algısının Tasarımı" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi</id><content type="html" xml:base="https://program.sonsuz.us/posts/bir-dakika-mi-sonsuzluk-mu-oyunlarda-zaman-algisinin-tasarimi/"><![CDATA[<p>Bir oyunda geçen 30 saniye her zaman 30 saniye gibi hissedilmez. Çatışmanın ortasında göz açıp kapayıncaya kadar geçen bu süre, boş bir yükleme ekranında küçük bir sonsuzluğa dönüşebilir. Çünkü oyuncunun sabrı yalnızca kronometreyle değil; dikkat, beklenti, kontrol hissi ve sunulan geri bildirimle yönetilir. İyi oyun tasarımı zamanı hızlandıramasa bile beynin onu nasıl yorumladığını ustalıkla değiştirebilir.</p>

<p><img src="/img/bir-dakika-mi-15.svg" alt="bir-dakika-mi-15" /></p>

<p>``</p>

<h2 id="fiziksel-zaman-ve-algılanan-zaman">Fiziksel zaman ve algılanan zaman</h2>

<p>Fiziksel zaman ölçülebilirken algılanan zaman öznel bir deneyimdir. Bunu basitleştirilmiş bir modelle şöyle ifade edebiliriz:</p>

\[T_a = T_g \times \frac{B + D}{E + K}\]

<p>Burada $T_a$ algılanan zamanı, $T_g$ gerçek süreyi, $B$ belirsizliği, $D$ dikkatin beklemeye yönelmesini, $E$ eğlenceyi ve $K$ kontrol hissini temsil eder. Bu bilimsel bir ölçüm formülü değil, tasarım kararlarını düşünmek için kullanışlı bir modeldir. Belirsizlik ve beklemeye odaklanma arttıkça süre uzamış gibi hissedilir. Eğlence ve kontrol hissi yükseldiğinde ise aynı süre daha kısa algılanır.</p>

<p>Örneğin yüzde göstergesi bulunmayan donmuş bir ekran, oyuncuya sistemin çalışıp çalışmadığını düşündürür. Belirsizlik yükselir ve oyuncu her saniyeyi izlemeye başlar. Hareketli bir ipucu, ilerleme çubuğu veya etkileşimli mini oyun ise dikkati dağıtır.</p>

<table>
  <thead>
    <tr>
      <th>Bekleme tasarımı</th>
      <th>Oyuncunun düşüncesi</th>
      <th>Algılanan etki</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Boş ve hareketsiz ekran</td>
      <td>“Oyun çöktü mü?”</td>
      <td>Süre çok uzun gelir</td>
    </tr>
    <tr>
      <td>İlerleme çubuğu</td>
      <td>“Ne kadar kaldığını biliyorum.”</td>
      <td>Belirsizlik azalır</td>
    </tr>
    <tr>
      <td>Oynanış ipuçları</td>
      <td>“Bu bilgiyi kullanabilirim.”</td>
      <td>Bekleme faydalı görünür</td>
    </tr>
    <tr>
      <td>Etkileşimli animasyon</td>
      <td>“Hâlâ bir şey yapıyorum.”</td>
      <td>Kontrol hissi artar</td>
    </tr>
    <tr>
      <td>Gizli yükleme koridoru</td>
      <td>“Dünyada ilerliyorum.”</td>
      <td>Yükleme fark edilmez</td>
    </tr>
  </tbody>
</table>

<h2 id="i̇lerleme-çubuğunun-küçük-oyunları">İlerleme çubuğunun küçük oyunları</h2>

<p>İlerleme çubukları her zaman yüklemenin gerçek hızını birebir göstermez. Dosyaların boyutu, disk hızı ve ağ gecikmesi değişken olduğu için doğrusal ilerleme üretmek zordur. Çubuğun uzun süre yüzde 99’da kalması özellikle sinir bozucudur; çünkü arayüz, bitiş sözü vermiş gibi görünür.</p>

<p>Daha dengeli bir gösterge için ölçülen ilerleme doğrudan ekrana verilmek yerine yumuşatılabilir:</p>

\[P_{yeni} = P_{eski} + \alpha(P_{gerçek} - P_{eski})\]

<p>$\alpha$ değeri 0 ile 1 arasındadır. Küçük değerler daha akıcı fakat daha yavaş tepki veren bir animasyon oluşturur. Aşağıdaki JavaScript örneği ani sıçramaları azaltır:</p>

<div class="language-javascript highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">let</span> <span class="nx">displayedProgress</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

<span class="kd">function</span> <span class="nf">updateLoading</span><span class="p">(</span><span class="nx">realProgress</span><span class="p">)</span> <span class="p">{</span>
  <span class="kd">const</span> <span class="nx">smoothing</span> <span class="o">=</span> <span class="mf">0.12</span><span class="p">;</span>
  <span class="nx">displayedProgress</span> <span class="o">+=</span>
    <span class="nx">smoothing</span> <span class="o">*</span> <span class="p">(</span><span class="nx">realProgress</span> <span class="o">-</span> <span class="nx">displayedProgress</span><span class="p">);</span>

  <span class="kd">const</span> <span class="nx">percent</span> <span class="o">=</span> <span class="nb">Math</span><span class="p">.</span><span class="nf">floor</span><span class="p">(</span><span class="nx">displayedProgress</span> <span class="o">*</span> <span class="mi">100</span><span class="p">);</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.progress-bar</span><span class="dl">"</span><span class="p">).</span><span class="nx">style</span><span class="p">.</span><span class="nx">width</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">percent</span><span class="p">}</span><span class="s2">%`</span><span class="p">;</span>
  <span class="nb">document</span><span class="p">.</span><span class="nf">querySelector</span><span class="p">(</span><span class="dl">"</span><span class="s2">.progress-label</span><span class="dl">"</span><span class="p">).</span><span class="nx">textContent</span> <span class="o">=</span> <span class="s2">`</span><span class="p">${</span><span class="nx">percent</span><span class="p">}</span><span class="s2">%`</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Kod, gerçek yükleme oranına bir anda atlamak yerine ona kademeli biçimde yaklaşır. Ancak gösterge kullanıcıyı kandırmamalıdır. Gerçek işlem tamamlanmadan yüzde 100 göstermek, kısa vadede hızlı görünse de güven kaybına yol açabilir.</p>

<h2 id="beklemeyi-oynanışa-dönüştürmek">Beklemeyi oynanışa dönüştürmek</h2>

<p>Bazı oyunlar yüklemeyi dar geçitler, asansör yolculukları veya yavaş açılan kapılar içine saklar. Oyuncu hareket etmeye devam ettiği için teknik bekleme, kurgu dünyasının parçası olur. Buna karşılık aynı numara çok sık kullanılırsa oyuncular “Bu asansör aslında yükleme ekranı” diyerek perdenin arkasını görmeye başlar.</p>

<p>Respawn süreleri de bilinçli biçimde tasarlanır. Anında yeniden doğmak cezayı anlamsızlaştırabilir; aşırı uzun beklemek ise öfke yaratır. Takım oyunlarında bekleme süresi, oyuncuya haritayı izleme ve strateji kurma fırsatı veriyorsa pasif ceza olmaktan çıkar.</p>

<p>Başarılı zaman manipülasyonunun amacı oyuncuyu aldatmak değil, beklemeyi anlaşılır ve tahmin edilebilir kılmaktır. Geri bildirim verin, belirsizliği azaltın, mümkünse küçük bir kontrol alanı sunun. Saat aynı hızda ilerlese de oyuncunun zihnindeki kronometre böylece çok daha insaflı çalışır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="kullanıcı deneyimi" /><category term="zaman algısı" /><category term="yükleme ekranları" /><category term="oyuncu psikolojisi" /><category term="game development" /><summary type="html"><![CDATA[Bir oyunda geçen 30 saniye her zaman 30 saniye gibi hissedilmez. Çatışmanın ortasında göz açıp kapayıncaya kadar geçen bu süre, boş bir yükleme ekranında küçük bir sonsuzluğa dönüşebilir. Çünkü oyuncunun sabrı yalnızca kronometreyle değil; dikkat, beklenti, kontrol hissi ve sunulan geri bildirimle yönetilir. İyi oyun tasarımı zamanı hızlandıramasa bile beynin onu nasıl yorumladığını ustalıkla değiştirebilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bir-dakika-mi-15.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bir-dakika-mi-15.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Genom Dizileme Verilerinin Biyoinformatik Analizi: Bazlardan Biyolojik Anlama</title><link href="https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama/" rel="alternate" type="text/html" title="Genom Dizileme Verilerinin Biyoinformatik Analizi: Bazlardan Biyolojik Anlama" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama</id><content type="html" xml:base="https://program.sonsuz.us/posts/genom-dizileme-verilerinin-biyoinformatik-analizi-bazlardan-biyolojik-anlama/"><![CDATA[<p><img src="/img/genom-dizileme-verilerinin-43.svg" alt="genom-dizileme-verilerinin-43" /></p>

<p>Modern dizileme cihazları tek bir deneyde milyarlarca DNA bazı üretebilir. Ancak cihazdan çıkan A, T, G ve C harfleri tek başına pek anlamlı değildir. Bu devasa yapbozu çözmek; kısa DNA parçalarını referans genoma yerleştirmeyi, farklılıkları bulmayı ve sonuçların güvenilirliğini ölçmeyi gerektirir. İşte biyoinformatik, moleküler biyoloji ile algoritmaların el sıkıştığı noktada devreye girer.
``</p>

<h2 id="ham-veriden-genoma-uzanan-yol">Ham veriden genoma uzanan yol</h2>

<p>Dizileme sonucu çoğunlukla <strong>FASTQ</strong> dosyaları elde edilir. Her okuma, yani <em>read</em>, bir DNA dizisiyle birlikte baz kalitesini belirten sayısal değerlere sahiptir. Phred kalite skoru şu ilişkiyle tanımlanır:</p>

\[Q = -10 \log_{10}(P)\]

<p>Buradaki $P$, bazın yanlış okunma olasılığıdır. Örneğin $Q=30$, yaklaşık $P=0.001$ hata olasılığına, yani %99,9 doğruluğa karşılık gelir. Analizin ilk aşamasında FastQC gibi araçlarla kalite dağılımı, GC oranı ve adaptör kalıntıları incelenir. Düşük kaliteli uçlar ve adaptörler temizlenmezse sonraki algoritmalar biyolojik olmayan eşleşmeler üretebilir.</p>

<h2 id="hizalama-neden-zordur">Hizalama neden zordur?</h2>

<p>İnsan genomu yaklaşık 3,2 milyar baz çifti içerir. Buna karşılık tipik bir kısa okuma yalnızca 100–150 baz uzunluğundadır. Üstelik genomda tekrar eden bölgeler, dizileme hataları, eklemeler ve silinmeler bulunur. Dolayısıyla amaç yalnızca aynı metni aramak değil, küçük farklılıklara izin veren en olası konumu bulmaktır.</p>

<p>İki diziyi karşılaştıran klasik dinamik programlama yaklaşımında genel süre karmaşıklığı $O(nm)$ seviyesindedir. Milyonlarca okumada bu maliyet kabul edilemez. Modern hizalayıcılar bu yüzden genomu indeksler ve yalnızca umut vadeden bölgeleri ayrıntılı olarak değerlendirir.</p>

<table>
  <thead>
    <tr>
      <th>Yaklaşım</th>
      <th>Temel fikir</th>
      <th>Güçlü yanı</th>
      <th>Sınırlaması</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Needleman–Wunsch</td>
      <td>Dizileri uçtan uca hizalar</td>
      <td>Küresel hizalamada kesin sonuç</td>
      <td>Büyük veride yavaş</td>
    </tr>
    <tr>
      <td>Smith–Waterman</td>
      <td>En iyi yerel bölgeyi arar</td>
      <td>Hassas eşleşme</td>
      <td>Yüksek hesaplama maliyeti</td>
    </tr>
    <tr>
      <td>Hash indeksleri</td>
      <td>Kısa kelimeleri konumlarla eşler</td>
      <td>Hızlı aday bulma</td>
      <td>Bellek tüketebilir</td>
    </tr>
    <tr>
      <td>BWT/FM-index</td>
      <td>Sıkıştırılmış genom indeksi kullanır</td>
      <td>Hız ve bellek dengesi</td>
      <td>Tekrar bölgelerinde belirsizlik</td>
    </tr>
    <tr>
      <td>De Bruijn grafı</td>
      <td>Okumaları $k$-mer bağlantılarıyla birleştirir</td>
      <td>Referanssız genom montajı</td>
      <td>Hatalara ve $k$ seçimine duyarlı</td>
    </tr>
  </tbody>
</table>

<p>BWA ve Bowtie2 gibi araçlar <strong>Burrows–Wheeler Dönüşümü</strong> ile oluşturulan FM-index yapısından yararlanır. Böylece referans genomun tamamını her okuma için baştan taramak yerine eşleşme aralığı hızlı biçimde daraltılır. Uzun okumalar için Minimap2, dizilerden seçilmiş temsilci parçaları kullanarak aday konumları bulur.</p>

<h2 id="küçük-bir-dizi-karşılaştırma-örneği">Küçük bir dizi karşılaştırma örneği</h2>

<p>Aşağıdaki Python kodu, iki eşit uzunluklu dizinin farklı olduğu konumları belirler. Gerçek hizalayıcıların yaptığı iş çok daha karmaşıktır; ancak varyant bulmanın temel fikrini gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">reference</span> <span class="o">=</span> <span class="sh">"</span><span class="s">ACGTTGCAACGT</span><span class="sh">"</span>
<span class="n">sample</span> <span class="o">=</span> <span class="sh">"</span><span class="s">ACGTCGCAATGT</span><span class="sh">"</span>

<span class="n">variants</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">position</span><span class="p">,</span> <span class="p">(</span><span class="n">ref_base</span><span class="p">,</span> <span class="n">sample_base</span><span class="p">)</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span>
    <span class="nf">zip</span><span class="p">(</span><span class="n">reference</span><span class="p">,</span> <span class="n">sample</span><span class="p">),</span> <span class="n">start</span><span class="o">=</span><span class="mi">1</span>
<span class="p">):</span>
    <span class="k">if</span> <span class="n">ref_base</span> <span class="o">!=</span> <span class="n">sample_base</span><span class="p">:</span>
        <span class="n">variants</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
            <span class="sh">"</span><span class="s">position</span><span class="sh">"</span><span class="p">:</span> <span class="n">position</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">reference</span><span class="sh">"</span><span class="p">:</span> <span class="n">ref_base</span><span class="p">,</span>
            <span class="sh">"</span><span class="s">sample</span><span class="sh">"</span><span class="p">:</span> <span class="n">sample_base</span>
        <span class="p">})</span>

<span class="k">for</span> <span class="n">variant</span> <span class="ow">in</span> <span class="n">variants</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">variant</span><span class="p">)</span>
</code></pre></div></div>

<p>Kod, referans ile örneği baz baz karşılaştırır ve değişen konumları kaydeder. Gerçek analizlerde GATK, FreeBayes veya DeepVariant gibi araçlar yalnızca harf farkına bakmaz; okuma derinliği, baz kalitesi ve hizalama güvenini de hesaba katar.</p>

<p>Bir varyantın destek oranı kabaca $f = a/d$ ile ifade edilebilir. Burada $a$ alternatif bazı destekleyen okuma sayısı, $d$ ise toplam kapsama derinliğidir. Örneğin 40 okumanın 20’si farklı bazı taşıyorsa $f=0.5$ olur; bu durum diploid bir genomda heterozigot varyanta işaret edebilir.</p>

<h2 id="sonuçların-biyolojik-yorumu">Sonuçların biyolojik yorumu</h2>

<p>Hizalama sonrasında SAM/BAM dosyaları düzenlenir, yinelenen okumalar işaretlenir ve varyantlar VCF biçiminde raporlanır. Ardından bulunan değişikliklerin genleri, proteinleri veya hastalık riskini etkileyip etkilemediği araştırılır. En hızlı algoritma bile kötü kaliteli veriyle güvenilir biyoloji üretemez. Bu nedenle genom analizi; doğru indeksleme, istatistiksel değerlendirme, kalite kontrolü ve biyolojik yorumun birlikte yürütüldüğü dikkatli bir süreçtir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="biyoinformatik" /><category term="genomik" /><category term="dna" /><category term="dizileme" /><category term="algoritma" /><category term="python" /><summary type="html"><![CDATA[Modern dizileme cihazları tek bir deneyde milyarlarca DNA bazı üretebilir. Ancak cihazdan çıkan A, T, G ve C harfleri tek başına pek anlamlı değildir. Bu devasa yapbozu çözmek; kısa DNA parçalarını referans genoma yerleştirmeyi, farklılıkları bulmayı ve sonuçların güvenilirliğini ölçmeyi gerektirir. İşte biyoinformatik, moleküler biyoloji ile algoritmaların el sıkıştığı noktada devreye girer.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/genom-dizileme-verilerinin-43.png" /><media:content medium="image" url="https://program.sonsuz.us/img/genom-dizileme-verilerinin-43.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Görünmez Öğretmen: Oyun Tasarımında Zımni Öğretim</title><link href="https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim/" rel="alternate" type="text/html" title="Görünmez Öğretmen: Oyun Tasarımında Zımni Öğretim" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim</id><content type="html" xml:base="https://program.sonsuz.us/posts/gorunmez-ogretmen-oyun-tasariminda-zimni-ogretim/"><![CDATA[<p>Bir oyun size ekrana kocaman bir pencere açıp “Zıplamak için Space tuşuna bas!” demeden zıplamayı öğretebilir mi? Elbette. Hatta iyi tasarlanmış bir oyun, kurallarını açıktan anlatmak yerine merakınızı, çevreyi okuma yeteneğinizi ve deneme isteğinizi kullanır. İşte oyuncunun farkında olmadan öğrendiği bu yaklaşım, <strong>zımni öğretim</strong> veya İngilizce adıyla <em>implicit tutorial</em> olarak bilinir.</p>

<p><img src="/img/gorunmez-ogretmen-oyun-29.svg" alt="gorunmez-ogretmen-oyun-29" /></p>

<p>``</p>
<h2 id="zımni-öğretim-nedir">Zımni öğretim nedir?</h2>

<p>Zımni öğretim, oyunun mekaniklerini metin kutuları veya uzun açıklamalar yerine <strong>seviye düzeni, görsel ipuçları, güvenli deneyler ve sonuçlar</strong> aracılığıyla öğretmesidir. Tasarımcı oyuncuya doğrudan ne yapacağını söylemez; doğru davranışı keşfedebileceği kontrollü bir durum hazırlar.</p>

<p>Bu yaklaşımın temel döngüsü şöyle modellenebilir:</p>

\[Gözlem \rightarrow Deneme \rightarrow Geri\ Bildirim \rightarrow Öğrenme\]

<p>Örneğin oyuncunun önüne küçük bir çukur yerleştirilir. İlerlemek için zıplaması gerekir; fakat çukur ölümcül değildir. Oyuncu düşse bile kolayca geri çıkabilir. Böylece oyun hem zıplama gereksinimini gösterir hem de hata yapmayı cezalandırmadan denemeye izin verir.</p>

<h2 id="açık-ve-zımni-öğretimin-farkı">Açık ve zımni öğretimin farkı</h2>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Açık öğretim</th>
      <th>Zımni öğretim</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bilgi aktarımı</td>
      <td>Metin, ses veya tuş göstergesi</td>
      <td>Seviye ve çevre düzeni</td>
    </tr>
    <tr>
      <td>Oyuncunun rolü</td>
      <td>Talimatı uygulamak</td>
      <td>Kuralı keşfetmek</td>
    </tr>
    <tr>
      <td>Akışa etkisi</td>
      <td>Oyunu durdurabilir</td>
      <td>Oynanışla bütünleşir</td>
    </tr>
    <tr>
      <td>Hatırlanabilirlik</td>
      <td>Okunan bilgi unutulabilir</td>
      <td>Deneyimlenen bilgi daha kalıcıdır</td>
    </tr>
    <tr>
      <td>Risk</td>
      <td>Bilgi bombardımanı</td>
      <td>İpucunun anlaşılmaması</td>
    </tr>
  </tbody>
</table>

<p>Zımni öğretim her durumda üstün değildir. Karmaşık envanter sistemleri veya erişilebilirlik seçenekleri açık açıklamalar gerektirebilir. İyi tasarım, iki yaklaşımı rakip değil tamamlayıcı araçlar olarak görür.</p>

<h2 id="seviye-tasarımı-nasıl-öğretmene-dönüşür">Seviye tasarımı nasıl öğretmene dönüşür?</h2>

<p>İlk yöntem <strong>odak yönetimidir</strong>. Işık, renk, hareket ve mimari çizgiler oyuncunun bakışını önemli noktaya taşır. Karanlık bir koridordaki tek parlak kapı, üzerinde “Buraya git” yazmasa da oldukça konuşkandır.</p>

<p>İkinci yöntem, yeni mekaniği güvenli bir ortamda tanıtmaktır. Oyuncu patlayan bir varili ilk kez düşmansız bir odada görürse ona ateş ederek sonucunu inceleyebilir. Daha sonra aynı varil düşmanların yanında kullanıldığında oyuncu bağlantıyı kendisi kurar.</p>

<p>Öğrenme başarısını basitçe şu şekilde düşünebiliriz:</p>

\[Öğrenme = İpucuNetliği \times DenemeFırsatı \times GeriBildirimGücü\]

<p>Çarpanlardan biri sıfıra yaklaşırsa öğretim de zayıflar. Parlayan bir nesne dikkat çekebilir; ancak oyuncu onunla etkileşime giremiyorsa anlamlı öğrenme oluşmaz.</p>

<h2 id="küçük-bir-tasarım-örneği">Küçük bir tasarım örneği</h2>

<p>Bir platform oyununda duvardan zıplama mekaniğini tanıttığımızı varsayalım. Seviyenin davranışı aşağıdaki sözde kodla ifade edilebilir:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>oyuncu öğretim_odasına_girince:
    çıkışı yüksek bir noktaya yerleştir
    iki zıplanabilir duvarı karşılıklı konumlandır
    düşülen zemini güvenli yap

oyuncu duvara temas edince:
    karakteri kısa süre duvara tutundur
    görsel parçacık ve ses geri bildirimi üret

oyuncu çıkışa ulaşınca:
    aynı mekaniği düşük riskli bir engelde tekrar kullan
</code></pre></div></div>

<p>Bu kod gerçek bir oyun motoruna bağlı değildir; tasarımın mantığını gösterir. Yüksek çıkış hedefi belirler, karşılıklı duvarlar çözüm alanını sınırlar, güvenli zemin ise korkmadan denemeyi sağlar. Parçacık ve ses, duvarın özel bir davranış sunduğunu bildirir.</p>

<h2 id="tasarımcının-görünmez-eli">Tasarımcının görünmez eli</h2>

<p>Başarılı bir zımni öğretimde oyuncu “Tasarımcı bana bunu öğretti” demez; “Ben bunu çözdüm!” der. Bu sahiplenme duygusu motivasyonu artırır. Ancak ipuçları fazla belirgin olursa keşif hissi kaybolur, fazla belirsiz olursa oyuncu sıkışır.</p>

<p>Bu nedenle iyi bir seviye önce mekaniği <strong>gösterir</strong>, sonra güvenle <strong>denetir</strong>, ardından farklı bir bağlamda <strong>sınar</strong>. Oyuncu kuralları okumak yerine yaşar. Görünmez öğretmenin en büyük başarısı da ders verdiğini hiç belli etmemesidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="oyun tasarımı" /><category term="seviye tasarımı" /><category term="zımni öğretim" /><category term="oyuncu deneyimi" /><category term="game design" /><category term="çevresel anlatım" /><summary type="html"><![CDATA[Bir oyun size ekrana kocaman bir pencere açıp “Zıplamak için Space tuşuna bas!” demeden zıplamayı öğretebilir mi? Elbette. Hatta iyi tasarlanmış bir oyun, kurallarını açıktan anlatmak yerine merakınızı, çevreyi okuma yeteneğinizi ve deneme isteğinizi kullanır. İşte oyuncunun farkında olmadan öğrendiği bu yaklaşım, zımni öğretim veya İngilizce adıyla implicit tutorial olarak bilinir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/gorunmez-ogretmen-oyun-29.png" /><media:content medium="image" url="https://program.sonsuz.us/img/gorunmez-ogretmen-oyun-29.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Hücresel Otomata ile Kentsel Büyüme Modellemesi</title><link href="https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi/" rel="alternate" type="text/html" title="Hücresel Otomata ile Kentsel Büyüme Modellemesi" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi</id><content type="html" xml:base="https://program.sonsuz.us/posts/hucresel-otomata-ile-kentsel-buyume-modellemesi/"><![CDATA[<p>Şehirler bazen planlı caddelerle, bazen de “Şuraya da bir bina konduralım!” yaklaşımıyla büyür. Gerçek kentsel gelişim ekonomi, ulaşım, nüfus ve coğrafya gibi pek çok değişkene bağlıdır. Yine de yalnızca karelerden ve birkaç komşuluk kuralından yararlanarak şaşırtıcı derecede gerçekçi büyüme desenleri üretebiliriz. Bunun için kullanacağımız araç, hücresel otomata modelidir.
``</p>

<h2 id="hücresel-otomata-nedir">Hücresel otomata nedir?</h2>

<p>Hücresel otomata, uzayı hücrelerden oluşan bir ızgaraya bölen ayrık bir modeldir. Her hücre belirli bir durumda bulunur ve bir sonraki zaman adımındaki durumu, kendi mevcut durumuna ve komşularına göre hesaplanır.</p>

<p>Kentsel büyüme modelinde hücreler arazi parçalarını temsil edebilir:</p>

<table>
  <thead>
    <tr>
      <th style="text-align: right">Hücre değeri</th>
      <th>Arazi türü</th>
      <th>Büyüyebilir mi?</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: right">0</td>
      <td>Boş arazi</td>
      <td>Evet</td>
    </tr>
    <tr>
      <td style="text-align: right">1</td>
      <td>Kentsel alan</td>
      <td>Zaten gelişmiş</td>
    </tr>
    <tr>
      <td style="text-align: right">2</td>
      <td>Su veya koruma alanı</td>
      <td>Hayır</td>
    </tr>
  </tbody>
</table>

<p>En yaygın iki komşuluk yaklaşımı şunlardır:</p>

<table>
  <thead>
    <tr>
      <th>Komşuluk</th>
      <th style="text-align: right">Hücre sayısı</th>
      <th>Özellik</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Von Neumann</td>
      <td style="text-align: right">4</td>
      <td>Yalnızca yatay ve dikey komşular</td>
    </tr>
    <tr>
      <td>Moore</td>
      <td style="text-align: right">8</td>
      <td>Çapraz hücreler dâhil tüm çevre</td>
    </tr>
  </tbody>
</table>

<p>Moore komşuluğu, şehrin daha yuvarlak ve yaygın biçimde büyümesine izin verir. Von Neumann komşuluğu ise daha köşeli desenler oluşturabilir.</p>

<h2 id="büyüme-kuralını-kurmak">Büyüme kuralını kurmak</h2>

<p>Boş bir hücrenin kentleşme olasılığını, çevresindeki kentsel hücrelerin oranıyla ilişkilendirebiliriz. Hücrenin sekiz komşusundan $n$ tanesi kentleşmişse temel olasılık şöyle tanımlanabilir:</p>

\[P = b + w(n / 8)\]

<p>Burada $b$ kendiliğinden büyüme olasılığı, $w$ ise komşuluk etkisinin ağırlığıdır. Örneğin $b=0.01$ ve $w=0.6$ olduğunda, mevcut şehre yakın araziler daha hızlı yapılaşırken uzakta küçük uydu yerleşimler de doğabilir. Olasılığın 1’i aşmaması için $P = min(1, P)$ kullanılır.</p>

<p>Bu basit denklem önemli bir fikri yakalar: Kentsel alanlar altyapı, ulaşım ve hizmetlere yakınlık nedeniyle çoğunlukla mevcut yerleşimlerin çevresinde gelişir.</p>

<h2 id="python-ile-küçük-bir-simülasyon">Python ile küçük bir simülasyon</h2>

<p>Aşağıdaki kod, 50x50 hücrelik bir haritada Moore komşuluğunu kullanarak büyümeyi simüle eder:</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="kn">import</span> <span class="n">matplotlib.pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="n">size</span> <span class="o">=</span> <span class="mi">50</span>
<span class="n">city</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="n">size</span><span class="p">,</span> <span class="n">size</span><span class="p">),</span> <span class="n">dtype</span><span class="o">=</span><span class="nb">int</span><span class="p">)</span>
<span class="n">city</span><span class="p">[</span><span class="mi">24</span><span class="p">:</span><span class="mi">27</span><span class="p">,</span> <span class="mi">24</span><span class="p">:</span><span class="mi">27</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>  <span class="c1"># Başlangıçtaki kent merkezi
</span>
<span class="n">base_probability</span> <span class="o">=</span> <span class="mf">0.01</span>
<span class="n">neighbor_weight</span> <span class="o">=</span> <span class="mf">0.60</span>

<span class="k">def</span> <span class="nf">step</span><span class="p">(</span><span class="n">grid</span><span class="p">):</span>
    <span class="n">new_grid</span> <span class="o">=</span> <span class="n">grid</span><span class="p">.</span><span class="nf">copy</span><span class="p">()</span>

    <span class="k">for</span> <span class="n">row</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
        <span class="k">for</span> <span class="n">col</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">size</span> <span class="o">-</span> <span class="mi">1</span><span class="p">):</span>
            <span class="k">if</span> <span class="n">grid</span><span class="p">[</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">]</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">:</span>
                <span class="k">continue</span>

            <span class="n">neighborhood</span> <span class="o">=</span> <span class="n">grid</span><span class="p">[</span><span class="n">row</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span><span class="n">row</span><span class="o">+</span><span class="mi">2</span><span class="p">,</span> <span class="n">col</span><span class="o">-</span><span class="mi">1</span><span class="p">:</span><span class="n">col</span><span class="o">+</span><span class="mi">2</span><span class="p">]</span>
            <span class="n">urban_neighbors</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">count_nonzero</span><span class="p">(</span><span class="n">neighborhood</span> <span class="o">==</span> <span class="mi">1</span><span class="p">)</span>
            <span class="n">probability</span> <span class="o">=</span> <span class="nf">min</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="n">base_probability</span> <span class="o">+</span>
                              <span class="n">neighbor_weight</span> <span class="o">*</span> <span class="n">urban_neighbors</span> <span class="o">/</span> <span class="mi">8</span><span class="p">)</span>

            <span class="k">if</span> <span class="n">np</span><span class="p">.</span><span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">probability</span><span class="p">:</span>
                <span class="n">new_grid</span><span class="p">[</span><span class="n">row</span><span class="p">,</span> <span class="n">col</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>

    <span class="k">return</span> <span class="n">new_grid</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="mi">30</span><span class="p">):</span>
    <span class="n">city</span> <span class="o">=</span> <span class="nf">step</span><span class="p">(</span><span class="n">city</span><span class="p">)</span>

<span class="n">plt</span><span class="p">.</span><span class="nf">imshow</span><span class="p">(</span><span class="n">city</span><span class="p">,</span> <span class="n">cmap</span><span class="o">=</span><span class="sh">'</span><span class="s">Greys</span><span class="sh">'</span><span class="p">,</span> <span class="n">interpolation</span><span class="o">=</span><span class="sh">'</span><span class="s">nearest</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">title</span><span class="p">(</span><span class="sh">'</span><span class="s">30 Adım Sonra Kentsel Yayılım</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">axis</span><span class="p">(</span><span class="sh">'</span><span class="s">off</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><code class="language-plaintext highlighter-rouge">step</code> fonksiyonu her boş araziyi inceler, kentleşmiş komşuları sayar ve hesaplanan olasılığa göre hücrenin durumunu değiştirir. Güncelleme sırasında ayrı bir kopya kullanılması kritiktir; aksi hâlde aynı turda yeni kentleşen hücreler hemen komşularını etkiler ve zaman mantığı bozulur.</p>

<h2 id="modeli-daha-gerçekçi-yapmak">Modeli daha gerçekçi yapmak</h2>

<p>Basit modeli yükselti, yol ve koruma alanı katmanlarıyla geliştirebiliriz. Bir hücrenin toplam uygunluğu örneğin $S = 0.5N + 0.3R - 0.2E$ biçiminde hesaplanabilir. Burada $N$ komşuluk etkisini, $R$ yola yakınlığı, $E$ ise eğim maliyetini temsil eder.</p>

<p>Farklı parametrelerle çok sayıda deney yapmak, tek bir kesin gelecek üretmekten daha değerlidir. Çünkü model bir kehanet makinesi değil, “Bu kurallar geçerliyse ne olabilir?” sorusuna cevap veren bir düşünme laboratuvarıdır. Birkaç satırlık kodla plansız yayılımı, uydu kentleri veya koruma politikalarının etkisini karşılaştırabilir; şehirlerin karmaşık görünümünün basit yerel kararlardan nasıl doğabildiğini gözlemleyebilirsiniz.</p>

<p><img src="/img/hucresel-otomata-ile-80.svg" alt="hucresel-otomata-ile-80" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Proje" /><category term="hücresel otomata" /><category term="kentsel büyüme" /><category term="python" /><category term="simülasyon" /><category term="modelleme" /><category term="şehir planlama" /><summary type="html"><![CDATA[Şehirler bazen planlı caddelerle, bazen de “Şuraya da bir bina konduralım!” yaklaşımıyla büyür. Gerçek kentsel gelişim ekonomi, ulaşım, nüfus ve coğrafya gibi pek çok değişkene bağlıdır. Yine de yalnızca karelerden ve birkaç komşuluk kuralından yararlanarak şaşırtıcı derecede gerçekçi büyüme desenleri üretebiliriz. Bunun için kullanacağımız araç, hücresel otomata modelidir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/hucresel-otomata-ile-80.png" /><media:content medium="image" url="https://program.sonsuz.us/img/hucresel-otomata-ile-80.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Robotik Cerrahinin Perde Arkası: Ameliyat Robotlarını Yöneten Algoritmalar</title><link href="https://program.sonsuz.us/posts/robotik-cerrahinin-perde-arkasi-ameliyat-robotlarini-yoneten-algoritmalar/" rel="alternate" type="text/html" title="Robotik Cerrahinin Perde Arkası: Ameliyat Robotlarını Yöneten Algoritmalar" /><published>2026-10-27T00:00:00+00:00</published><updated>2026-10-27T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/robotik-cerrahinin-perde-arkasi-ameliyat-robotlarini-yoneten-algoritmalar</id><content type="html" xml:base="https://program.sonsuz.us/posts/robotik-cerrahinin-perde-arkasi-ameliyat-robotlarini-yoneten-algoritmalar/"><![CDATA[<p>Robotik cerrahi dendiğinde gözümüzde ameliyatı tek başına yapan metal bir doktor canlanabilir. Gerçekte günümüzde kullanılan sistemlerin çoğu, cerrahın el hareketlerini hassas biçimde robot kollarına aktaran gelişmiş teleoperasyon platformlarıdır. Cerrah karar verir; robot ise bu kararı filtreleme, kinematik, kontrol ve güvenlik algoritmaları yardımıyla mikrometre düzeyinde harekete dönüştürür.
``</p>

<h2 id="hareketin-başlangıç-noktası-teleoperasyon">Hareketin başlangıç noktası: teleoperasyon</h2>

<p>Cerrah, konsoldaki kumandaları hareket ettirdiğinde sensörler konum, yönelim ve hız verilerini ölçer. Bu ham veriler doğrudan motora gönderilmez. Çünkü insan eli doğal olarak titrer, sensörlerde gürültü bulunur ve cerrahın geniş hareketlerinin hastanın içinde çok daha küçük hareketlere çevrilmesi gerekir.</p>

<p>Örneğin kumanda 5 santimetre hareket ettirilirken cerrahi aletin yalnızca 1 santimetre ilerlemesi istenebilir. Ölçekleme basitçe</p>

\[x_r = s x_c\]

<p>ile ifade edilebilir. Burada $x_c$ cerrahın hareketi, $x_r$ robotun hedef hareketi, $s$ ise ölçek katsayısıdır. $s=0.2$ olduğunda robot, cerrahın hareketinin beşte birini uygular.</p>

<table>
  <thead>
    <tr>
      <th>Algoritma katmanı</th>
      <th>Görevi</th>
      <th>Günlük hayattaki benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Sinyal filtreleme</td>
      <td>Titreme ve sensör gürültüsünü azaltır</td>
      <td>Kameradaki görüntü sabitleme</td>
    </tr>
    <tr>
      <td>Ters kinematik</td>
      <td>Alet hedefini eklem açılarına çevirir</td>
      <td>Eli uzatırken dirseği ayarlamak</td>
    </tr>
    <tr>
      <td>Hareket planlama</td>
      <td>Güvenli bir yol üretir</td>
      <td>Navigasyonun rota çizmesi</td>
    </tr>
    <tr>
      <td>Kontrol algoritması</td>
      <td>Motorları hedefte tutar</td>
      <td>Aracın hız sabitleyicisi</td>
    </tr>
    <tr>
      <td>Güvenlik denetimi</td>
      <td>Yasak hareketleri engeller</td>
      <td>Sanal güvenlik bariyeri</td>
    </tr>
  </tbody>
</table>

<h2 id="ters-kinematik-robot-kolu-nasıl-bükülecek">Ters kinematik: Robot kolu nasıl bükülecek?</h2>

<p>Cerrah alet ucunun nereye gitmesini istediğini belirtir; fakat robotun motorları doğrudan Kartezyen koordinatlarla çalışmaz. Her eklemin hangi açıya gelmesi gerektiği hesaplanmalıdır. İleri kinematikte eklem değerlerinden uç konumu bulunur:</p>

\[p = f(q)\]

<p>Ters kinematikte ise hedef konumdan eklem değerleri aranır:</p>

\[q = f^{-1}(p)\]

<p>Buradaki zorluk, aynı noktaya birden fazla eklem düzeniyle ulaşılabilmesi veya bazı hedeflerin fiziksel olarak erişilemez olmasıdır. Sayısal çözücüler, Jacobian matrisi üzerinden küçük eklem değişimlerini hesaplar: $v = J(q)\dot{q}$. Sistem ayrıca eklem sınırlarını, çarpışma riskini ve cerrahi aletin giriş noktasını korumak zorundadır.</p>

<h2 id="pid-ve-kuvvet-kontrolü">PID ve kuvvet kontrolü</h2>

<p>Hedef eklem açısı bulunduktan sonra motorların bu hedefi düzgün izlemesi gerekir. En yaygın yaklaşımlardan biri PID kontroldür:</p>

\[u(t)=K_p e(t)+K_i\int e(t)dt+K_d\frac{de(t)}{dt}\]

<p>Oransal terim mevcut hataya tepki verir, integral terimi kalıcı sapmayı azaltır, türev terimi ise ani değişimleri frenler. Daha karmaşık sistemlerde model öngörülü kontrol, empedans kontrolü ve kuvvet geri bildirimi kullanılır. Empedans kontrolü, robotun dokuyla temas ederken taş gibi katı davranması yerine kontrollü bir esneklik göstermesini sağlar.</p>

<p>Aşağıdaki sade Python örneği, tek eksenli bir PID denetleyicinin hedef konuma yaklaşmasını gösterir:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">PID</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">kp</span><span class="p">,</span> <span class="n">ki</span><span class="p">,</span> <span class="n">kd</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">kp</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">ki</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="n">kd</span> <span class="o">=</span> <span class="n">kp</span><span class="p">,</span> <span class="n">ki</span><span class="p">,</span> <span class="n">kd</span>
        <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">=</span> <span class="mf">0.0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span> <span class="o">=</span> <span class="mf">0.0</span>

    <span class="k">def</span> <span class="nf">update</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">target</span><span class="p">,</span> <span class="n">position</span><span class="p">,</span> <span class="n">dt</span><span class="p">):</span>
        <span class="n">error</span> <span class="o">=</span> <span class="n">target</span> <span class="o">-</span> <span class="n">position</span>
        <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">+=</span> <span class="n">error</span> <span class="o">*</span> <span class="n">dt</span>
        <span class="n">derivative</span> <span class="o">=</span> <span class="p">(</span><span class="n">error</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span><span class="p">)</span> <span class="o">/</span> <span class="n">dt</span>
        <span class="n">self</span><span class="p">.</span><span class="n">previous_error</span> <span class="o">=</span> <span class="n">error</span>
        <span class="k">return</span> <span class="n">self</span><span class="p">.</span><span class="n">kp</span> <span class="o">*</span> <span class="n">error</span> <span class="o">+</span> <span class="n">self</span><span class="p">.</span><span class="n">ki</span> <span class="o">*</span> <span class="n">self</span><span class="p">.</span><span class="n">integral</span> <span class="o">+</span> <span class="n">self</span><span class="p">.</span><span class="n">kd</span> <span class="o">*</span> <span class="n">derivative</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">update</code> metodunun ürettiği değer motor komutu olarak düşünülebilir. Gerçek ameliyat robotlarında buna tork sınırları, sensör doğrulama, gecikme telafisi ve acil durdurma kontrolleri eklenir.</p>

<h2 id="yapay-zeka-ameliyatı-devralıyor-mu">Yapay zeka ameliyatı devralıyor mu?</h2>

<p>Makine öğrenmesi; anatomik yapıların görüntüde işaretlenmesi, alet takibi, dikiş aşamalarının tanınması ve riskli bölgelerin belirlenmesi için kullanılabilir. Ancak öğrenen modellerin tahminleri belirsizlik taşıdığı için kritik hareket kontrolü genellikle doğrulanabilir, deterministik algoritmalara bırakılır.</p>

<p>Robotik cerrahinin gerçek gücü tek bir “süper algoritmadan” değil; filtreleme, kinematik, kontrol, görüntü işleme ve güvenlik katmanlarının milisaniyeler içinde birlikte çalışmasından gelir. Robot yorulmaz ve titremeyi azaltır; fakat hedefi, stratejiyi ve klinik kararı hâlâ insan belirler.</p>

<p><img src="/img/robotik-cerrahinin-perde-39.svg" alt="robotik-cerrahinin-perde-39" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="robotik cerrahi" /><category term="algoritma" /><category term="kontrol sistemleri" /><category term="ters kinematik" /><category term="yapay zeka" /><category term="robotik" /><summary type="html"><![CDATA[Robotik cerrahi dendiğinde gözümüzde ameliyatı tek başına yapan metal bir doktor canlanabilir. Gerçekte günümüzde kullanılan sistemlerin çoğu, cerrahın el hareketlerini hassas biçimde robot kollarına aktaran gelişmiş teleoperasyon platformlarıdır. Cerrah karar verir; robot ise bu kararı filtreleme, kinematik, kontrol ve güvenlik algoritmaları yardımıyla mikrometre düzeyinde harekete dönüştürür.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/robotik-cerrahinin-perde-39.png" /><media:content medium="image" url="https://program.sonsuz.us/img/robotik-cerrahinin-perde-39.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Akıllı Tarımda Edge Computing: Tarlanın Kendi Beyni</title><link href="https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni/" rel="alternate" type="text/html" title="Akıllı Tarımda Edge Computing: Tarlanın Kendi Beyni" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni</id><content type="html" xml:base="https://program.sonsuz.us/posts/akilli-tarimda-edge-computing-tarlanin-kendi-beyni/"><![CDATA[<p><img src="/img/akilli-tarimda-edge-45.svg" alt="akilli-tarimda-edge-45" /></p>

<p>Toprak nemini ölçen bir sensörün karar vermek için kilometrelerce uzaktaki bulut sunucusunu beklediğini düşünün. Bu sırada bağlantı kesilir, yanıt gecikir ve susuz kalan domatesler sessizce dram yaşar! Edge computing, sensör verisini doğrudan tarladaki ağ geçidi, mikrodenetleyici veya mini bilgisayar üzerinde işleyerek bu sorunu çözer. Böylece tarımsal sistemler daha hızlı, dayanıklı ve ekonomik hâle gelir.</p>

<p>``</p>

<h2 id="edge-computing-nedir">Edge computing nedir?</h2>

<p>Geleneksel IoT mimarisinde sensörlerden alınan ham veriler internete aktarılır, bulutta analiz edilir ve sonuç tekrar sahadaki cihaza gönderilir. Edge computing yaklaşımında ise hesaplama, verinin üretildiği noktaya mümkün olduğunca yaklaştırılır. Bir Raspberry Pi, endüstriyel ağ geçidi veya yapay zekâ destekli kamera bu “kenar” görevini üstlenebilir.</p>

<p>Bir sulama kararının toplam gecikmesini basitçe şöyle gösterebiliriz:</p>

\[T_{toplam} = T_{iletim} + T_{işleme} + T_{yanıt}\]

<p>Bulut tabanlı yapıda iletim ve yanıt süreleri internet kalitesine bağlıdır. Edge cihazında ise veri yerel işlendiği için $T_{iletim}$ büyük ölçüde azalır. Milisaniyelerin kritik olduğu don, yangın veya hayvan hareketi tespiti gibi senaryolarda bu fark oldukça önemlidir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>Bulut bilişim</th>
      <th>Edge computing</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Gecikme</td>
      <td>İnternet bağlantısına bağlı</td>
      <td>Genellikle çok düşük</td>
    </tr>
    <tr>
      <td>Bant genişliği</td>
      <td>Ham veri nedeniyle yüksek</td>
      <td>Özet veriyle düşük</td>
    </tr>
    <tr>
      <td>Çevrimdışı çalışma</td>
      <td>Sınırlı</td>
      <td>Büyük ölçüde mümkün</td>
    </tr>
    <tr>
      <td>Veri mahremiyeti</td>
      <td>Veri dış sunucuya gider</td>
      <td>Veri sahada tutulabilir</td>
    </tr>
    <tr>
      <td>İşlem kapasitesi</td>
      <td>Çok yüksek</td>
      <td>Donanıma göre sınırlı</td>
    </tr>
  </tbody>
</table>

<h2 id="tarlada-veri-nasıl-işlenir">Tarlada veri nasıl işlenir?</h2>

<p>Bir akıllı sulama sisteminde nem, sıcaklık ve yağış sensörleri belirli aralıklarla ölçüm yapar. Edge cihazı önce hatalı okumaları filtreler, ardından eşik veya makine öğrenmesi modeline göre karar verir. Yalnızca günlük ortalamalar, uyarılar ve cihaz sağlık bilgileri buluta gönderilir.</p>

<p>Örneğin, nem sensöründeki ani sıçramaları yumuşatmak için hareketli ortalama kullanılabilir:</p>

\[\bar{x}_t = \frac{1}{n}\sum_{i=0}^{n-1}x_{t-i}\]

<p>Burada $n$, dikkate alınan son ölçüm sayısıdır. Bu yöntem, tek bir hatalı değerin sulama pompasını gereksiz yere çalıştırmasını önler.</p>

<p>Aşağıdaki Python kodu, beş nem ölçümünün ortalamasını hesaplayıp yerel bir sulama kararı üretir:</p>

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

<span class="n">NEM_ESIGI</span> <span class="o">=</span> <span class="mi">35</span>


<span class="k">def</span> <span class="nf">sulama_karari</span><span class="p">(</span><span class="n">olcumler</span><span class="p">,</span> <span class="n">yagmur_bekleniyor</span><span class="o">=</span><span class="bp">False</span><span class="p">):</span>
    <span class="n">filtrelenmis_nem</span> <span class="o">=</span> <span class="nf">mean</span><span class="p">(</span><span class="n">olcumler</span><span class="p">[</span><span class="o">-</span><span class="mi">5</span><span class="p">:])</span>

    <span class="k">if</span> <span class="n">filtrelenmis_nem</span> <span class="o">&lt;</span> <span class="n">NEM_ESIGI</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">yagmur_bekleniyor</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">"</span><span class="s">Pompayı çalıştır</span><span class="sh">"</span>
    <span class="k">return</span> <span class="sh">"</span><span class="s">Sulama gerekmiyor</span><span class="sh">"</span>

<span class="n">nem_verileri</span> <span class="o">=</span> <span class="p">[</span><span class="mi">37</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">31</span><span class="p">]</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">sulama_karari</span><span class="p">(</span><span class="n">nem_verileri</span><span class="p">))</span>
</code></pre></div></div>

<p>Kod, son beş değeri kullanarak sensör gürültüsünün etkisini azaltır. Gerçek sistemde sonuç bir röle üzerinden pompayı kontrol edebilir. Yağış tahmini önceden edge cihazına aktarılmışsa gereksiz sulama da engellenir.</p>

<h2 id="yapay-zekâ-tarlanın-kenarına-taşınırsa">Yapay zekâ tarlanın kenarına taşınırsa</h2>

<p>Edge cihazları yalnızca eşik kontrolü yapmaz. Sıkıştırılmış görüntü sınıflandırma modelleriyle yaprak hastalıkları, yabancı otlar veya zararlılar kameradan tespit edilebilir. Kamera görüntüsünün tamamını buluta göndermek yerine yalnızca “üç bitkide hastalık şüphesi var” sonucu iletilir. Bu yaklaşım hem bant genişliğini hem de depolama maliyetini düşürür.</p>

<p>Ancak edge donanımının enerji, bellek ve işlem gücü sınırlıdır. Model küçültme, niceleme ve uyku modları bu nedenle önem kazanır. Güneş paneliyle çalışan bir cihazda doğruluk kadar enerji tüketimi de başarı ölçütüdür:</p>

\[Verim = \frac{Doğru\ karar\ sayısı}{Tüketilen\ enerji}\]

<h2 id="hibrit-yaklaşım-en-güçlü-seçenek">Hibrit yaklaşım en güçlü seçenek</h2>

<p>Edge computing bulutun rakibi değil, tamamlayıcısıdır. Anlık sulama ve alarm kararları sahada alınırken uzun dönemli verim analizi, model eğitimi ve filo yönetimi bulutta gerçekleştirilebilir. Sonuçta çiftçi bağlantı kesilse bile çalışan, kritik veriye hızlı tepki veren ve internet faturasını kabartmayan bir sisteme sahip olur. Kısacası tarla yalnızca ürün değil, karar da üretmeye başlar.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="akıllı tarım" /><category term="edge computing" /><category term="nesnelerin interneti" /><category term="sensörler" /><category term="yapay zeka" /><category term="iot" /><summary type="html"><![CDATA[Toprak nemini ölçen bir sensörün karar vermek için kilometrelerce uzaktaki bulut sunucusunu beklediğini düşünün. Bu sırada bağlantı kesilir, yanıt gecikir ve susuz kalan domatesler sessizce dram yaşar! Edge computing, sensör verisini doğrudan tarladaki ağ geçidi, mikrodenetleyici veya mini bilgisayar üzerinde işleyerek bu sorunu çözer. Böylece tarımsal sistemler daha hızlı, dayanıklı ve ekonomik hâle gelir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/akilli-tarimda-edge-45.png" /><media:content medium="image" url="https://program.sonsuz.us/img/akilli-tarimda-edge-45.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Bilgisayarlı Tomografinin Matematiği: Vücudun İçini Kesit Kesit Yeniden Oluşturmak</title><link href="https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak/" rel="alternate" type="text/html" title="Bilgisayarlı Tomografinin Matematiği: Vücudun İçini Kesit Kesit Yeniden Oluşturmak" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak</id><content type="html" xml:base="https://program.sonsuz.us/posts/bilgisayarli-tomografinin-matematigi-vucudun-icini-kesit-kesit-yeniden-olusturmak/"><![CDATA[<p>Bir bilgisayarlı tomografi cihazı, vücudun içine yerleştirilmiş görünmez bir fotoğraf makinesi değildir. Aslında farklı açılardan çok sayıda X-ışını ölçümü yapar ve bu ölçümlerin arkasındaki matematiksel bulmacayı çözerek kesit görüntüleri üretir. Başka bir deyişle cihaz, doğrudan görüntü çekmek yerine gölgelerden üç boyutlu bir hikâye yazar.</p>

<p>``</p>

<h2 id="x-ışınları-bize-ne-söyler">X-ışınları bize ne söyler?</h2>

<p>X-ışını demeti vücuttan geçerken kemik, kas, yağ ve hava tarafından farklı oranlarda soğurulur. Bu davranış yaklaşık olarak Beer–Lambert yasasıyla açıklanır:</p>

\[I = I_0 e^{-\int_L \mu(x,y)\,ds}\]

<p>Burada $I_0$ başlangıçtaki, $I$ dedektöre ulaşan ışın şiddetidir. $\mu(x,y)$ ise dokunun X-ışınını ne kadar zayıflattığını gösteren doğrusal soğurma katsayısıdır. İntegral, ışının izlediği $L$ yolu boyunca karşılaştığı bütün dokuların etkisini toplar.</p>

<p>Denklemin logaritmasını aldığımızda daha kullanışlı bir ölçüm elde ederiz:</p>

\[p = -\ln\left(\frac{I}{I_0}\right)=\int_L \mu(x,y)\,ds\]

<p>Yani dedektör, ışının geçtiği çizgi üzerindeki piksel değerlerinin toplamına benzer bir bilgi sağlar. Ancak tek bir toplamla hangi dokunun nerede olduğunu bilemeyiz. Bir alışveriş fişinin yalnızca toplam tutarını görüp sepetteki ürünleri tahmin etmeye çalışmak gibi!</p>

<h2 id="radon-dönüşümü-gölgelerin-kataloğu">Radon dönüşümü: Gölgelerin kataloğu</h2>

<p>Cihaz, X-ışını tüpünü hastanın çevresinde döndürerek farklı açılardan ölçümler toplar. Bir nesnenin belirli açılardaki çizgisel integrallerini hesaplayan matematiksel işleme <strong>Radon dönüşümü</strong> denir:</p>

\[R(\theta,s)=\int\!\!\int \mu(x,y)\,\delta(s-x\cos\theta-y\sin\theta)\,dx\,dy\]

<p>Burada $\theta$ tarama açısını, $s$ ise ışının merkezden uzaklığını belirtir. Bütün açılardan gelen ölçümler yan yana dizildiğinde <strong>sinogram</strong> adı verilen dalgalı bir görüntü oluşur. Noktasal bir nesne sinogramda sinüs eğrisi çizdiği için bu isim oldukça yerindedir.</p>

<table>
  <thead>
    <tr>
      <th>Kavram</th>
      <th>Girdi</th>
      <th>Çıktı</th>
      <th>Benzetme</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Radon dönüşümü</td>
      <td>Kesit görüntüsü</td>
      <td>Projeksiyonlar</td>
      <td>Nesneden gölge üretmek</td>
    </tr>
    <tr>
      <td>Ters Radon dönüşümü</td>
      <td>Projeksiyonlar</td>
      <td>Kesit görüntüsü</td>
      <td>Gölgelerden nesneyi bulmak</td>
    </tr>
    <tr>
      <td>Sinogram</td>
      <td>Tüm açısal ölçümler</td>
      <td>Ham veri haritası</td>
      <td>Gölgelerin kataloğu</td>
    </tr>
  </tbody>
</table>

<p><img src="/img/bilgisayarli-tomografinin-matematigi-82.svg" alt="bilgisayarli-tomografinin-matematigi-82" /></p>

<h2 id="geri-projeksiyon-neden-tek-başına-yetmez">Geri projeksiyon neden tek başına yetmez?</h2>

<p>Basit geri projeksiyonda her ölçüm, geldiği doğrultu boyunca görüntüye geri yayılır. Çok sayıda açı birleştirildiğinde nesne ortaya çıkar; fakat sonuç bulanıktır. Çünkü tek bir ölçüm, ait olduğu çizginin tamamına eşit biçimde dağıtılmıştır.</p>

<p><strong>Filtrelenmiş geri projeksiyon</strong> bu sorunu azaltır. Önce projeksiyonlara yüksek frekansları güçlendiren bir rampa filtresi uygulanır, ardından veriler görüntü düzlemine geri taşınır:</p>

\[\mu(x,y)=\int_0^\pi \widetilde{p}_\theta(x\cos\theta+y\sin\theta)\,d\theta\]

<p>Buradaki $\widetilde{p}_\theta$, filtrelenmiş projeksiyondur. Filtre keskinliği artırırken gürültüyü de büyütebilir; dolayısıyla görüntü kalitesi ile radyasyon dozu arasında dikkatli bir denge kurulur.</p>

<h2 id="küçük-bir-python-deneyi">Küçük bir Python deneyi</h2>

<p>Aşağıdaki örnek, yapay bir kesitin projeksiyonlarını üretir ve filtrelenmiş geri projeksiyonla görüntüyü yeniden oluşturur:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="n">skimage.data</span> <span class="kn">import</span> <span class="n">shepp_logan_phantom</span>
<span class="kn">from</span> <span class="n">skimage.transform</span> <span class="kn">import</span> <span class="n">radon</span><span class="p">,</span> <span class="n">iradon</span><span class="p">,</span> <span class="n">resize</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="c1"># İnsan başına benzeyen standart test kesiti
</span><span class="n">kesit</span> <span class="o">=</span> <span class="nf">resize</span><span class="p">(</span><span class="nf">shepp_logan_phantom</span><span class="p">(),</span> <span class="p">(</span><span class="mi">256</span><span class="p">,</span> <span class="mi">256</span><span class="p">))</span>

<span class="c1"># Cihazın çevrede dolaştığı açıları temsil eder
</span><span class="n">acilar</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">linspace</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">256</span><span class="p">,</span> <span class="n">endpoint</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">sinogram</span> <span class="o">=</span> <span class="nf">radon</span><span class="p">(</span><span class="n">kesit</span><span class="p">,</span> <span class="n">theta</span><span class="o">=</span><span class="n">acilar</span><span class="p">)</span>

<span class="c1"># Ölçümlerden kesiti yeniden oluşturur
</span><span class="n">sonuc</span> <span class="o">=</span> <span class="nf">iradon</span><span class="p">(</span><span class="n">sinogram</span><span class="p">,</span> <span class="n">theta</span><span class="o">=</span><span class="n">acilar</span><span class="p">,</span> <span class="n">filter_name</span><span class="o">=</span><span class="sh">"</span><span class="s">ramp</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Bu kodda <code class="language-plaintext highlighter-rouge">radon</code> ileri ölçüm sürecini, <code class="language-plaintext highlighter-rouge">iradon</code> ise rekonstrüksiyonu taklit eder. Açı sayısını azaltmak görüntüde çizgisel artefaktlar oluşturur; gerçek cihazlarda da yetersiz veri benzer sorunlara yol açar.</p>

<h2 id="piksel-değerlerinden-doku-bilgisine">Piksel değerlerinden doku bilgisine</h2>

<p>Rekonstrüksiyon sonunda elde edilen soğurma katsayıları genellikle Hounsfield birimine dönüştürülür:</p>

\[HU = 1000\frac{\mu-\mu_{su}}{\mu_{su}}\]

<p>Su yaklaşık $0$ HU, hava $-1000$ HU, yoğun kemik ise yüzlerce veya binlerce HU değerine sahiptir. Böylece matematiksel bir yoğunluk haritası, doktorun yorumlayabileceği anatomik bir kesite dönüşür. Modern sistemler ayrıca iteratif yöntemler ve yapay zekâ kullanarak ölçüm ile tahmin arasındaki hatayı tekrar tekrar azaltır. Sonuçta tomografi, dönen bir X-ışını kaynağıyla başlayan ve ters problem çözümüyle tamamlanan etkileyici bir matematik mühendisliğidir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="bilgisayarlı tomografi" /><category term="matematik" /><category term="radon dönüşümü" /><category term="görüntü işleme" /><category term="python" /><category term="tıbbi görüntüleme" /><summary type="html"><![CDATA[Bir bilgisayarlı tomografi cihazı, vücudun içine yerleştirilmiş görünmez bir fotoğraf makinesi değildir. Aslında farklı açılardan çok sayıda X-ışını ölçümü yapar ve bu ölçümlerin arkasındaki matematiksel bulmacayı çözerek kesit görüntüleri üretir. Başka bir deyişle cihaz, doğrudan görüntü çekmek yerine gölgelerden üç boyutlu bir hikâye yazar.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/bilgisayarli-tomografinin-matematigi-82.png" /><media:content medium="image" url="https://program.sonsuz.us/img/bilgisayarli-tomografinin-matematigi-82.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">C Dilinde Yapılar ve Birlikler: struct ile union Arasındaki Farklar</title><link href="https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar/" rel="alternate" type="text/html" title="C Dilinde Yapılar ve Birlikler: struct ile union Arasındaki Farklar" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar</id><content type="html" xml:base="https://program.sonsuz.us/posts/c-dilinde-yapilar-ve-birlikler-struct-ile-union-arasindaki-farklar/"><![CDATA[<p>C dilinde bir öğrencinin adı, numarası ve notu gibi birbiriyle ilişkili fakat farklı türlerdeki verileri yönetmek istediğimizi düşünelim. Ayrı ayrı değişkenler kullanabiliriz; ancak veri sayısı arttıkça kodumuz kısa sürede dağınık bir çekmeceye dönüşür. <code class="language-plaintext highlighter-rouge">struct</code> ve <code class="language-plaintext highlighter-rouge">union</code>, farklı veri türlerini tek bir isim altında toplayarak bu karmaşayı düzenleyen iki güçlü C aracıdır.</p>

<p>``</p>

<h2 id="yapı-struct-nedir">Yapı (<code class="language-plaintext highlighter-rouge">struct</code>) nedir?</h2>

<p>Bir yapı, birbiriyle ilişkili değişkenleri tek bir veri modeli içinde saklar. Yapının her üyesi bellekte kendisine ait bir alana sahiptir. Dolayısıyla bütün üyeler aynı anda geçerli değerler taşıyabilir.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
</span>
<span class="k">struct</span> <span class="n">Ogrenci</span> <span class="p">{</span>
    <span class="kt">char</span> <span class="n">ad</span><span class="p">[</span><span class="mi">30</span><span class="p">];</span>
    <span class="kt">int</span> <span class="n">numara</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">notOrtalamasi</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">struct</span> <span class="n">Ogrenci</span> <span class="n">ogrenci</span><span class="p">;</span>

    <span class="n">strcpy</span><span class="p">(</span><span class="n">ogrenci</span><span class="p">.</span><span class="n">ad</span><span class="p">,</span> <span class="s">"Ada"</span><span class="p">);</span>
    <span class="n">ogrenci</span><span class="p">.</span><span class="n">numara</span> <span class="o">=</span> <span class="mi">1024</span><span class="p">;</span>
    <span class="n">ogrenci</span><span class="p">.</span><span class="n">notOrtalamasi</span> <span class="o">=</span> <span class="mi">91</span><span class="p">.</span><span class="mi">5</span><span class="n">f</span><span class="p">;</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"%s - %d - %.1f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">ad</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">numara</span><span class="p">,</span>
           <span class="n">ogrenci</span><span class="p">.</span><span class="n">notOrtalamasi</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Burada <code class="language-plaintext highlighter-rouge">ogrenci</code> tek bir değişkendir; fakat <code class="language-plaintext highlighter-rouge">.</code> operatörüyle erişilen üç farklı üyeyi taşır. Bir yapı işaretçisi kullanıldığında ise üyelere <code class="language-plaintext highlighter-rouge">-&gt;</code> operatörüyle erişilir: <code class="language-plaintext highlighter-rouge">ogrenciPtr-&gt;numara</code>.</p>

<h2 id="birlik-union-nedir">Birlik (<code class="language-plaintext highlighter-rouge">union</code>) nedir?</h2>

<p>Birlik de farklı türleri aynı referans altında toplar, ancak üyelerin tamamı <strong>aynı bellek alanını paylaşır</strong>. Bir üyeye yeni değer yazıldığında diğer üyenin eski değeri güvenilirliğini kaybeder. Yani birlik, “hepsini aynı anda sakla” değil, “bunlardan birini sakla” yaklaşımıdır.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="k">union</span> <span class="n">Deger</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">tamSayi</span><span class="p">;</span>
    <span class="kt">float</span> <span class="n">ondalik</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">karakter</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">union</span> <span class="n">Deger</span> <span class="n">veri</span><span class="p">;</span>

    <span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span> <span class="o">=</span> <span class="mi">42</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Tam sayı: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span><span class="p">);</span>

    <span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span> <span class="o">=</span> <span class="mi">3</span><span class="p">.</span><span class="mi">14</span><span class="n">f</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Ondalık: %.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>İkinci atamadan sonra <code class="language-plaintext highlighter-rouge">tamSayi</code> üyesini okumak anlamlı değildir; çünkü aynı bitler artık <code class="language-plaintext highlighter-rouge">float</code> biçiminde yorumlanmaktadır.</p>

<h2 id="bellek-hesabı">Bellek hesabı</h2>

<p>Bir yapının teorik boyutu üyelerin boyutları toplamına yakındır:</p>

\[S_{struct} \geq \sum_{i=1}^{n} S_i\]

<p>Eşitsizliğin nedeni <strong>padding</strong> adı verilen hizalama boşluklarıdır. Derleyici, işlemcinin verilere daha verimli erişebilmesi için üyeler arasına kullanılmayan baytlar ekleyebilir.</p>

<p>Bir birlik için temel ilişki şöyledir:</p>

\[S_{union} \geq \max(S_1, S_2, \ldots, S_n)\]

<p>Birliğin boyutu genellikle en büyük üyenin boyutudur; hizalama gereksinimleri sonucu küçük farklılıklar görülebilir. Kesin sonucu öğrenmenin doğru yolu <code class="language-plaintext highlighter-rouge">sizeof</code> kullanmaktır.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th><code class="language-plaintext highlighter-rouge">struct</code></th>
      <th><code class="language-plaintext highlighter-rouge">union</code></th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Bellek kullanımı</td>
      <td>Üyelerin toplamına yakındır</td>
      <td>En büyük üyeye yakındır</td>
    </tr>
    <tr>
      <td>Aynı anda geçerli üye</td>
      <td>Tüm üyeler</td>
      <td>Genellikle yalnızca biri</td>
    </tr>
    <tr>
      <td>Veri koruma</td>
      <td>Bir üyeyi değiştirmek diğerlerini bozmaz</td>
      <td>Yeni yazma eski üyeyi ezer</td>
    </tr>
    <tr>
      <td>Tipik kullanım</td>
      <td>Kayıt ve nesne modelleme</td>
      <td>Değişken türde veri, donanım ve protokoller</td>
    </tr>
  </tbody>
</table>

<h2 id="güvenli-birlik-kullanımı-etiketli-birlik">Güvenli birlik kullanımı: etiketli birlik</h2>

<p>Birliğin hangi üyesinin geçerli olduğunu kendiliğinden bilmesi mümkün değildir. Bu nedenle bir <code class="language-plaintext highlighter-rouge">enum</code> etiketiyle birlik kullanımını güvenli hâle getirebiliriz:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">enum</span> <span class="n">DegerTuru</span> <span class="p">{</span>
    <span class="n">TAM_SAYI</span><span class="p">,</span>
    <span class="n">ONDALIK</span>
<span class="p">};</span>

<span class="k">struct</span> <span class="n">EtiketliDeger</span> <span class="p">{</span>
    <span class="k">enum</span> <span class="n">DegerTuru</span> <span class="n">tur</span><span class="p">;</span>
    <span class="k">union</span> <span class="p">{</span>
        <span class="kt">int</span> <span class="n">tamSayi</span><span class="p">;</span>
        <span class="kt">float</span> <span class="n">ondalik</span><span class="p">;</span>
    <span class="p">}</span> <span class="n">veri</span><span class="p">;</span>
<span class="p">};</span>

<span class="kt">void</span> <span class="nf">yazdir</span><span class="p">(</span><span class="k">struct</span> <span class="n">EtiketliDeger</span> <span class="n">deger</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">deger</span><span class="p">.</span><span class="n">tur</span> <span class="o">==</span> <span class="n">TAM_SAYI</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">deger</span><span class="p">.</span><span class="n">veri</span><span class="p">.</span><span class="n">tamSayi</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"%.2f</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">deger</span><span class="p">.</span><span class="n">veri</span><span class="p">.</span><span class="n">ondalik</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bu desen, modern dillerdeki variant veya sum type yapılarına benzer. <code class="language-plaintext highlighter-rouge">tur</code> alanı hangi üyenin okunacağını söyler; <code class="language-plaintext highlighter-rouge">union</code> ise gereksiz bellek tüketimini azaltır.</p>

<p>Kısacası, bir varlığın bütün özelliklerine aynı anda ihtiyacınız varsa <code class="language-plaintext highlighter-rouge">struct</code>; seçeneklerden yalnızca biri tutulacaksa <code class="language-plaintext highlighter-rouge">union</code> uygundur. İkisini birlikte kullanmak ise hem düzenli hem de bellek açısından ekonomik veri modelleri kurmanın etkili bir yoludur.</p>

<p><img src="/img/c-dilinde-yapilar-86.svg" alt="c-dilinde-yapilar-86" /></p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="c" /><category term="struct" /><category term="union" /><category term="veri yapıları" /><category term="bellek yönetimi" /><category term="programlama" /><summary type="html"><![CDATA[C dilinde bir öğrencinin adı, numarası ve notu gibi birbiriyle ilişkili fakat farklı türlerdeki verileri yönetmek istediğimizi düşünelim. Ayrı ayrı değişkenler kullanabiliriz; ancak veri sayısı arttıkça kodumuz kısa sürede dağınık bir çekmeceye dönüşür. struct ve union, farklı veri türlerini tek bir isim altında toplayarak bu karmaşayı düzenleyen iki güçlü C aracıdır.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/c-dilinde-yapilar-86.png" /><media:content medium="image" url="https://program.sonsuz.us/img/c-dilinde-yapilar-86.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Derin Öğrenme ile Kanser Tespiti: CNN’ler Radyologlara Karşı mı, Yanlarında mı?</title><link href="https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi/" rel="alternate" type="text/html" title="Derin Öğrenme ile Kanser Tespiti: CNN’ler Radyologlara Karşı mı, Yanlarında mı?" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi</id><content type="html" xml:base="https://program.sonsuz.us/posts/derin-ogrenme-ile-kanser-tespiti-cnnler-radyologlara-karsi-mi-yanlarinda-mi/"><![CDATA[<p>Bir akciğer tomografisindeki birkaç milimetrelik nodülü veya mamografideki belirsiz bir dokuyu fark etmek, radyologlar için dikkat ve deneyim gerektiren bir süreçtir. Derin öğrenme modelleri ise binlerce görüntüden örüntü öğrenerek bu sürece ikinci bir göz olarak katılabilir. Peki evrişimli sinir ağları gerçekten insan uzmanlardan daha başarılı mı, yoksa mesele insan-makine iş birliği mi?</p>

<p><img src="/img/derin-ogrenme-ile-38.svg" alt="derin-ogrenme-ile-38" /></p>

<p>``</p>

<h2 id="evrişimli-sinir-ağı-neyi-öğrenir">Evrişimli sinir ağı neyi öğrenir?</h2>

<p>Evrişimli sinir ağları, yani <strong>CNN’ler</strong>, görüntülerdeki uzamsal ilişkileri öğrenmek için geliştirilmiştir. İlk katmanlar kenar, köşe ve doku gibi basit özellikleri yakalarken daha derin katmanlar kitle biçimi, düzensiz sınır veya doku yoğunluğu gibi karmaşık örüntülere odaklanır.</p>

<p>Bir evrişim işlemi kabaca şöyle ifade edilir:</p>

\[y_{i,j} = \sum_m \sum_n x_{i+m,j+n} w_{m,n} + b\]

<p>Burada $x$ giriş görüntüsünü, $w$ öğrenilebilir filtreyi, $b$ sapma değerini ve $y$ üretilen özellik haritasını temsil eder. Filtre görüntü üzerinde dolaşır; önemli bölgelerde yüksek aktivasyonlar oluşturur. Model, eğitim sırasında hatasını azaltacak filtreleri kendisi öğrenir.</p>

<p>Kanser tespitinde süreç genellikle görüntü sınıflandırma, tümör konumlandırma veya piksel düzeyinde segmentasyon biçiminde tasarlanır. Örneğin bir model yalnızca “şüpheli” sonucunu verebilirken başka bir model kitlenin sınırlarını da işaretleyebilir.</p>

<h2 id="i̇nsan-ve-cnn-karşılaştırması">İnsan ve CNN karşılaştırması</h2>

<p>Bir sistemi yalnızca doğruluk oranıyla değerlendirmek yanıltıcıdır. Tıbbi taramalarda <strong>duyarlılık</strong> ve <strong>özgüllük</strong> özellikle önemlidir:</p>

\[\text{Duyarlılık} = \frac{TP}{TP + FN}\]

\[\text{Özgüllük} = \frac{TN}{TN + FP}\]

<p>Duyarlılığın düşük olması gerçek kanserlerin kaçırılması, özgüllüğün düşük olması ise çok sayıda sağlıklı hastanın gereksiz incelemeye yönlendirilmesi anlamına gelebilir.</p>

<table>
  <thead>
    <tr>
      <th>Özellik</th>
      <th>CNN modeli</th>
      <th>İnsan uzman</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Hız</td>
      <td>Binlerce görüntüyü hızlı tarayabilir</td>
      <td>İnceleme süresi vakaya bağlıdır</td>
    </tr>
    <tr>
      <td>Tutarlılık</td>
      <td>Aynı girdiye genellikle aynı sonucu verir</td>
      <td>Yorgunluk ve dikkat etkili olabilir</td>
    </tr>
    <tr>
      <td>Bağlam</td>
      <td>Klinik geçmişi sınırlı yorumlar</td>
      <td>Belirti, öykü ve diğer testleri birleştirir</td>
    </tr>
    <tr>
      <td>Açıklanabilirlik</td>
      <td>Karar süreci çoğu zaman opaktır</td>
      <td>Gerekçesini tıbbi dille açıklayabilir</td>
    </tr>
    <tr>
      <td>Nadir vakalar</td>
      <td>Eğitim verisi azsa zorlanabilir</td>
      <td>Deneyim ve literatürden yararlanabilir</td>
    </tr>
  </tbody>
</table>

<p>Araştırmalarda bazı CNN’ler belirli veri kümelerinde uzmanlarla benzer, hatta daha yüksek sonuçlar elde edebilir. Ancak bu, modelin her hastanede aynı başarıyı göstereceği anlamına gelmez. Cihaz markası, çekim protokolü, hasta popülasyonu ve görüntü kalitesi değiştiğinde <strong>veri dağılımı kayması</strong> ortaya çıkabilir.</p>

<h2 id="basitleştirilmiş-bir-cnn-örneği">Basitleştirilmiş bir CNN örneği</h2>

<p>Aşağıdaki TensorFlow modeli, görüntüleri iki sınıfa ayırabilecek temel bir mimari gösterir:</p>

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

<span class="n">model</span> <span class="o">=</span> <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="nc">Sequential</span><span class="p">([</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Input</span><span class="p">(</span><span class="n">shape</span><span class="o">=</span><span class="p">(</span><span class="mi">224</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">3</span><span class="p">)),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Conv2D</span><span class="p">(</span><span class="mi">32</span><span class="p">,</span> <span class="mi">3</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">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">MaxPooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">Conv2D</span><span class="p">(</span><span class="mi">64</span><span class="p">,</span> <span class="mi">3</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">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">MaxPooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</span><span class="p">.</span><span class="nc">GlobalAveragePooling2D</span><span class="p">(),</span>
    <span class="n">tf</span><span class="p">.</span><span class="n">keras</span><span class="p">.</span><span class="n">layers</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>

<span class="n">model</span><span class="p">.</span><span class="nf">compile</span><span class="p">(</span>
    <span class="n">optimizer</span><span class="o">=</span><span class="sh">'</span><span class="s">adam</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">loss</span><span class="o">=</span><span class="sh">'</span><span class="s">binary_crossentropy</span><span class="sh">'</span><span class="p">,</span>
    <span class="n">metrics</span><span class="o">=</span><span class="p">[</span><span class="sh">'</span><span class="s">accuracy</span><span class="sh">'</span><span class="p">]</span>
<span class="p">)</span>
</code></pre></div></div>

<p>Evrişim katmanları görüntü özelliklerini çıkarır, havuzlama katmanları boyutu küçültür, sigmoid çıkışı ise görüntünün şüpheli sınıfa ait olma olasılığını üretir. Gerçek bir klinik sistemde veri artırma, hasta bazlı veri ayrımı, harici doğrulama ve kalibrasyon gibi ek adımlar zorunludur.</p>

<h2 id="rakip-değil-ekip-arkadaşı">Rakip değil, ekip arkadaşı</h2>

<p>CNN’lerin en güçlü kullanım biçimi radyologların yerini almak değil, önceliklendirme ve karar desteği sağlamaktır. Model şüpheli görüntüleri sıranın başına taşıyabilir, gözden kaçabilecek bölgeleri işaretleyebilir ve ikinci okuma sunabilir. Buna karşılık nihai karar; biyopsi, hasta geçmişi ve diğer klinik bulgularla birlikte uzman tarafından verilmelidir.</p>

<p>Ayrıca eğitim verilerindeki demografik dengesizlikler adaletsiz sonuçlara yol açabilir. Bu nedenle başarı ölçümleri yaş, cinsiyet, cihaz ve merkez gibi alt gruplarda ayrı ayrı incelenmelidir. Güvenli gelecek, “yapay zekâ mı insan mı?” sorusundan çok, <strong>ikisini nasıl denetimli ve şeffaf biçimde birleştiririz?</strong> sorusuna bağlıdır.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="derin öğrenme" /><category term="yapay zeka" /><category term="kanser tespiti" /><category term="cnn" /><category term="radyoloji" /><category term="tıbbi görüntüleme" /><summary type="html"><![CDATA[Bir akciğer tomografisindeki birkaç milimetrelik nodülü veya mamografideki belirsiz bir dokuyu fark etmek, radyologlar için dikkat ve deneyim gerektiren bir süreçtir. Derin öğrenme modelleri ise binlerce görüntüden örüntü öğrenerek bu sürece ikinci bir göz olarak katılabilir. Peki evrişimli sinir ağları gerçekten insan uzmanlardan daha başarılı mı, yoksa mesele insan-makine iş birliği mi?]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/derin-ogrenme-ile-38.png" /><media:content medium="image" url="https://program.sonsuz.us/img/derin-ogrenme-ile-38.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry><entry><title type="html">Doğal Dil İşleme ile Klinik Notlardan Yapılandırılmış Tıbbi Veri Çıkarma</title><link href="https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma/" rel="alternate" type="text/html" title="Doğal Dil İşleme ile Klinik Notlardan Yapılandırılmış Tıbbi Veri Çıkarma" /><published>2026-10-26T00:00:00+00:00</published><updated>2026-10-26T00:00:00+00:00</updated><id>https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma</id><content type="html" xml:base="https://program.sonsuz.us/posts/dogal-dil-isleme-ile-klinik-notlardan-yapilandirilmis-tibbi-veri-cikarma/"><![CDATA[<p>Doktor notları klinik açıdan son derece değerlidir; ancak “üç gündür artan göğüs ağrısı, diyabet öyküsü var, ateş yok” gibi serbest metinler bilgisayarların doğrudan analiz edebileceği satır ve sütunlara benzemez. Klinik Doğal Dil İşleme, bu dağınık anlatımı tanılar, belirtiler, ilaçlar, ölçümler ve zaman bilgileri gibi yapılandırılmış verilere dönüştürür. Böylece araştırma, karar desteği ve hastane operasyonlarında kullanılabilecek güvenilir veri üretilir.</p>

<p><img src="/img/dogal-dil-isleme-37.svg" alt="dogal-dil-isleme-37" /></p>

<p>``</p>
<h2 id="klinik-notları-anlamak-neden-zordur">Klinik notları anlamak neden zordur?</h2>

<p>Gündelik NLP uygulamalarında bir kelimenin olumlu veya olumsuz duygu taşıması önemli olabilir. Klinik alandaysa tek bir olumsuzluk eki hastanın durumunu tamamen değiştirir: “pnömoni var” ile “pnömoni saptanmadı” aynı kavramı içerir ama zıt sonuçlar bildirir.</p>

<p>Notlarda kısaltmalar, yazım hataları, özel terminoloji ve bağlama bağlı ifadeler de bulunur. “MI” miyokart enfarktüsü anlamına gelebilirken farklı bir bölümde başka bir kısaltmayı temsil edebilir. Türkçenin eklemeli yapısı da “hipertansiyonu”, “hipertansiyondan” ve “hipertansiyonsuz” biçimlerinin aynı kökle ilişkilendirilmesini gerektirir.</p>

<table>
  <thead>
    <tr>
      <th>Görev</th>
      <th>Girdi örneği</th>
      <th>Yapılandırılmış sonuç</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Varlık tanıma</td>
      <td>“Metformin 500 mg kullanıyor”</td>
      <td>İlaç: Metformin, doz: 500 mg</td>
    </tr>
    <tr>
      <td>Olumsuzluk analizi</td>
      <td>“Ateş gözlenmedi”</td>
      <td>Ateş: yok</td>
    </tr>
    <tr>
      <td>Zaman çıkarımı</td>
      <td>“İki yıl önce ameliyat oldu”</td>
      <td>İşlem zamanı: geçmiş</td>
    </tr>
    <tr>
      <td>Kavram eşleme</td>
      <td>“Yüksek tansiyon”</td>
      <td>SNOMED CT: hipertansiyon</td>
    </tr>
    <tr>
      <td>İlişki çıkarımı</td>
      <td>“Baş ağrısı için parasetamol”</td>
      <td>İlaç-belirti ilişkisi</td>
    </tr>
  </tbody>
</table>

<h2 id="tipik-bilgi-çıkarım-hattı">Tipik bilgi çıkarım hattı</h2>

<p>Sistem önce metni cümlelere ve sözcüklere ayırır. Ardından normalizasyon yaparak yazım çeşitlerini azaltır. Adlandırılmış Varlık Tanıma modeli hastalık, ilaç, anatomik bölge ve laboratuvar değeri gibi ifadeleri etiketler. Sonraki aşamada olumsuzluk, belirsizlik, deneyimleyen kişi ve zaman belirlenir.</p>

<p>Örneğin “Hastanın annesinde meme kanseri vardı” cümlesinde hastalık gerçektir; fakat deneyimleyen kişi hasta değildir. Bu ayrım yapılmazsa hastaya yanlış tanı atanabilir. Son aşamada bulunan ifadeler ICD-10, LOINC veya SNOMED CT gibi kontrollü terminolojilerle eşleştirilir.</p>

<p>Modern sistemler BERT benzeri dönüştürücü modeller kullanır. Bir ifadenin bağlamsal gösterimi kabaca şöyle düşünülebilir:</p>

\[h_i = \operatorname{Transformer}(x_1, x_2, \ldots, x_n)_i\]

<p>Burada $x_i$ sözcük veya alt sözcük birimini, $h_i$ ise çevresindeki kelimeleri dikkate alan bağlamsal temsili gösterir. Sınıflandırıcı bu temsilden “ilaç”, “belirti” veya “varlık değil” gibi bir etiket üretir.</p>

<h2 id="basitleştirilmiş-python-örneği">Basitleştirilmiş Python örneği</h2>

<p>Aşağıdaki örnek, eğitilmiş bir spaCy modelinin klinik varlıkları nasıl çıkarabileceğini gösterir. Gerçek kullanımda genel amaçlı model yerine kuruma ve dile uygun klinik veriyle eğitilmiş bir model gerekir.</p>

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

<span class="n">nlp</span> <span class="o">=</span> <span class="n">spacy</span><span class="p">.</span><span class="nf">load</span><span class="p">(</span><span class="sh">"</span><span class="s">tr_clinical_ner_model</span><span class="sh">"</span><span class="p">)</span>
<span class="n">text</span> <span class="o">=</span> <span class="sh">"</span><span class="s">Hasta metformin 500 mg kullanıyor, ateş gözlenmedi.</span><span class="sh">"</span>
<span class="n">doc</span> <span class="o">=</span> <span class="nf">nlp</span><span class="p">(</span><span class="n">text</span><span class="p">)</span>

<span class="n">records</span> <span class="o">=</span> <span class="p">[]</span>
<span class="k">for</span> <span class="n">entity</span> <span class="ow">in</span> <span class="n">doc</span><span class="p">.</span><span class="n">ents</span><span class="p">:</span>
    <span class="n">records</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
        <span class="sh">"</span><span class="s">text</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">text</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">label_</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">start</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">start_char</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">end</span><span class="sh">"</span><span class="p">:</span> <span class="n">entity</span><span class="p">.</span><span class="n">end_char</span>
    <span class="p">})</span>

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

<p>Kod, metni modele gönderir ve tespit edilen ifadeleri türleriyle birlikte sözlük listesine dönüştürür. Ancak “gözlenmedi” bilgisinin ateşi olumsuzladığını anlamak için ayrıca kural tabanlı veya öğrenilmiş bir olumsuzluk modülü kullanılmalıdır.</p>

<h2 id="başarı-nasıl-ölçülür">Başarı nasıl ölçülür?</h2>

<p>Klinik sistemlerde yalnızca doğruluk oranına bakmak yanıltıcıdır. Kesinlik ve duyarlılık daha açıklayıcıdır:</p>

\[\text{Kesinlik}=\frac{TP}{TP+FP}, \qquad \text{Duyarlılık}=\frac{TP}{TP+FN}\]

<p>Yüksek kesinlik, üretilen kayıtların çoğunun doğru olduğunu; yüksek duyarlılık ise gerçek klinik ifadelerin çok azının kaçırıldığını gösterir. Dengeli değerlendirme için $F_1$ skoru kullanılır.</p>

<h2 id="güvenlik-ve-insan-denetimi">Güvenlik ve insan denetimi</h2>

<p>Klinik notlar son derece hassas kişisel veriler içerir. Bu nedenle kimliksizleştirme, erişim kontrolü, şifreleme ve ayrıntılı denetim kayıtları zorunludur. Model çıktıları doğrudan tanı yerine geçmemeli; doktor onayına sunulan yardımcı öneriler olarak değerlendirilmelidir. Kısacası başarılı klinik NLP, yalnızca iyi bir model değil, güvenilir veri, tıbbi terminoloji, mahremiyet ve insan denetiminin birlikte çalıştığı bir sistemdir.</p>]]></content><author><name>Sonsuz Us</name></author><category term="Bilgi" /><category term="doğal dil işleme" /><category term="klinik nlp" /><category term="yapay zeka" /><category term="sağlık bilişimi" /><category term="bilgi çıkarımı" /><category term="python" /><summary type="html"><![CDATA[Doktor notları klinik açıdan son derece değerlidir; ancak “üç gündür artan göğüs ağrısı, diyabet öyküsü var, ateş yok” gibi serbest metinler bilgisayarların doğrudan analiz edebileceği satır ve sütunlara benzemez. Klinik Doğal Dil İşleme, bu dağınık anlatımı tanılar, belirtiler, ilaçlar, ölçümler ve zaman bilgileri gibi yapılandırılmış verilere dönüştürür. Böylece araştırma, karar desteği ve hastane operasyonlarında kullanılabilecek güvenilir veri üretilir.]]></summary><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://program.sonsuz.us/img/dogal-dil-isleme-37.png" /><media:content medium="image" url="https://program.sonsuz.us/img/dogal-dil-isleme-37.png" xmlns:media="http://search.yahoo.com/mrss/" /></entry></feed>