R Dili ile İstatistiksel Programlama

Slides:



Advertisements
Benzer bir sunumlar
STRİNG FONKSİYONLARI.
Advertisements

JAVA TEMELLERİ GİRİŞ JAVA TEMELLERİ GİRİŞ signalsec.com & mialkan.com.
SCANNER SINIFI ve KLAVYEDEN VERİ OKUNMASI
Göstericiler (Pointers)
Nesneye Yönelik Programlama
Programlama-II (Java ile Bilgisayar Programlama)
Bölüm 2 C Dilinin Temelleri
C Programlama Diline Giriş
Değişken Bildirimleri
Elektrik-Elektronik Mühendisliği Bölümü DİZİLER C Programlama Dili Yaz Stajı Cengiz TEPE SAMSUN 2007.
String Kütüphanesindeki Arama Fonksiyonları
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 4: Diziler
Fonksiyonlar ve Alt Programlar
KOPYA YAPICI FONKSİYON, STATİK ELEMANLAR, ARKADAŞ SINIF VE FONKSİYONLAR, NESNE DİZİLERİ Yılmaz Kılıçaslan.
Nesneye Dayalı Programlama
Erişim Denetimi, Fonksiyon
Fonksiyonlar Fonksiyon nedir?
İnternet Programcılığı II
İSİM UZAYLARI (NAMESPACE)
Bilgisayar Programlama
PROGRAMLAMA DİLLERİNE GİRİŞ Ders 8: Windows Formları
Ses Kontrol Metodlar ile ilgili son birkaç söz Tekrar: Programlama için başlıca 3 model.
FONKSİYONLAR.
Celal Bayar Üniversitesi Hasan Ferdi Turgutlu Teknoloji Fakültesi
Önceki Dersi Hatırlama !!
Diziler Adres Kavramı Nesnelerin Adresleri sizeof Operatörü
Bilgisayar Programlama
JAVA’DA DÖNGÜLER.
İnternet Programcılığı II
Fonksiyonlar Fonksiyon Tanımı Değer Döndürmeyen Fonksiyonlar
Nesneye Dayalı Programlama
Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü ++ Bilişim Enstitüsü C ++ Veri.
SINIFLAR VE DİNAMİK BELLEK YÖNETİMİ VE SINIFLARIN DİĞER ÖZELLİKLERİ Yılmaz Kılıçaslan.
Trees, Vectors, Iterators. ADT Abstract Data Type (ADT) vs implementation -Soyut Veri Türleri - Uygulamaları.
Ders İçeriği Liste Soyut veri yapısı (ADT)
C PROGRAMLAMA FONKSİYONLAR Adres ile Fonksiyon Çağırma Pointer (İşaretçiler) ile Fonksiyon Çağırma Rekürsif Fonksiyonlar.
VERİ TİPLERİ VE DEĞİŞKENLER
Linux İşletim Sistemi Altında Bileşen Tabanlı Yazılım Geliştirmeye Olanak Sağlayan XCOM Sistemi İçin Java Desteği Ahmet Mutlu.
SANAL FONKSİYONLAR VE ÇOKBİÇİMLİLİK Yılmaz Kılıçaslan.
Bilgisayar Programlama. Tek bir değişken tanımlamak için aşağıdaki gibi bir yazım yeterlidir. int i; Hatırlanacağı gibi bu tarz bir tanımlamada.
DİZİLER Arrays.
JAVA PROGRAMLAMA ORNEKLER
İKMAP İnternet 1 Ders Notu
BTP206– Görsel Programlama II
Mobil Uygulama Geliştirme
Modül 1: Giriş. Genel Bakış Temel.NET kavramları Geliştirme ortamında gezinti Bir C# projesi oluştur Use Visual Studio.NET Veriye eriş Hata ayıkla ve.
İTÜ Uçak ve Uzay Bilimleri Fakültesi Meteoroloji Mühendisliği Bölümü uubf.itu.edu.tr TÜBİTAK (111Y319) COST (ES1004) toros.
Veri yapıları Hafta3 Dizi Yapıları.
BİLGİSAYAR programlama II
Temel Veri Yapıları Veri Yapıları 1. Bölüm 1. 2 Programlarımızda tanımladığımız nesneler ya tek parçadan ya da birden fazla parçadan oluşurlar. Tek parçadan.
Genel Kavramlar Bölüm - 1. YAZILIM Bilgisayara işlemler yaptırabilmek ve karar verdirtebilmek için yazılan kalıplara denir. Yazılım, genel olarak donanım.
Programlama Dillerinin Prensipleri
VERİ ve BELLEK & DEĞİŞKENLERİN SAKLANMASI Asst.Prof.Dr.Misket YEKTAY Gizem AYIK.
Bölüm 2 C Dilinin Temelleri Genel Kavramlar Yazım ve Noktalama Kuralları C Kütüphaneleri C Dilindeki Sözcükler Değer Sabitleri Veri Tipleri Değişkenler.
JAVA 1. GİRİŞ & TARİHÇE Java, Sun Microsystems mühendislerinden James Gosling tarafından geliştirilmeye başlanmıştır. Açık kodlu. Nesneye yönelik. Düzlemden.
İbrahim Olgaç PROGRAMLAMA DİLLERİ SUNUMU C#
Programlamaya Giriş-I Bölüm-1. Algoritma Algoritma günlük yaşamımızda yaptığımız işler sırasında sıklıkla kullandığımız bir yöntemdir. Algoritma, bir.
Fonksiyonlar ve Diziler
C Programlama Dili Bilgisayar Mühendisliği.
C’de Fonsiyonlar Aslı Ergün.
METHODLAR VE KOŞULLAR.
C Programlama Diline Giriş
C Programlama Yrd.Doç.Dr. Ziynet PAMUK BMM211-H11
Doğu Akdeniz Üniversitesi Bilgisayar Ve Teknoloji Yüksek Okulu
YAPISAL PROGRAMLAMA Hafta-6
ARDUİNO Arduino Eğitimleri Bölüm 3 Programlama Dili Temelleri
Veri Tipleri 12/4/2018.
Bilgisayar Bilimi Fonksiyonlar-2.
C ile Programlamaya Giriş
Sunum transkripti:

