3.07.2013

Bulanık mantık - 1

Bulanık mantık (Fuzzy Logic) kavramı ilk kez 1965 yılında California Berkeley Üniversitesinden Prof. Lotfi A.Zadeh�in bu konu üzerinde ilk makallelerini yayınlamasıyla duyuldu. O tarihten sonra önemi gittikçe artarak günümüze kadar gelen bulanık mantık, belirsizliklerin anlatımı ve belirsizliklerle çalışılabilmesi için kurulmuş katı bir matematik düzen olarak tanımlanabilir. Bilindiği gibi istatistikte ve olasılık kuramında, belirsizliklerle değil kesinliklerle çalışılır ama insanın yaşadığı ortam daha çok belirsizliklerle doludur. Bu yüzden insanoğlunun sonuç çıkarabilme yeteneğini anlayabilmek için belirsizliklerle çalışmak gereklidir.

Bulanık mantık ile klasik mantık arasındaki temel fark bilinen anlamda matematiğin sadece aşırı uç değerlerine izin vermesidir. Klasik matematiksel yöntemlerle karmaşık sistemleri modellemek ve kontrol etmek işte bu yüzden zordur, çünkü veriler tam olmalıdır. Bulanık mantık kişiyi bu zorunluluktan kurtarır ve daha niteliksel bir tanımlama olanağı sağlar. Bir kişi için 38,5 yaşında demektense sadece orta yaşlı demek bir çok uygulama için yeterli bir veridir. Böylece azımsanamayacak ölçüde bir bilgi indirgenmesi söz konusu olacak ve matematiksel bir tanımlama yerine daha kolay anlaşılabilen niteliksel bir tanımlama yapılabilecektir.
Bulanık mantıkta fuzzy kümeleri kadar önemli bir diğer kavramda linguistik değişken kavramıdır. Linguistik değişken �sıcak� veya �soğuk� gibi kelimeler ve ifadelerle tanımlanabilen değişkenlerdir. Bir linguistik değişkenin değerleri fuzzy kümeleri ile ifade edilir. Örneğin oda sıcaklığı linguistik değişken için �sıcak�, �soğuk� ve �çok sıcak� ifadelerini alabilir. Bu üç ifadenin her biri ayrı ayrı fuzzy kümeleri ile modellenir.
Bulanık mantığın uygulama alanları çok geniştir. Sağladığı en büyük fayda ise �insana özgü tecrübe ile öğrenme� olayının kolayca modellenebilmesi ve belirsiz kavramların bile matematiksel olarak ifade edilebilmesine olanak tanımasıdır. Bu nedenle lineer olmayan sistemlere yaklaşım yapabilmek için özellikle uygundur.
Bulanık mantık konusunda yapılan araştırmalar Japonya�da oldukça fazladır. Özellikle fuzzy process controller olarak isimlendirilen özel amaçlı bulanık mantık mikroişlemci çipi�nin üretilmesine çalışılmaktadır. Bu teknoloji fotoğraf makineleri, çamaşır makineleri, klimalar ve otomatik iletim hatları gibi uygulamalarda kullanılmaktadır. Bundan başka uzay araştırmaları ve havacılık endüstrisinde de kullanılmaktadır. TAI�de araştırma gelişme kısmında bulanık mantık konusunda çalışmalar yapılmaktadır. Yine bir başka uygulama olarak otomatik civatalamaların değerlendirilmesinde bulanık mantık kullanılmaktadır. Bulanık mantık yardımıyla civatalama kalitesi belirlenmekte, civatalama tekniği alanında bilgili olmayan kişiler açısından konu şeffaf hale getirilmektedir. Burada bir uzmanın değerlendirme sınırlarına erişilmekte ve hatta geçilmektedir.
Fuzzy kuramının merkez kavramı fuzzy kümeleridir. Küme kavramı kulağa biraz matematiksel gelebilir ama anlaşılması kolaydır. Örneğin �orta yaş� kavramını inceleyerek olursak, bu kavramın sınırlarının kişiden kişiye değişiklik gösterdiğini görürüz. Kesin sınırlar söz konusu olmadığı için kavramı matematiksel olarak da kolayca formüle edemeyiz. Ama genel olarak 35 ile 55 yaşları orta yaşlılık sınırları olarak düşünülebilir. Bu kavramı grafik olarak ifade etmek istediğimizde karşımıza şekil deki gibi bir eğri çıkacaktır. Bu eğriye �aitlik eğrisi� adı verilir ve kavram içinde hangi değerin hangi ağırlıkta olduğunu gösterir.
Bir fuzzy kümesi kendi aitlik fonksiyonu ile açık olarak temsil edilebilir. Şekilde görüldüğü gibi aitlik fonksiyonu 0 ile 1 arasındaki her değeri alabilir. Böyle bir aitlik fonksiyonu ile �kesinlikle ait� veya �kesinlikle ait değil� arasında istenilen incelikte ayarlama yapmak mümkündür.
Bulanık mantık, ingilizcesiyle fuzzy logic, adından anlaşılabileceği gibi mantık kurrallarının esnek ve bulanık bir şekilde uygulanmasıdır. Klasik (boolean) mantıkta bildiğiniz gibi, "doğru" ve "yanlış" yada "1" ve "0"lar vardır, oysa bulanık mantıkta, ikisinin arasında bir yerede olan önermeler ve ifadelere izin verilebilir ki, gerçek hayata baktığımızda hemen hemen hiçbir şey kesinlikle doğru veya kesinlikle yanlış değildir. Gerçek hayatta önermeler genelde kısmen doğru veya belli bir olasılıkla doğru şeklinde değerlendirilir. Bulanık mantığa da zaten klasik mantığın gerçek dünya problemleri için yeterli olmadığı durumlar dolayısıyla ihtiyaç duyulmuştur.

