LinkedIn FriendFeed Twitter

PCA (Principal Component Analysis)

by Ordinaryus 10. July 2010 16:13

PCA boyut düşürmede kullanılan en temel metotlardan biridir. Ancak bunu anlamadan önce temel olarak anlaşılması gereken başka kavramlarda mevcuttur. Bundan sonra PCA hakkında fikir yürütebilmemiz daha kolay olacaktır bu nedenle açıklamaya bu temel kavramlardan başlıyorum.

Bir veri kümesi için bakılabilecek belli özellikler vardır. 1 boyutlu bir vektörel data için ortalama, standart sapma veya spread tanımlanabilmektedir. Burada spread haricindeki diğer terimleri biliyoruz. Spread ise aynı standart sapma gibi ancak N-1 ile bölüm olan halidir.

1

Bunun haricinde kovaryans terimini de bilmemiz PCA kavramak açısından önemlidir. Kovaryans 2 boyutta çalışan bir değer kriteridir. Çok boyutlu verilerde birbirleri arasında işlem yapılmaktadır. 3 boyutlu bir veri için öncelikle xy, xz, yz arasında kovaryans hesaplanabilmektedir. Bir vektörün kendisi ile kovaryansı aslında varyansını vermektedir.

2

Kovaryansın almış olduğu değer pozitif veya negatif olmasına bakılarak 2 boyut arasındaki ilişkinin doğru veya ters orantılı olduğu bilgisi elde edilebilir. Bir bakıma bize değişimlerini veren grafiğin eğiminin bilgisini vermektedir.

Kovaryans işleminin sadece 2 boyut arasında olduğundan bahsetmiştik peki ya daha fazla boyutta veriler için elimizdeki veri setini nasıl kullanacağız? Bunun için her ikişer boyuttu ayrı ayrı hesaplamaktayız. Burada n!/[(n-2)!*2] adet kovaryans hesaplanması işlemi vardır. Bunlar daha sonra kovaryans matrisi olarak adlandırılan matris üzerine aktarılmaktadır.

3

PCA konusunda kullanılacak temel bilgilerden bir diğeri ise özdeğer ve özvektörlerdir. Bir matrisi özdeğer ve özvektörleri ile temsil edebiliriz. Özvektörler birbirine dik olan ve boyut sayısı kadar bulunan vektörlerdir. Özvektörlerin ve özdeğerlerin nasıl hesaplandığını zaten bilmekteyiz. Kısaca anımsatacak olursak.

Bir A matrisi için det(λ-A)=0 için oluşan denklemde λ değerleri hesaplanır ve bunlar daha sonra yerine konur ve bir ξ vektörüyle çarpımı sıfıra eşitlenir buradaki ξ vektörü o matrise ait özvektörlerdendir, λ ise özdeğer olmaktadır.

PCA ise verilen datadaki benzerlikleri ve farklılıkları ölçmenin bir yoludur. Veri sıkıştırmada veri kaybına neden olmaksızın kullanılabilmektedir. Burada adım adım PCA için gereken adımları takip edeceğiz.

    Ortalama değerleri verilerden çıkar. Bu sayede kovaryans hesaplarken ortalamaları doğrudan 0 kabul eder ve bunu hesaplamakla uğraşmayız.
    Kovaryans matrisi hesaplanır
    Kovaryans matrisine ait özdeğer ve özvektörler çıkarılır. (Burada özvektörlerin uzunluklarının normalize olması önemlidir yani boyları 1 olmalıdır, bunlar daha sonra özdeğerlerine göre sıralanacaktır)
    Elemanların seçilmesi ve feature vektörü oluşturulması

Hesaplamalar sonucunda görüleceği üzere özdeğerler arasında farklılıklar bulunmaktadır. Bu farklılıkları daha sonra kullanacağız. Veri kümesinin principle component değeri en yüksek özdeğerli özvektör olmaktadır.

PCA yaparken özvektörler içerisinden en değerli olan p tanesi kullanılabilmektedir. Bunun için en büyük özdeğerlere sahip özvektörler seçilmektedir. Burada veri kaybı yaşanmaktadır ama özdeğerleri ne kadar küçükse kaybolan veride o ölçüde önemsiz olmaktadır.

Özvektörlerde p adet seçildikten sonra feature vektörü kolaylıkla elde edilebilir. Bunun için FV = [eig1 eig2 … eigp] olmaktadır.

Bu adımlarda tamamlandıktan sonra artık yeni veri kümemize ulaşabiliriz. Bu veri kümesi boyutu azaltılmış olan veri setini temsil etmektedir. Bunun için elde edilen yüksek öneme sahip özvektörler ve özdeğerler kullanılacaktır.

[SonVeri] = [SatırÖzVektörleri] x [SatırVerileri]

Burada belirtilen SatırÖzVektörleri özvektörlerin en yüksek önceliklisi en üstteki satırda yer alacak şekilde bir matris oluşturulması sonucu elde edilen matristir. SatırVerileri ise diğer matriste olduğu gibi bu vektördeki değerlerin yer aldığı matrisi temsil etmektedir. Elde edilen Final data ise bizim p boyutta verilerimizdir.