R Dili ile İstatistiksel Programlama Yard.Doç.Dr. Mehmet Hakan Satman – İstanbul Üniversitesi Ekonometri Bölümü, 2012

R Dili ile İstatistiksel Programlama R, istatistikçiler için tasarlanmış mesleğe özel bir dil ve bir programlama ortamıdır. GPL (GNU Public License) ile dağıtılır. Windows, Linux ve MacOsX için derlenmiş kod ve binlerce paket indirilip kurulmaya hazırdır.

Paketler R'de harici ve dahili olmak üzere yaklaşık 4000 adet paket bulunur. Bu paketler büyük oranda GPL ve LGPL ile lisanslanmıştır. Paketler program üzerinden kolaylıkla kurulur. Derleme ve yükleme aşamalarında çoğu zaman kullanıcı müdahalesi gerekmez.

Dahili Paketler base (mean, median, var, cov, cor, ...) graphics (plot, points, lines, ...) stats (princomp, factanal, kmeans, …) utils (read.csv, unzip, read.table, …) compiler (bytecode compiler) datasets

Harici Paketler REPL (Read-Eval-Print Loop) interpreter üzerinden install.packages(“paketadı”) ifadesiyle indirilip kurulurlar. http://cran.r-project.org/ Adresinden tüm paketlerin bir listesi ve açıklamaları elde edilebilir. Yüklenen paketler sonradan require(“paketadı”) ifadesiyle çağırılır.

Harici Paketler Zaman serileri Robust istatistik Çok değişkenli istatistik Bio-istatistik Optimizasyon Yapay zeka Paralel programlama vs.

Dil Vektör ve matrisler üzerinde işlem yapabilme Dahili ~700 fonksiyon Binlerce harici paket C dil yapısına benzerlik C, C++, Fortran ve Java'dan kütüphane dahil edebilme özelliği

Değişken Tipleri R'de değişkenler; integer double character logical complex olabilir. Bu değişkenlerin vektörleri de birer değişken tipi gibi davranır.