Bulanık mantığın sistemi şu şekildedir. Bir ifade tamamen yanlış ise kalsik mantıkta olduğu gibi 0 değerindedir, yok eğer tamamen doğru ise 1 değerindedir. (Ancak bulanık mantık uygulmalarının çoğu bir ifadenin 0 veya 1 değerini almasına izin vermezler, veya sadece çok özel durumlarda izin verirler.) Bunların dışında tüm ifadeler 0 dan büyük 1 den küçük reel değerler alırlar. Yani değeri 0.32 olan bir ifadenin anlamı %32 doğru %68 yanlış demektir.

Bulanık mantığın da klasik mantıkta olduğu gibi işleçleri (operator) vardır, örneğin and, or, not ... ancak bunlar kendine has işlemlerdir mesela -başka yaklaşımlarda olmasına rağmen and işlemi- genelde çarpma olarak ifade edilir veya not işlemi de birden çıkarma şeklinde ifade edilir. Bunlar;

AND: A=0.2 B=0.8 => A and B = (A) * (B) = 0.2 * 0.8 = 0.16

NOT: A=0.4 => not A = 1-(A) = 1 - 0.4 = 0.6

şeklinde örneklenebilir. Ancak bunlar en basit yaklaşımlardır.

YSA ve Fuzzy Logic tekniklerinin beraber kullanımı ile daha etkili sistemler dizayn etmek mümkündür, ancak bu işlem ortaya çıkan sitemi çok yavaşlatmaktadır ve henüz bu tekniklerin birleştirilmesi yöntemi geliştirme ve test aşamalarındadır, aslında YSA algoritmaları da her gün hızla güncellenmektedir. Yani bu konuların -mesela özyineleme ya da search gibi- tam olarak oturdukları söylenemez, fakat başarılı uygulamaları da mevcuttur.
Not: Bir bulanık mantık uygulaması: Çubuk Üzerinde Top Denegeleme 

alıntı:http://www.yapay-zeka.org/modules/icontent/index.php?page=33

1.07.2013

Asal sayı Algoritması

Bir problem uzerinde calisirken aklima geldi. girilen bir sayinin asal olup olmadigini incelemek icin bir program yazmaya karar versek, nasil bir algoritma izlemek gerekir. yani bir sayi girildi, sayinin asal olup olmadigina bakilacak, once 2 sonra 3, sonra 5, 7, 11, 13, 17 gibi asal sayilara bolmeye basliyoruz. peki ama bolecegimiz son sayi kac olmali? yani bu bolme ne zamana kadar devam edecek? sayimiz cok buyuk olabilir, ve biz bir asal sayi data base'i olusturamayabiliriz, yani bolecegimiz asal sayilari da programin bulmasi gerekebilir, bu durumda isler zorlasiyor. yani 10 digit'e kadar database olusturulsa da 50 basamakli bir sayinin asal olup olmadigini test edemeyiz.