PCA kullanılarak boyut küçültme işlemi de yapmak mümkündür. Bunun için kullanılan datayı D boyuttan d boyuta küçültmek için D-d adet en önemsiz özvektörler atılmaktadır. Daha sonra kalanlardan görüntü veya diğer veriler geri getirilebilmektedir.

Tags:

Numerical Methods

Lagrange Interpolasyon Metodu

by Ordinaryus 27. October 2009 01:53

Bu yöntemde interpolasyon işlemi için kullanılan bir metoddur. Lagrange polinomları kullanılarak yapılmaktadır. Ancak bunun öncesinde interpolasyon kavramını kısaca açıklayarak bu yöntem için yazmış olduğum koda yer verelim.

İnterpolasyon işlemi ara değer bulma demektir. Elimizdeki sınırlı sayıdaki verinin kullanılması ile bunların ara değerlerine karşılık gelen değerler için fonksiyonun alacağı değeri bulmak amaçlanmaktadır. Bu doğrultuda Lagrange yöntemi kullanmak uygun olmaktadır.

Bu yöntem için yazmış olduğumuz koda bakacak olursak.

double lagrangeInterpolation(double x_inter, valarray<double> x, valarray<double> y)

{

      double S = 0;

      double pr;

      int k2;

      for(int k1=0; k1<x.size();k1++)

      {

            pr = 1.0;

 

            for(k2=0; k2<k1; k2++)

                  pr *= ((x_inter-x[k2])/(x[k1]-x[k2]));

 

            for(k2=k1+1; k2<x.size(); k2++)

                  pr *= ((x_inter-x[k2])/(x[k1]-x[k2]));

     

            S += y[k1]*pr;

      }

      return S;

}

 

Burada önemli olan noktalardan biri C++ içerisinde kullanılan valarray için tüm değerlerimizi kullanmanın gereksiz oluşudur. Burada ara değerleme yaparken performans arttırmak açısından aranan noktanın komşularını seçmekte yeterli olmaktadır. Bu şekilde elimizde var olan 6 – 8 nokta ilede uygun sonuçlar elde etmemiz mümkün olmaktadır.

Tags:

Numerical Methods

Newton-Raphson Method

by Ordinaryus 17. October 2009 14:05

Bu yöntemde önceki yazımda bahsettiğim metoda benzer şekilde kök bulma problemi üzerine geliştirilmiştir.

Önceki yöntemden farklı olarak reel çözüm kümesi üzerinde işlem yapıyorsak daha başarılı sonuçlar vermektedir. Burada önemli sorunlardan biri başlangıç noktasının güzel seçilmesinin önemli olduğudur.

image

Sürekli fonksiyonlarda belirlenen başlangıç noktasından çizilen teğetin ekseni kestiği yerin yeni fonksiyona projeksiyonu ile 2. iterasyon için başlangıç koşulu belirlenmiş olur ve bu şekilde istenen yakınsama gerçeklenene kadar devam edilir.

image

O zaman bu yöntem ve türev işlemi için yazmış olduğum matlab ve c kodlarına aşağıdan ulaşabilirsiniz.

double newtonRaphson(double Vd, double T)

{

                double V;

                do

                {

                               V = Vd;

                               Vd = V - (circuit(V)/derivative(V));

               

                }while(abs(Vd-V)>epsilon);

               

                return Vd;

}

 

double derivative(double point)

{

                return (circuit(point+epsilon)-circuit(point-epsilon))/(2*epsilon);

}

 

Matlab için yazılmış olan türev ve newton-raphson M-fileları aşağıda yer almaktadır.

 

% derivative funciton

function y = derivative(point)

    global eps;

    y = (circuit(point+eps)-circuit(point-eps))/(2*eps);

end


function y = newtonRaphson(V)

    global eps;

    Vd = V+1;

   

    while(abs(Vd-V)>eps)

    V = Vd;

    Vd = V - (circuit(V)/derivative(V));

    end

    y = Vd;

end

Tags:

Numerical Methods

Bisection Method

by Ordinaryus 14. October 2009 07:23

Bu yöntemde elimizde var olan denklemin kökünü bulmayı amaçlamaktayız. Burada bizim için önemli olan nokta belirli bir aralıkta kök bulma işlemini kullanırken türev alınması ve aralığın orta noktasının kökün ne tarafında kaldığını belirleyerek bu sınırları eski nokta ile güncellerek devam etmektedir.

image

Burada görüldüğü üzere her adımda orta nokta kökün durumuna göre kendini güncelleyerek kökün değerine yaklaşmaktadır. Belirli bir iterasyon sayısı veya hata miktarı göz önüne alınarak bu yöntemin kodunu MATLAB ve C++ ile yazmıştım bunları aşağıda görmekteyiz.

#include<iostream>

#include"math.h"

 

using namespace std;

double T = 293.0;

double Is = 1.5e-3;

double k = 1.38e-23;

double e = 1.56e-19;

double E = 2.0;

double R = 1.0;

double epsilon =0.00001;

double iteration = 100;

// equation constants

 

 

double bisection(double Vl, double Vr, bool &state);

double circuit(double V);

 