Değişken Tipleri > a<-3 > typeof(a) [1] "double" > class(a) [1] "numeric" > > b<-"Hi!" > typeof(b) [1] "character" > class(b) Typeof fonksiyonu ile değişkenin hangi primitif tipe sahip olduğu bilgisi alınırken, class ile değişkenin OOP anlamında sınıf bilgisine ulaşılır.

Fonksiyonel Dil Özellikleri Parametreler fonksiyonlara istenilen sırada ve isimle aktarılabilir: Topla ← function(a,b){ return(a+b) } A ← Topla (a=8, b=10) B ← Topla (b=10, a=8) print(A == B) Sonuç: TRUE

Fonksiyonel Dil Özellikleri Varsayılan parametre değerleri, fonksiyon tanımlanırken belirlenebilir: Power ← function (x, p=2) { return ( x ^ p ) } print (Power(10)) Sonuç: 100

Değer ile Gönderme Parametreler, eğer yerleşik R tipleri ise fonksiyonlara değer olarak aktarılır. f<-function(x){ x<-10 } a<-20 f(a) print(a) Sonuç: 20

Değer ile Gönderme R'nin bu davranışı Java ile benzerdir. Java'nın primitif değişken tipleri olan double, int, float, byte, boolean, char, long, short fonksiyonlara değerleri ile aktarılırken, tüm nesneler referans ile aktarılır. R'de de referans ile aktarım, nesne yönelimli programlama ile mümkün olur.