Eger bir sayinin asal olup olmadigini kesin olarak ogrenmek istiyorsaniz sayinin karekokune kadar tum olasiliklari tek tek denemeniz gerekiyor (daha iyi bir yontem bilinmedigini saniyorum. Var olup olamayacagi tartismalari konusunda bilgim yok). Ote yandan eger verilen bir sayi icin "bu sayi cok buyuk olasilikla asal / bu sayi kesinliklle asal degil" ikilisi tatmin edici bir yanit olacaksa, baska algoritmalar var. Gunumuzde pratikte kullanilan yontem de boyle birsey. Algoritma asal sayilarin su ozelligine dayaniyor. n asal olsun. Eger herhangi bir k sayisinin n'inci kuvvetini alip n'e boldugunuzde kalan kismina bakarsaniz yine k elde edersiniz (Sozgelimi 3^7 mod 7'de 3'tur. Deneyelim: 2187=7*312+3). Ote yandan n asal degilse boyle bir gereksinim yoktur, sans eseri arada bir k elde edebilirsiniz ancak bu hesap çogu zaman tutmaz. Simdi diyelim ki n'in asal olup olmadigini test etmek istiyoruz. Yapilan su:
rastgele sayilar alin, hepsinin n'inci kuvvetlerini alip n'e bolunce kalanlara bakin. Diyelim ki her seferinde basladiginiz sayiyi elde ediyorsunuz. Bir noktadan sonra diyorsunuz ki "cok sayi denedik, bu sayi asal olmasaydi muhtemelen bir noktada yanlis cevap alirdik. Oyleyse cok buyuk ihtimalle bu sayi asal". Eger k^n mod n sadece bir k icin bile k'ya esit degilse hemen "bu sayi asal degil" diyebiliyorsunuz. Elbette bu test size sayinin kesin kez asal oldugunu soyleyemiyor. Fakat karekok(n)'den cok cok daha az sayida deneme n'in asal olduguna deneyiciyi yeterince inandirabiliyor. (Bu tur algoritmalara probabilistik algoritma diyorlar, kesin cevap verenlere ise deterministik). Bir itiraz su olabilir: "n buyuk bir sayi ise k^n cok cok buyuk bir sayi olacak. Bilgisayar bu sayiyi hesaplayabilecek mi". k^n'i oylece hesaplamaya calisirsaniz ilk tahmin edilenden cok daha kucuk sayilar icin bile hicbir bilgisayarin buna yetmeyecegi gorulebilir. Ama bu sorunu soyle cozebiliriz: k^n'i hesaplayip mod n'de bakacagimiza her carpimdan sonra sonucu mod n'de indirgeyerek isleme devam etsek de ayni sonucu elde ederiz (neden?) Ornek olarak 2^2000 mod 3'u hesaplayalim: 2*2 mod 3=1. 2^2000=(2^2)^1000 oyleyse mod 3'te 1^1000=1. Bu sorunu boylece halledebiliriz. Hemen ekleyeyim, bu testin sonucu olarak denediginiz sayinin asal olmadigi yanitini alirsaniz ortaya baska bir sorun cikiyor: sayinin carpanlari nedir? karekok(n)'e kadar deneyerek carpanlari da bulabilirdik, bu testte bu sansi kaybettik. Gercekten de gunumuzde bir sayinin asal olup olmadigini anlamak eger asal degilse carpanlarini bulmaktan cok daha az zaman aliyor. Oyle ki bircok bankanin, askeri sistemlerin, hatta internet sayfalarinin kullandigi sifreler bu iki islemin yapilabilme hizlari arasinda cok buyuk fark oldugu gercegini kullanarak yapilmis. Yine probabilistik metodlarla karekok(n)'den cok daha iyi zamanda sayilari carpanlara ayirabilen algoritmalar var, ancak bunlar bile asallik testinden cok cok daha yavas. Bircok amator (ve profesyonel?) sifre kirma meraklisinin hizli bir carpanlara ayirma algoritmasi bulup ortaligi dagitmak icin cilginca ugrastigini tahmin etmissinizdir. 
Son olarak, gectigimiz yillarda eger uygulanabilirse carpanlara ayirma algoritmasini gercekten hizlandiracagi inandirici gozuken bir fikir ortaya atildi: kuantum hesaplama. Fiyakali bir isim, altinda yatan temel fikir ise su: Cok kucuk boyutlara indigimiz zaman maddenin davranisi buyuk boyutta gozlemledigimize benzemiyor, kullanilan ve en iyi sonuc veren model olan kuantum fizigine gore bir parca bir noktadan bir noktaya giderken mumkun olan her yolu izliyor, kucuk olcekte ise bunun ortalamasini goruyoruz (isigin duz cizgi uzerinde gittigini "zannettigimiz" gibi). Eh, bir parcacik birkac yolu birden ayni anda takip edebiliyorsa bunu akillica kullanip o parcaciga ayni anda bir suru is yaptirmak mumkun olmali. Tipki birden cok islemcinin ayni anda paralel islem yapmasi gibi. Tabi bunun nasil yapilacagi, yapilip yapilamayacagi tamamen muallakta. Ancak buyuk bir arastirma alani, fikir babasi da gectigimiz sene alanindaki en buyuk odulu aldi. Bilgisayarlarda devrim yaratacak pratik sonuclarini da gormemiz mumkun onumuzdeki senelerde...
Özgür Kişisel

MATLAB’de İleri Beslemeli (Feed Forward) ÇKP Ağların Tasarımı


Öncelikle bu ağ yapısını kullanabilmek için bir ileri beslemeli ağ nesnesi oluşturmamız gerekir. MATLAB’deki newff komutu bu işlemi gerçekleştirmektedir. newff komutunun yazım biçimi aşağıda verilmiştir:
net = newff(PR,[S1 S2…SNl],{TF1 TF2…TFNl},BTF,BLF,PF)
Burada;
       PR  - R elemanlı giriş vektörünün minimum ve maksimum değerlerini içeren Rx2 ‘lik matris.
       Si  - i’nci katmanda bulunan nöron sayısı. 
       TFi - i’nci katmanın transfer fonksiyonu, varsayılan= 'tansig'.
       BTF - Geriye yayılım ağ eğitim fonksiyonu, varsayılan = 'trainlm'.
       BLF - Geriye yayılım ağırlık/bias öğrenme fonksiyonu, varsayılan = 'learngdm'.
       PF  - Performans fonksiyonu, varsayılan = 'mse' dir.