int main()

{

 

       double Vl = 0.0;

       double Vr = 2.0;

       double Vm = (Vr + Vl)/2.0;

       bool state = true;

      

       cout<<"Onur Varol 040060307 - © 2009"<<endl;

 

       do{

             if(Vl>Vr)

                    cout<<"\nMaximum value can't be less then minimum value"<<endl;

 

             cout<<"Enter minimum value of bisection interval"<<endl;

             cin>>Vl;

 

             cout<<"Enter maximum value of bisection interval"<<endl;

             cin>>Vr;

 

       }while(Vr<Vl);    // check if the interval is logicle

      

 

       double result = bisection(Vl,Vr,state);

 

       if((result + epsilon <= Vr) && (result + epsilon>= Vl))  // checks if the root is in the interval

       {

             cout<<"Result is : "<< result <<endl;

 

             (state == true) ? cout<< "Operation successfully completed" <<endl  //checks why the iteration stopped

                    : cout<< "Escape loop because of more than " << iteration << " iteration"<<endl;

       }

       else

             cout<<"Root is not between the interval"<<endl;

 

       system("PAUSE");

       return 0;

}

 

double bisection(double Vl, double Vr, bool &state)

{

       int counter = 0;

       double Vm = (Vl+Vr)/2.0;

       while (abs(Vl-Vr) > epsilon)  // loop until interval is enough width

       {

             Vm = (Vr + Vl)/2.0;

          

             if( circuit(Vl)* circuit(Vm) > 0)

                    Vl = Vm;

             else

                    Vr = Vm;

             if(++counter > iteration)  // if iteration takes too long it automaticly escapes

             {

                    state = false;  // save that counter reached limit

                    break;

             }

       }

       Vm = (Vr+Vl)/2.0;

       return Vm;

}

double circuit(double V)

{

       return (E - V - R*(Is*(exp(e*V/(k*T))-1)));  // 2nd order equation for voltage of diode

}

 

 

Matlab Kodunda ise birden çok M-file kullanıldığından sadece bisection için yazılmış olan kod parçağına burada yer vereceğiz.

function y=bisection(Vl, Vr)

global eps;

global counter;

counter = 0;

while (abs(Vl-Vr) > eps)

    Vm = (Vr + Vl)/2.0;

 

    if( circuit(Vl)* circuit(Vm) > 0)

        Vl = Vm;

    else

        Vr = Vm;

    end

   

    if(counter>500)

        fprintf('Escape loop because of too many iteration\n');

        break;

    end

    counter = counter + 1;

end

y = (Vl+Vr)/2;

end

 

Tags:

Numerical Methods

Powered by BlogEngine.NET 1.5.0.7
Theme by Mads Kristensen

Ordinaryus Hakkında

Hayata gözlerini İzmirde açtı. 3 yaşında legolarla oynadı =) Küçük yaşta baskete başladı zaten başka sporlarla arası hiç olmadı. Orta okulda matematikle ilgilendi. Liseyi Karşıyaka Anadolu Lisesinde okudu. 

İTÜ Elektronik Mühendisliğinden 2010 yılında mezun oldu. Fizik bölümünde çift anadala kabul oldu lisans hayatına Fizikten devam etmekte. Koç Üniversitesinde Bilgisayar Mühedisliği Master programına kabul edildi ve akademik hayatının ilk adımlarını sevdiği bir alanda çalışarak atıyor. Fizik ve Bilgisayarın ortak noktalarını gördü ve bunları geliştirmek amacıyla çalışıyor.

Yazılımı sevdi.. Başlarda herşeyle ilgilendi web programlama da yaptı, sokette programladı yeri geldi ağ yönetimi ile uğraştı. Görüntü işlemeden keyif aldı Makine Öğrenmesi ve Örüntü Tanımada kendisini geliştirmeyi istemekte.

2008te MSP oldu belkide bu blogu yazmaya başlamasında en büyük etken=) Bu görevi 2 sene boyunca sürdürdü. Bir yandan 2008de EuroSkillsde Mobil Robotik alanında Türkiyeyi temsil etti. Ardından 2009da Kanada da tekrardan yarışmacı olarak bulundu. Artık bu alanda hakemlik yaparak ve Robotino hakkında öğrendiklerini paylaşarak faydalı olmaya çalışıyor. 

Yapay Zeka, Görüntü İşleme, Kuantum Mekaniği, İstatistik Mekanik ve Bilişsel Bilimlerle ilgili. Geceleri kafasına göre takılıyo. Sabahlarıda öğrencilik yapıyo =)

gibi gibi... 

 

Page Rank

Loading

Google Translate


Şuan ne okuyorum

Bilişsel Psikoloji

Singularity is Near


Ayrıca okuduklarımdan seçtiğim kitaplara buradan ulaşabilirsiniz..

Okuduklarımı üye olarak takip etmek için ise aşağıdaki RSS bağlantısını kullanabilirsiniz. Ayrıca bana kitapta hediye edebilirsiniz =)


CCL


Copyright © Ordinaryus Says That by http://www.vypro.org/ is licensed under a Creative Commons Attribution-No Derivative Works 3.0