Öz yineleme (Recursion) Factorial ← function (x){ if(x <= 1) { return (1) }else{ return ( x * Factorial(x - 1) ) } print ( Factorial(5)) 120

Vektörler Dilin Dahili Elemanlarıdır! > x <- 1:7 > print(x) [1] 1 2 3 4 5 6 7 > y <- rep(5,10) > y [1] 5 5 5 5 5 5 5 5 5 5 > z <- x * 10 > z [1] 10 20 30 40 50 60 70 > length(z) [1] 7 > z[1] [1] 10 > z[1:3] [1] 10 20 30

Matrisler ve Uzantıları Vektörler matrislere kolayca dönüştürülebilir: > x<-1:9 > print(x) [1] 1 2 3 4 5 6 7 8 9 > dim(x) <- c(3,3) > x [,1] [,2] [,3] [1,] 1 4 7 [2,] 2 5 8 [3,] 3 6 9

Matrisler ve Uzantıları > x<-1:9 > print(x) [1] 1 2 3 4 5 6 7 8 9 > A<-matrix(x, byrow=TRUE, nrow=3, ncol=3) > A [,1] [,2] [,3] [1,] 1 2 3 [2,] 4 5 6 [3,] 7 8 9

Listeler Matrislerde her satır için eşit sayıda sütun elemanı veya her sütun için eşit sayıda satır elemanı yer alır. Listeler matrislere benzeyen veri yapılarıdır. Ancak her bir liste elemanı farklı boyutlardaki vektörlerden oluşabilir. Bir liste başka bir listeyi eleman olarak tutabilir.

Listeler > alist <- list( a="string variable", b=5, c = c(1,2,3), d=list(7,8,9)) > alist $a [1] "string variable" $b [1] 5 $c [1] 1 2 3 $d $d[[1]] [1] 7 $d[[2]] [1] 8 $d[[3]] [1] 9

Listeler Listeler C++ 'daki map<?,?> taslaklarına benzer şekilde dizayn edildiğinden, liste elemanlarına indisler veya anahtarlarla erişilebilir. > print(alist[1]) $a [1] "string variable" > print(alist["c"]) $c [1] 1 2 3

Listeler Listeler C++ 'daki map<?,?>::iterator taslağında olduğu gibi döngü elemanına dönüştürülebilir. for (i in alist){ print(i) } Tüm elemanlar sırayla “i” değişkeninde saklanır.

Sınıf ve Nesneler Sınıflar soyut veri yapılarıdır. Bir sınıf için bellekte yer ayrıldığı anda bir nesne elde edilmiş olur. Nesnelere referans ile erişim mümkün olur.

Sınıflar public class MyClass { public String name; } setClass("MyClass", representation( name="character" )

Nesneler MyClass mc; mc = new MyClass(); mc.name = “Fuzuli”; mc <-new("MyClass",name="Fuzuli") mc@name ← ”Fuzuli” Java'da varsayılan olarak nesnelerle ilgili tüm işlemlerde referans ile erişim sağlanır. Mc, MyClass sınıfından örneklendirilen bir sınıftır. Fonksiyonlara parametre olarak gönderildiğinde referans olarak gönderilir. Ancak nesneye ait bir veri değiştirilirse nesnenin kopyası oluşturulur. Yalnızca referans ile erişim gerekliyse setRefClass kullanılmalıdır.

Referans ile Erişim setRefClass("MyClass", fields=list( name="character" ) obj1<-new("MyClass", name="Fuzuli") f<-function(x){ x$name = "Degisti!" } f(obj1) obj1$name Sonuç: obj1$name değişkeni fonksiyon için değişir.

C / C++ ile etkileşim R, büyük oranda C ile; kısmen de R ile yazılmıştır. R'den dinamik kütüphane olarak derlenmiş ve herhangi bir dilde yazılmış binary kütüphaneler çağırılabilir. Bu kütüphaneler büyük oranda Fortran, C ve C++ 'da yazılıp derlenmiştir.

C++ C++ fonksiyonları, R 'den çağırılabilecek şekilde tanımlanmalıdır: extern “C” { const char *concat(const char *, const char *); } const char *concat(const char *c1, const char *c2){ string s1 = string(c1); string s2 = string(c2); stringstream ss; ss<<s1<<s2; return(ss.str().c_str()); Sample.cpp

C : MySum Fonksiyonu MySum.c #include <R.h> #include <Rdefines.h> SEXP MySum (SEXP pnum1, SEXP pnum2, SEXP result, SEXP env){ double num1 = NUMERIC_POINTER (pnum1)[0]; double num2 = NUMERIC_POINTER (pnum2)[0]; NUMERIC_POINTER (result)[0] = num1 + num2; return(result); } MySum.c

MySum.c 'nin Derlenmesi İşletim sistemi konsolu $ R CMD SHLIB MySum.c gcc -std=gnu99 -I/usr/share/R/include -fpic -O3 -pipe -g -c MySum.c -o MySum.o gcc -std=gnu99 -shared -o MySum.so MySum.o -L/usr/lib/R/lib -lR $ İşletim sistemi konsolu

MySum.so Derleme sonrasında işletim sistemi Linux ise MySum.so, Windows ise MySum.dll dosyaları oluşur. Dinamik kütüphane fonksiyonları sayesinde söz konusu binary kütüphane içinde yer alan tüm fonksiyonlar R'den çağırılabilir.

MySum 'ın R'den çağırılması > dyn.load("MySum.so") > a<-as.double(9) > b<-as.double(5) > c<-as.double(0) > .Call("MySum",a,b,c,.GlobalEnv) [1] 14 > print(c) 14

C 'den R fonksiyonları çağırma Bootstrap ve Genetik algoritma gibi yöntemler belirli bir istatistiğin veya uygunluk değerinin hesaplanması için algoritma dışında tanımlanmış bir fonksiyona ihtiyaç duyarlar. Algoritma C veya C++ 'da yazılmışken, bu algoritma dışı fonksiyon R'de yazılmış olabilir. Bu bağlamda harici dillerden R fonksiyonlarının çağırılabilmesi oldukça önemlidir.

C'den R Fonksiyonları Çağırma SEXP fn, sexp_fvec, result; fn = lang2 (evalFunc, par); sexp_fvec = eval (fn, env); result = NUMERIC_POINTER (sexp_fvec)[0];

Java ile Etkileşim R, C'de yazıldığından Java ile dolaysız olarak etkileşime giremez. Ancak Java büyük oranda C'de yazıldığı için R içinde bir dinamik kütüphane yardımıyla bir Java sanal makinesi belleğe yüklenip çalışır hale getirilebilir. Java'da onlarca matematik ve istatistik alanı için yazılmış kütüphaneden bu şekilde faydalanılır. Örneğin Rweka, Weka adlı Java kütüphanesi için yazılmış bir örtü pakettir.

rJava paketi Rjava, JNI (Java Native Interface) arabirimini kullanarak Java'da yazılıp derlenmiş sınıfların örneklendirilmesine ve örnekler için fonksiyonların çağırılabilmesine hizmet eder. R içinden install.packages(“rJava”) yazılarak kolayca kurulabilir. Ancak paket, Java'dan R fonksiyonlarını çağırma konusunda aynı kolaylığı sunmaz.

rJava Örneği > require("rJava") > jvm <- .jinit() > str <- .jnew("java.lang.String", "Hi!") > .jcall(str, method="toString",returnSig="Ljava/lang/String;") [1] "Hi!"

Java'dan R Çağırma JRI (Java R Interface) JNI arabirimi ile Java'dan R fonksiyonlarının çağırılması için kullanılmaktadır. Başlangıç ve orta düzey kullanıcılar için çalıştırma işlemine hazır hale getirme işlemleri zor olabilir. Rserve, R içinden açılan sunucu soketler yardımıyla çalışır. Böylece soket kütüphanesine sahip herhangi bir dilden R'ye ulaşılabilir. Java ve Php'den bu yolla R fonksiyonlarına ulaşılabilir.

RCaller R hakkında daha az fikir sahibi Java programcıları tarafından tercih edilebilir. Java'dan R çağırma ile ilgili basit bir çözüm yaklaşımı sunar. Açılan bir R prosesi üzerinden komutların gönderilmesi, çıktıların ise XML formatına dönüştürülüp ayrıştırılması temeline dayanır. LGPL lisansı ile bir çok ticari Java uygulamasının R ile entegrasyonu sağlanmıştır.

RCaller RCaller caller = new RCaller(); RCode code = new RCode(); caller.setRscriptExecutable("/usr/bin/Rscript"); double[] x = new double[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; double[] y = new double[]{2, 4, 6, 8, 10, 12, 14, 16, 18, 30}; code.addDoubleArray("x", x); code.addDoubleArray("y", y); code.addRCode("ols<-lm(y~x)"); caller.setRCode(code); caller.runAndReturnResult("ols"); double[] residuals = caller.getParser().getAsDoubleArray("residuals"); double[] coefficients = caller.getParser().getAsDoubleArray("coefficients"); double[] fitteds = caller.getParser().getAsDoubleArray("fitted_values");

RCallerPhp RcallerPhp, Java API 'ye benzer bir şekilde R fonksiyonlarının Php 'den çağırılabilmesine olanak tanır. Arka planda istatistiksel hesap ve raporlama yapan web projelerinin önceden yazılmış etkin fonksiyonları çağırabilmesi yolu açılmış olur. Web arayüzü ve uygulama katmanları kolaylıkla ayrılabilir.

RCallerPhp 1 <?php 2 include_once ("RCaller.php"); 3 4 $rcaller = new RCaller(); 5 $rcaller->setRscriptExecutable("/usr/bin/Rscript"); 6 $rcode = new RCode(""); 7 $rcode->clear(); 8 $rcode->addRCode("mylist <- list(x=1:3, y=c(7,8,9))"); 9 10 $rcaller->setRCode($rcode); 11 $rcaller->runAndReturnResult("mylist"); 12 13 $x = $rcaller->getParser()->getAsStringArray("x"); 14 $y = $rcaller->getParser()->getAsStringArray("y"); 15 16 echo ("X is <br>"); 17 print_r ($x); 18 19 echo ("<br><br>Y is <br>"); 20 print_r ($y); 21 ?>

Diğer implementasyonlar R, bir kısmı R 'de yazılmış bir programlama ortamıdır. Eğer yorumlayıcı kısmı başka bir platformda yeniden yazılabilirse, R ile yazılan kısmın yeniden yazılmasına gerek kalmaz. Örneğin renjin, R dilinin Java implementasyonudur. Yorumlayıcı kod Java'ya dönüştürülmüştür.

renjin Renjin projesine http://code.google.com/p/renjin adresinden erişilebilir. Java'nın çalışabildiği herhangi bir ortamda (Google app engine, Glassfish, Desktop, Android) R programlarının çalışabilmesi amaçlanır. Büyük oranda orijinal interpreter'ın Java koduna dönüştürülmesi yoluyla yazılmaktadır. Yapım aşamasındadır

Sorular?