Aşağıdaki kod ile 2 katmanlı bir ağ oluşturmaktayız. Bu problemde iki elamanlı bir giriş vektörü vardır. Giriş vektörünün ilk parametresinin değer aralığı -1 ve 2 olarak belirtilmiştir. İkinci parametrenin değer aralığı ise 0 – 5 olarak verilmiştir. İlk katmanda 3 nöron, ikinci katmanda bir diğer ifadeyle çıkış katmanında ise 1 nöron bulunmaktadır. İlk katmanın transfer fonksiyonu tanjant sigmoid, ikinci katmanınki ise lineer’dir. Öğrenme algoritması, gradyent azaltım algoritması traingd’dir. Problem iki girişli bir çıkışlı bilinmeyen bir sistem olarak düşünülebilir. Amacımız örnek giriş ve çıkış verileri vererek sistemi karakterize etmektir.
net=newff([-1 2; 0 5],[3,1],{'tansig','purelin'},'traingd');
Bu komut ağ nesnesi oluşturur ve aynı zamanda ağırlık ve bias değerlerinin ilklendirme (initialization) işlemini rastgele değerler atamak suretiyle gerçekleştirir. Haliyle ağ eğitime hazır olarak beklemektedir. Bazı durumlarda ağı tekrar ilklendirmek (reset’lemek) gerekebilir. Bu durumda;
net = init(net);
komutu kullanılabilir.
Tasarlanan ağın simulasyonu için sim komutu kullanılır. Similasyon’dan kasıt, ağa bir giriş değeri verip ağın çıkışını hesaplatmaktır.
p = [1;2];
a = sim(net,p)
a =
   -0.1011
Burada p ağın giriş verisini temsil etmektedir. Ağın iki girişi olduğu için p matrisi iki satırdan meydana gelmektedir. Görüleceği üzere ağ bir çıkış üretmektedir. Ancak bu, ağ henüz eğitilmediği ve ağırlık değerleri rastgele atandığı için arzu edilen çıkış değildir. Bu komutları kendi bilgisayarınızda çalıştırdığınızda muhtemelen farklı bir çıkış elde edeceksiniz. Çünkü ağırlık değerleri ilklendirilirken rastgele olarak atanmaktadır.
Diğer bir yandan ağı çoklu örneklerle de simüle edebilirsiniz.
p = [1 3 2;2 4 1];
a=sim(net,p)
a =
  -0.1011   -0.2308    0.4955
Burada iki girişli ağ için 3’er adet değer verilmiştir. Haliyle ağ her bir örnek için bir çıkış üretmiştir. Buradan açıkça görülüyorki ağın girişi için (simulasyon veya eğitim aşamasında) organize edilecek matrisin satırları parametrelere, sütunları ise örneklere karşılık gelmektedir.
Ağırlıklar ve bias değerleri ilklendirildikten sonra ağ eğitime hazırdır. Eğitim işleminde ağın davranışını ortaya koyacak giriş (p) ve çıkış (t) verileri gereklidir. Bunlar eğitim verisi olarak adlandırılır. Eğitim verileri çözüm uzayının tamamını veya en azından büyük bölümünü temsil edecek şekilde seçilmelidir. Eğitim esnasında ağırlık ve bias değerleri iteratif olarak hata fonksiyonunu minimize edecek şekilde güncellenir. Hata fonksiyonunun MSE olması durumunda hata, arzu edilen çıkış (t) ile ağın o anki çıkışı arasındaki farkın karesinin ortalamasıdır.
YSA’da kullanılan en temel öğrenme algoritması geriye yayılım (back propagation) algoritmasıdır. Basit anlamda ağırlıklar negatif gradyent yönünde güncellenir. Pek çok geriye yayılım algoritması vardır. En temel yapısı şu şekildedir:

burada,  ağırlık vektörünün k anındaki değerlerini, k anındaki gradyenti,  ise öğrenme oranını temsil etmektedir.
Toplu gradyent azaltım (batch gradient descent) eğitme algoritması MATLAB’de traingd ile temsil edilir.
Verdiğimiz problemin eğitim verilerini oluşturup ağın eğitimini şu şekilde gerçekleştirebiliriz:
p = [-1 -1 2 2;0 5 0 5];
t = [-1 -1 1 1];
burada, p matrisi ağın eğitimi için kullanılacak giriş verisini temsil etmektedir. Görüldüğü üzere 2 satırdan ve 4 sütundan oluşmaktadır. Problem iki parametreli olduğu için satır sayısı 2’dir. Ağın eğitimi için ise 4 örnek verilmektedir. Ağın çıkışını t matrisi temsil etmektedir. Tek satır olduğuna göre tek çıkış parametresi vardır (hatırlanırsa sistemimiz 2 girişili 1 çıkışlıdır). Her bir örnek için birer çıkış verilmiştir. Daha açık bir ifadeyle verilen sistemin doğruluk tablosu şu şekildedir:
p1
p2
t
-1
0
-1
-1
5
-1
2
0
1
2
5
1
Ağın eğitimi ile ilgili temel parametreleri şu şekilde düzenleyebilirsiniz:
net.trainParam.show = 50;
net.trainParam.lr = 0.05;
net.trainParam.epochs = 300;
net.trainParam.goal = 1e-5;
burada, show parametresi kaç iterasyonda bir eğitim durumunun MATLAB ekranına aktarılacağını belirmekte, epoch parametresi iterasyon sayısını, goal parametresi hedeflenen hata değerini, lr ise geriye yayılım algoritması için öğrenme oranını belirtmektedir. epoch veya goal parametrelerinden birisi sağlandığında eğitim işlemi durdurulacaktır.
Ağın eğitimine başlamak için train komutu kullanılır.
[net,tr]=train(net,p,t);
 TRAINGD, Epoch 0/300, MSE 1.59423/1e-05, Gradient 2.76799/1e-10
 TRAINGD, Epoch 50/300, MSE 0.00236382/1e-05, Gradient 0.0495292/1e-10
 TRAINGD, Epoch 100/300, MSE 0.000435947/1e-05, Gradient 0.0161202/1e-10
 TRAINGD, Epoch 150/300, MSE 8.68462e-05/1e-05, Gradient 0.00769588/1e-10
 TRAINGD, Epoch 200/300, MSE 1.45042e-05/1e-05, Gradient 0.00325667/1e-10
 TRAINGD, Epoch 211/300, MSE 9.64816e-06/1e-05, Gradient 0.00266775/1e-10
 TRAINGD, Performance goal met.
Görüleceği üzere 211. iterasyonda hedeflenen hata oranına erişilmiş ve ağın eğitimi durdurulumuştur. Ağın eğitilip eğitilmediğini test etmek için giriş verisi (p) ile ağı tekrar simule edelim:
a = sim(net,p)
a =
   -1.0010   -0.9989    1.0018    0.9985
Görüleceği üzere ağ arzu edilen çıkışları sağlamaktadır. Yani YSA verilen sistemi modellemiştir. Sistemin girişi ve çıkışı arasındaki bağıntıyı bulmuştur. Bunuda uygun ağırlık değerlerini seçerek yapmıştır. Bu aşamadan sonra eğitim verisinde kullanmadığımız yeni veriler vererek ağı test edebiliriz.
MATLAB’de kullanabileceğimiz pek çok eğitim algoritması bulunmaktadır. En temel algoritma yukarda bahsedilen geriye yayılım tabanlı toplu gradyent azaltım algoritmasıdır. Fakat MATLAB’de varsayılan eğitim algoritması olarak Levenberg-Marquardt (trainlm) seçilmiştir. Bu algoritma çok hızlıdır ancak çalışabilmesi için fazla hafızaya ihtiyaç duymaktadır. Bunların yanı sıra trainbfg ve trainrp algoritmaları da tercih edilebilir.
Ön-işleme Seçenekleri (Pre-processing)
Bazı temel ön işlemleri gerçekleştirerek YSA’nın eğitim ve öğrenme performanısını artırabilirsiniz. En temel ön-işleme yöntemlerden birisi giriş verilerinin normalize edilmesidir.premnmx komutu ile giriş ve çıkış verilerini -1 ile 1 arasına ölçekleyebilirsiniz:
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
net = train(net,pn,tn);
Eğitimden sonra simulasyon aşamasında ise normalize edilen verilerin tekrar eski haline çevrilmesi gerekmektedir. Bu işlem için postmnmx komutu kullanılır.
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt);
Bir diğer normalizasyon yöntemi de verilerin ortalamasını 0 ve standart sapmasını -1 olacak şekilde yeniden düzenlemekdir. Bu amaç için prestd ve poststd komutları kullanılmaktadır.
p = [-0.92 0.73 -0.47 0.74 0.29; -0.08 0.86 -0.67 -0.52 0.93];
t = [-0.08 3.4 -0.82 0.69 3.1];
[pn,meanp,stdp,tn,meant,stdt] = prestd(p,t);
net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net = train(net,pn,tn);
an = sim(net,pn);
a = poststd(an,meant,stdt);
Bazı durumlarda ağın girişi çok fazladır. Bu durumlarda eğitim işlemi çok uzun sürmektedir. Eğer giriş verileri arasında birbirleri ile ilintili veriler varsa bunlar ağın eğitimi için bir katkıda bulunmayacaktır. Temel bileşen analizi (principle component analysis - PCA) adı verilen teknikle ağın eğitimine katkıda bulunmayacak veriler indirgenerek giriş verisi azaltılabilir. Böylece giriş verilerinin kendi aralarında korelasyonlu olması engellenmiş olur.
p=[-1.5 -0.58 0.21 -0.96 -0.79; -2.2 -0.87 0.31 -1.4  -1.2];
[pn,meanp,stdp] = prestd(p);
[ptrans,transMat] = prepca(pn,0.02);
Buradaki örnekte giriş verisinin ikinci satırı birinci satırın yaklaşık olarak belli bir katsayı ile çarpılmış halidir. Temel bileşen analizi sonucunda iki parametreli giriş vektörü tek parametreli hale getirilmiştir (ptrans).
Örnek 1: Çarpım Tablosunun YSA’na Öğretilmesi
Çarpma işlemi doğrusal olmayan bir işlemdir ve yapay zekâ için zor bir problemdir. Bu örnekte 1 ile 10 arasındaki sayıların çarpım işlemi YSA’ya öğretilmiştir. Çarpma işleminde iki giriş ve bir çıkış vardır. Eğitimde 20 adet rastgele sayı seçilmiş ve test aşamasında yine 20 adet rastgele sayı seçilerek sistemin performansı oraya konmuştur.
clear all, close all,clc;
p=round(rand(2,20)*10) % Giris verisi 2x20’lik matris, rastgele 0-10
t = p(1,:).*p(2,:)     % Cikis verisi p1*p2
%Normalizasyon islemi
[pn,minp,maxp,tn,mint,maxt] = premnmx(p,t);
%YSA’nin tasarimi, egitimi ve simulasyonu
net = newff(minmax(pn),[5 1],{'tansig' 'purelin'},'trainlm');
net = train(net,pn,tn);
an = sim(net,pn);
[a] = postmnmx(an,mint,maxt); %Normalizasyonun tersi
%Egitim verilerinin gercek ve YSA cikisinin gosterimi
figure(1),plot3(p(1,:),p(2,:),t,'o');
hold on,plot3(p(1,:),p(2,:),a,'r*'),grid on;
legend('Gerçek deger','YSA cikisi'),xlabel('p1'),ylabel('p2'),zlabel('t'),title('Egitim verisi')
%Test verilerinin hazirlanmasi, farkli 20 adet ornek
ptest=round(rand(2,20)*10)
ttest = ptest(1,:).*ptest(2,:)
[ptn,minpt,maxpt,ttn,mintt,maxtt] = premnmx(ptest,ttest);
atn = sim(net,ptn); %Simulasyon
[at] = postmnmx(atn,mintt,maxtt);
%Test verilerinin gercek ve YSA cikisinin gosterimi
figure(2),plot3(ptest(1,:),ptest(2,:),ttest,'o');
hold on,plot3(ptest(1,:),ptest(2,:),at,'r*'),grid on;
legend('Gerçek deger','YSA cikisi'),xlabel('p1'),ylabel('p2'),zlabel('t'),title('Test verisi')


Could not load file or assembly "AjaxControlToolkit"


Could not load file or assembly ‘AjaxControlToolkit’ or one of its dependencies. The parameter is incorrect. (Exception from HRESULT: 0×80070057 (E_INVALIDARG))
Hatasını alıyorsanız ve Page Direktifinin altında mavi çizgiler çıkıyorsa markup tarafında hiçbir işlem yapamıyorsunuz demektir. Bugün karşılaştım bu sorunla, bir Calender Extender atayım dedim sonra kaldırsanızda fayda etmiyor defalarca sil, ekle, build fayda vermeyince ufak bir araştırma yaptım bunun  Temp klasörünün dolmasıyla alakalı oldugunu farkettim,
İster : Başlat > Çalıştır > %temp%  yolunu ister C:\Users\[Kullanıcı Adı]\AppData\Local\Temp   yolunu takip ederek klasörü temizleyiniz.
Visual Studio'yu kapatıp açalım ve tekrar projeyi derleyelim.Sorun çözülecektir.

Matlab NNET Toolbox tanımı

 NNET Toolbox

MATLAB nnet toolbox’da çok fazla ayrıntıya sahip bir çok komut bulunmaktadır. Aşağıda ise MLP ağlarını oluşturmamızı, eğitmemizi ve test etmemizi sağlayan komutlar görülmektedir.

  • NEWFF : Yeni bir Feed-Forward sinir ağı oluşturur.

  • TRAIN : Sinir ağının eğitimini yapar.

  • SIM : Sinir ağını simüle eder.

  • INIT : Sinir ağını sıfırlar.

  • GENSIM : Sinir ağını simulink’e aktarır.



 NEWFF fonksiyonunun kullanımı

Yeni bir ileri beslemeli ağ (feed forward network) oluşturulmasını sağlayan bu komutun parametre kullanımı aşağıdaki gibidir.


net = newff(PR,[S1 S2...SNl],{TF1 TF2...TFNl},BTF)

  • PR : Rx2 matris Girişler içindeki maksimum ve minimum değerler

  • Si : i. Katmandaki nöron sayısı

  • TFi : i. Katmandaki nöronların transfer fonksiyonları (logsig, tansig, hardlim ….)

  • BTF : Geriyansıtma eğitim cinsi (traınlm, traınbfg, traınrp, traıngd … )



 TRAIN fonksiyonunun kullanımı

Train fonksiyonu oluşturulmuş bir ağın eğitilmesini sağlar. Bu komut ağı verilen giriş-çıkış örneklerini baz alarak eğitir. Komutun kullanımı aşağıdaki gibidir.


[net,tr] = train(NET,P,T)

  • net : Eğitim yapılmış olan ağ (çıkış ağı)

  • tr : Eğitim kayıtı

  • NET : Eğitimi yapılacak olan ağ

  • P : Eğitim örnekleri

  • T : Eğitimdeki hedefler

 SIM fonksiyonunun kullanımı


y = sim(net,P)



  • y : Simülasyon çıkışları

  • net : Simüle edilecek olan ağ (çıkış ağı)

  • P : Test girişleri
Alıntı:http://okul.selyam.net/docs/index-35969.html?page=3

6.01.2013


Hata mesajı: Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack


Çözümde :
Bu gibi durumlarda Redirect işlemi try bloğunda veya bir döngüde ( for,foreach ve/veya while ) olabilir.
İlk çözüm elbetteki gibi bu mantıksızlığı ortadan kaldırmak ve Redirect işlemini blog dışına almaktır.

Sorun çözülmedi ise ve/veya başka türlü bir çözüm için ise ;

bir parametre daha vererek endResponse olayını false olarak belirtmeliyiz .


 Response.Redirect("ornek.aspx");  => HATA veren şekli ile ( HATA MESAJI :
Unable to evaluate expression because the code is optimized or a native frame is on top of the call stack )

 Response.Redirect("ornek.aspx",false);  => HATA nın düzeltilmesi için yapılan değişiklik .

Konu ileilgili diğer Çözüm bilgileri ;
 Response.end yerine => HttpContext.Current.ApplicationInstance.CompleteRequest kullanmak .

 Server.Transfer yerine Server.Execute Kullanmak ...

3.11.2012

yeni sayfada açma kodu c#

SORU: response.redirect ile yönlendirilecek sayfayı yeni sayfa da açmak
merhaba herkese,

Response.Redirect ile açmak istediğimiz sayfaya ait parametreler gönderebiliyormuyuz.
mesala window.open da oldugu gibi genişliği, statusbarı vs vs. en önemliside yeni bir tarayıcı* sayfasında açmak istiyorum.window.open malesef popup olarak açıyor :( 
ben target=_blank yazmak istiyorum. response redirect bu işi yapamıyorsa bunu javascript le yapabilirmiyim popup olmayan yeni sayfa .

ne yapmalıyım? 


Cevaplar

1. Bu durumda Response.Redirect kullanmamalısınız. Bunun yerine çıktıya yeni sayfayı açacak olan Javascript kodunu yazabilirsiniz.

Aşağıdaki örneği inceleyiniz:

<script runat=server>
   public void btn_click(...)
   {
      Response.Write("<script>window.open('falanca.html')</script>");
   }
</script>

...

<asp:button ... on_click="btn_click"/>

Bu şekilde çıktıya yazdığınızda sayfanın en üstüne yazılır. (Test etmek için kaynağı görüntüleyin.) Script çalıştığında eski sayfanız yerinde durur, yeni pencerede falanca.html açılır.
fizikci
28 Mart 2006 11:15
2. 
Response.Write("<script></script>")

sorun çıkartabiliyor, eğer sorun olursa şöyle yazın:

Response.Write("<scr"+"ipt></scr"+"ipt>")

fizikci
28 Mart 2006 11:18
3. cevap için teşekkür ederim ama ben popup olmamasınıda istiyorum.
sayfa popup engelleyiciye takılmasın istiyorum, çok şeymi istiyorum :(
kullanııcılarımın çogu butona basıyorum bişi olmuyo diyo,
popup engelleyicinin uyarısını anlamıyo bile
cetinz
28 Mart 2006 11:48
4. window.open'ı sadece tek parametre ile çalıştırırsanız "target=_blank" yapmış olursunuz zaten. Bunu bir deneyin.

window.open("falanca.html");

fizikci
28 Mart 2006 12:32
5. ben sizi anlıyorumda sayın fizikçi ama kendimi anlatamıyorum sanırım.
tm target=_blank oldu.
yalnız bu yeni sayfa popup açılıyor. benim sıkıntım popup olmasında ayrıca :(
cetinz
28 Mart 2006 12:41
6. Eğer yanlış anlamadıysam, bir nevi lookup sayfası açmak istiyorsunuz. Server taraflı bu işi yapmaktansa, HTML buton kullnıp onClick olayında çağırsanız nasıl olur diye sormak istiyorum.

Wesselam...
mennan
28 Mart 2006 13:50
7. Şöyle bişey denedim oldu. Bu popup değil. (hem de target=_blank :)
<body onload="aydi.click()">
<a id=aydi href="http://www.bilisim-kulubu.com" target="_blank">Falanca</a>
</body>

Tabi çok saçma bir attraksiyon oldu bu. Sırf window.open'ı kullanmamak için böyle bir şey yazdım. Mennan'ın da dediği gibi probleminizi başka bir şekilde çözmeye çalışsanız daha iyi olur. (Bazen biz programcılar bir çözüm yöntemine takılır ısrarla o yöntemi deneriz. Bu gibi durumlarda iki dakka dışarı çıkıp hava almak, biraz dinlenip öyle devam etmek çok faydalı oluyor. Problemi daha iyi teşhis edip, daha güzel çözüm geliştirebiliyorsunuz.)
fizikci
28 Mart 2006 14:03
8. 

private void devamBtn_Click(object sender, System.EventArgs e)
{
   seviye=seviyeDDL.SelectedValue;
   ilce=ilceDDL.SelectedValue;
   okul=okulDDL.SelectedValue;
       
   string script= "<scr"+"ipt> " ;
   if (listeDDL.SelectedValue=="ilcebasari")
      script+="window.open('ilcebasari.aspx?seviyeID="+seviye+"&ilceID=0&okulID=0')"; 
   else if (listeDDL.SelectedValue=="ilk100" & ilce=="0" )
      script+="window.open('liste.aspx?seviyeID="+seviye+"&ilceID=0&okulID=0&ilk100=1')"; 
   script+= "</scr"+"ipt>";

   Response.Write(script);
}


bu butonun click olayı,
şimdi ben anlamadım ki bu butonu html buton yapsam nereye yazacam a tag ını ve a nın href degerini

:( yoruldum galiba, kardeşim benim sitemde dolanmak istiyosanız popup engelleyiciyi kaldırcaksınız diyesim geliyo ama diyemiyorum, müşteri veli nimetimizdir nitekim. :D
cetinz
28 Mart 2006 15:12
9. :)

Server tarafında yapmayalım bu işi. Şöyle yapalım :

<button onclick="devamEt()">Devam</button>
<script>
function devamEt()
{
   seviye = seviyeDDL.value;
   ilce = ilceDDL.value;
   okul = okulDDL.value;
 
   window.open('liste.aspx?seviyeID='+seviye+'&ilceID='+ilce+'&okulID='+okul); // artık nasılsa...
}
</script>

Burada servera gidip gelmeden (postback yapmadan) butona tıklanınca popup'ımızı açıyoruz.

Pekala popup yapmak istemezsek ne yapacağız? Öncelikle popup nedir? Popup, Javascript ile açılan browser penceresine denir. Madem öyledir başka pencerede açmak istiyorsanız popup'dan kurtuluş çaresi yoktur. Sadece <a href="..." target=_blank></a> gibi bir linke kullanıcı tıklarsa Javascript kullanılmamış oluyor, popup blockerlar bunu görmezden geliyor. Ama bunu nasıl yapacağız? Şöyle birşey yapmak mümkün: Bir tane <a id=devamLink href="degisecek">DEVAM</a> şeklinde link tanımlarız (yazarız). Sonra combo'lardan değer seçildikçe bu link'in href'ini değiştiririz. Aşağıdaki gibi:

<select id=seviyeDDL onchange="changeDevamLink()">
   <option value=1>Seviye 1</option>
   <option value=2>Seviye 2</option>
</select>
<select id=okulDDL onchange="changeDevamLink()">
   <option value=1>Okul 1</option>
   <option value=2>Okul 2</option>
</select>
<select id=ilceDDL onchange="changeDevamLink()">
   <option value=1>İlçe 1</option>
   <option value=2>İlçe 2</option>
</select>

<a id=devamLink href="degisecek" class="butonGibi">DEVAM</a>

<script>
function changeDevamLink()
{
   seviye = seviyeDDL.value;
   ilce = ilceDDL.value;
   okul = okulDDL.value;

   devamLink.href = 'liste.aspx?seviyeID='+seviye+'&ilceID='+ilce+'&okulID='+okul); // artık nasılsa...
}
</script>

fizikci
28 Mart 2006 15:45
10. Bir diğer yöntem ise şudur:

<form action="liste.aspx" target="_blank" method="GET">
   <select id=seviyeDDL>
      <option value=1>Seviye 1</option>
      <option value=2>Seviye 2</option>
   </select>
   <select id=okulDDL>
      <option value=1>Okul 1</option>
      <option value=2>Okul 2</option>
   </select>
   <select id=ilceDDL>
      <option value=1>İlçe 1</option>
      <option value=2>İlçe 2</option>
   </select>

   <input type=submit value="DEVAM">
</form>

Form'un target'ına dikkat. Method'un GET ya da POST olması tercih meselesi.

Tabi bunları ASP.NET ortamında yapmak zor olabilir. Üzebilir programcıyı. Biz de boşuna PHP'yi savunmuyoruz zaten. :) PHP gibi script dilleri, -ASP.NETJSP gibi- derlenen, ultra high technology dilleri rahatlıkla dövebiliyor. Neden? Çünkü basit, esnek, bütün kontrolü programcıya veriyor. Eğer programcı HTML ve Javascript biliyorsa istediğini yapabiliyor.
fizikci
28 Mart 2006 15:53
11. yarın deneyecegim son 2 öneriyi, teşekkürler fizikçi, teşkkürler mennan
cetinz
28 Mart 2006 18:29
12. 
function FormOnay()
{
    seviye=document.Form1.seviyeDDL.value;
    ilce=Form1.ilceDDL.value;
    okul=Form1.okulDDL.value;

    if (Form1.listeDDL.value=="ilcebasari"  )
        action="ilcebasari.aspx?seviyeID="+seviye+"&ilceID=0&okulID=0";   
    else
        action=Form1.listeDDL.value+".aspx?seviyeID="+seviye+"&ilceID="+ ilce+"&okulID="+ okul+"";

    alert(Form1.action);
    Form1.target="_blank";
    Form1.submit();
}

...
...
<INPUT id="devamBtn" onClick="return FormOnay();" type="button" value="Devam">

böyle herşey tm. Yalnız bu action olayından sonra bu sayfa üzerinde herhangi bir işlemde servera bir gönderme yapıldıgında action ile yapılmış son aksiyon tekrar yapılıyor :(

bi çözümü olabilir mi ki? ben baya düşündüm ama
cetinz
29 Mart 2006 17:20
13. bu arada form submitle açmaya çalıştıgınız yeni sayfa için şöyle bir hata alabilrisiniz.

The viewstate is invalid for this page and might be corrupted.

ozaman yapmanız gereken açılacak yeni sayfanın üst tanımlama kısmına enableViewStateMac="False" eklemek. document özelliklerinde enableViewStateMac varsayılan olarak false gelmesine ragmen, tanımlama kısmında yazmıyor. siz tanımlama kısmına yazmalısınız.

tanımlama kısmı derken nerden bahsediyorum ama di mi, buna da açıklık getirmek lazım :D

<%@ Page language="c#" Codebehind="liste.aspx.cs" AutoEventWireup="false" Inherits="ILSTS.liste" enableViewStateMac="False"%>