Spis treści. Optymalizacja jednowymiarowa

Podobne dokumenty
Równania różniczkowe zwyczajne

Zadania z rysowania i dopasowania funkcji

Ćwiczenia z przetwarzania tablic 2D

Spis treści. Dekoratory. 1 Dekoratory 1.1 Zadanie Zadanie Zadanie Zadanie 4

Akademia Górniczo-Hutnicza Wydział Elektrotechniki, Automatyki, Informatyki i Elektroniki

W4 Eksperyment niezawodnościowy

Podstawy programowania funkcjonalnego

Regresja wieloraka Ogólny problem obliczeniowy: dopasowanie linii prostej do zbioru punktów. Najprostszy przypadek - jedna zmienna zależna i jedna

Metody Numeryczne Optymalizacja. Wojciech Szewczuk

ALGORYTMY I STRUKTURY DANYCH

Spis treści. Wstęp. Regresja

Generowanie ciągów pseudolosowych o zadanych rozkładach przykładowy raport

TEMAT : KLASY DZIEDZICZENIE

//warunki początkowe m=500; T=30; c=0.4; t=linspace(0,t,m); y0=[-2.5;2.5];

Konstruktory. Streszczenie Celem wykładu jest zaprezentowanie konstruktorów w Javie, syntaktyki oraz zalet ich stosowania. Czas wykładu 45 minut.

ROZWIĄZYWANIE UKŁADÓW RÓWNAŃ NIELINIOWYCH PRZY POMOCY DODATKU SOLVER PROGRAMU MICROSOFT EXCEL. sin x2 (1)

Liczby losowe i pętla while w języku Python

Ćwiczenia z mainuplacji obrazem rozpocznijmy od wczytania pliku, który będziemy przetwarzać. Dla fizyków medycznych naturalnie będzie to plik DICOM.

Wstęp do programowania

Kurs rozszerzony języka Python

Wyszukiwanie binarne

6.4 Podstawowe metody statystyczne

Język C, tablice i funkcje (laboratorium, EE1-DI)

Rozdział 1. Zmienne losowe, ich rozkłady i charakterystyki. 1.1 Definicja zmiennej losowej

Spis treści. Morfologia matematyczna. 1 Morfologia matematyczna 1.1 Dylacja 1.2 Erozja 1.3 Otwarcie i zamknięcie 1.

Spis treści. Przedmowa... XI. Rozdział 1. Pomiar: jednostki miar Rozdział 2. Pomiar: liczby i obliczenia liczbowe... 16

Wstęp do programowania

Wstęp do Informatyki zadania ze złożoności obliczeniowej z rozwiązaniami

Sieci Mobilne i Bezprzewodowe laboratorium 2 Modelowanie zdarzeń dyskretnych

HISTOGRAM. Dr Adam Michczyński - METODY ANALIZY DANYCH POMIAROWYCH Liczba pomiarów - n. Liczba pomiarów - n k 0.5 N = N =

Programowanie - wykład 4

Ćwiczenia 3 ROZKŁAD ZMIENNEJ LOSOWEJ JEDNOWYMIAROWEJ

Rozkład zmiennej losowej Polega na przyporządkowaniu każdej wartości zmiennej losowej prawdopodobieństwo jej wystąpienia.

1 Wskaźniki i zmienne dynamiczne, instrukcja przed zajęciami

Optymalizacja systemów

Ćwiczenie 6. Transformacje skali szarości obrazów

Ćwiczenie 5. Python 3: Programowanie obiektowe i dziedziczenie


znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Szukanie rozwiązań funkcji uwikłanych (równań nieliniowych)

Języki i techniki programowania Ćwiczenia 3 Dziedziczenie

Wykład 1 Próba i populacja. Estymacja parametrów z wykorzystaniem metody bootstrap

Warsztaty dla nauczycieli

Programowanie strukturalne i obiektowe. Funkcje

Oznacza to, że chcemy znaleźć minimum, a właściwie wartość najmniejszą funkcji

Prawdopodobieństwo i statystyka r.

Funkcja jednej zmiennej - przykładowe rozwiązania 1. Badając przebieg zmienności funkcji postępujemy według poniższego schematu:

Instytut Fizyki Politechniki Łódzkiej Laboratorium Metod Analizy Danych Doświadczalnych Ćwiczenie 3 Generator liczb losowych o rozkładzie Rayleigha.

KADD Minimalizacja funkcji

Zaawansowany kurs języka Python

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Program 14. #include <iostream> #include <ctime> using namespace std;

Metody systemowe i decyzyjne w informatyce

Laboratorium kryptograficzne dla licealistów 4

Metody Rozmyte i Algorytmy Ewolucyjne

Zajęcia nr 2 Programowanie strukturalne. dr inż. Łukasz Graczykowski mgr inż. Leszek Kosarzewski Wydział Fizyki Politechniki Warszawskiej

Politechnika Gdańska Wydział Elektrotechniki i Automatyki Katedra Inżynierii Systemów Sterowania

Spacery losowe generowanie realizacji procesu losowego

Programowanie w języku Python. Grażyna Koba

III. ZMIENNE LOSOWE JEDNOWYMIAROWE

Informatyka I. Klasy i obiekty. Podstawy programowania obiektowego. dr inż. Andrzej Czerepicki. Politechnika Warszawska Wydział Transportu 2018

Podstawy Pythona. Krzysztof Gdawiec. Instytut Informatyki Uniwersytet Śląski

KURS PRAWDOPODOBIEŃSTWO

Ćwiczenia 7 - Zmienna losowa i jej rozkład. Parametry rozkładu.

Korzystanie z podstawowych rozkładów prawdopodobieństwa (tablice i arkusze kalkulacyjne)

Statystyka matematyczna i ekonometria

Celem tych ćwiczeń jest zapoznanie się z klasyfikacją za pomocą sieci neuronowych.

Python. Wprowadzenie. Jolanta Bachan

Rozkład Gaussa i test χ2

Wykresy i interfejsy użytkownika

Elementy statystyki wielowymiarowej

Algorytmy zrandomizowane

Algorytmy, które estymują wprost rozkłady czy też mapowania z nazywamy algorytmami dyskryminacyjnymi.

PHP: bloki kodu, tablice, obiekty i formularze

Znajdowanie największego i najmniejszego elementu w zbiorze n liczb całkowitych

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Wstęp do programowania

Rozwiązanie. #include <cstdlib> #include <iostream> using namespace std;

dr inż. Piotr Czapiewski Tworzenie aplikacji w języku Java Laboratorium 1

Metody Metody, parametry, zwracanie wartości

Modelowanie komputerowe

Aproksymacja funkcji a regresja symboliczna

PWSG Ćwiczenia 12. Wszystkie ukończone zadania należy wysłać na adres: lub

Matlab. modelowanie prostych eksperymentów losowych. Wykorzystanie funkcji rand - generatora liczb losowych, w który wyposaŝony jest MATLAB.

Kwantyle. Kwantyl rzędu p rozkładu prawdopodobieństwa to taka liczba x p. , że. Możemy go obliczyć z dystrybuanty: P(X x p.

WSNHiD, Programowanie 2 Lab. 2 Język Java struktura programu, dziedziczenie, abstrakcja, polimorfizm, interfejsy

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 5. Karol Tarnowski A-1 p.

KONSPEKT FUNKCJE cz. 1.

Rekurencja (rekursja)

Warunki logiczne instrukcja if

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Programowanie komputerowe. Zajęcia 7

Technologie i usługi internetowe cz. 2

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Wynik pomiaru jako zmienna losowa


zdarzenie losowe - zdarzenie którego przebiegu czy wyniku nie da się przewidzieć na pewno.

Matematyka stosowana i metody numeryczne

Stosowana Analiza Regresji

Transkrypt:

Spis treści 1 Optymalizacja jednowymiarowa 2 Optymalizacja wielowymiarowa 2.1 Zadanie - rozkład Cauchy'ego 2.2 Rozwiązanie 2.3 Zadanie - Data Container 2.4 Rozwiązanie Optymalizacja jednowymiarowa Omawianie zagadnienia optymalizacji rozpocznijmy od prostego przykładu. Zdefiniujmy pewną funkcję i zobaczmy jak wygląda jej wykres. import numpy as np import pylab as py liczniktestowej= def testowa(x): global liczniktestowej liczniktestowej+=1 return 1/x+np.exp(x) xtest=np.arange(0.2,2,0.01) ytest=[testowa(x) for x in xtest] py.plot(xtest,ytest) py.show()

Na rozważanym przedziale [0.2,2] powyższa funkcja ma tylko jedno ekstremum lokalne. Taką funkcję nazywamy unimodalną. Zmienna liczniktestowej umożliwi nam zliczanie wywołań funkcji testowej przez analizowane procedury. Zagadnienie, którym teraz będziemy się zajmować to problem numerycznego znajdowania takiego ekstremum. Jak w każdym problemie numerycznym ekstremum szukać będziemy zakładając pewną dokładność otrzymanego wyniku, którą oznaczmy xtol. Na wstępie przyjmijmy, że poszukujemy ekstremum z dokładnością xtol=0.01. Najprostszą metodą będzie policzenie wartości funkcji dla wszystkich wartości x z podanego przedziału co xtol. Jest to metoda siłowa i wielokrotnie licząca wartość funkcji. Jej kod możemy znaleźć poniżej. def bruteforce(func,xmin,xmax,args=(),xtol=0.01): xlist=np.arange(xmin,xmax,xtol) ylist=[func(x,*args) for x in xlist] return xlist[ylist.index(max(ylist))] Innym, znacznie efektywniejszym sposobem znajdowania minimum może być następująca procedura rekurencyjna:

podzielmy przedział [xmin,xmax] na 3 równe część: [xmin,xl],[xl,xr] oraz [xr,xmax] jeżeli wartość funkcji w xl jest mniejsza od wartości funkcji w xr to powtórz procedurę dla przedziału [xmin,xr]. W przeciwnym przypadku powtórz procedurę dla przedziału [xl,xmax]. zakończ działanie gdy badany przedział jest krótszy niż xtol. Przykładowa implementacja tej metody wygląda następująco def twomidpointsr(func,xmin,xmax,args=(),xtol=0.01): if xmax-xmin<xtol: return 0.5*(xmax+xmin) xl=xmin+(xmax-xmin)/3.0 xr=xmax-(xmax-xmin)/3.0 fxl=func(xl,*args) fxr=func(xr,*args) if fxl>fxr: return twomidpointsr(func,xmin,xr,args,xtol) else: return twomidpointsr(func,xl,xmax,args,xtol) Tą metodą możemy już szukać minimum z dowolną dokładnością, co nie będzie skutkowało znacznie większym czasem obliczeń. Zauważmy jednak, że w każdej iteracji wartość minimalizowanej funkcji liczona jest dwukrotnie. Jeżeli mamy do czynienia z funkcją, dla której obliczenie pojedynczej wartości jest bardzo czasochłonne to warto się zastanowić czy nie można tego wyniku poprawić. Zauważmy, że dla działania tej metody wcale nie jest konieczne dzielenie badanego odcinka dokładnie na trzy równe części. Można dokonać tego podziału w zupełnie innej proporcji. Warto tak dobrać punkty xl i xr, aby xr pokrywał się z xl (lub xl z xr) w kolejnym kroku iteracji. Jeżeli dodatkowo stworzymy zmienne przechowujące wcześniej liczone wartości funkcji to uda nam się ograniczyć liczbę wywołań funkcji o połowę. Opisana metoda to tak zwana metoda złotego podziału. Przykładowa implementacja wygląda następująco def GoldenRatioRearch(func,xmin,xmax,args=(),xtol=0.01): golden=0.5*(np.sqrt(5.0)-1.0) xl=xmax-golden*(xmax-xmin) xr=xmin+golden*(xmax-xmin) fxl=func(xl,*args) fxr=func(xr,*args) while xmax-xmin>xtol: if fxl<fxr: xmin=xmin xmax=xr xr=xl fxr=fxl xl=xmax-golden*(xmax-xmin) fxl=func(xl,*args) else: xmin=xl

xmax=xmax xl=xr fxl=fxr xr=xmin+golden*(xmax-xmin) fxr=func(xr,*args) return 0.5*(xmax+xmin) Napisanej metody optymalizacji możemy użyć w celu dopasowania funkcji do danych empirycznych metodą najmniejszych kwadratów. Przykład takiego zastosowania poniżej. #suma kwadratów def squares(a,func,xlist,ylist): return sum([(func(xlist[i],*a)-ylist[i])**2 for i in range(len(xlist))]) #funkcja liniowa def liniowa(x,a): return x*a #generujemy przykladowe xlist xlist=np.arange(,1,0.001) #generujemy wartosci funkcji z szumem ylist=[liniowa(x,1.23)+0.000001*np.random.randn() for x in xlist] #najlepsze dopasowanie metoda golden ration print GoldenRatioRearch(squares,,10,args=(liniowa,xlist,ylist),xtol=0.01) Optymalizacja wielowymiarowa Przejście od optymalizacji jedno- do wielowymiarowej fundamentalnie komplikuje problem. Pierwszym problemem jest istnienie tak zwanych punktów siodłowych. Nie istnieją zatem metody które zawsze znajdują szukane minimum, nawet jeżeli wiadomo że takie istnieje. Najpopularniejszą metodą jest downhill symplex lub inaczej metoda Neldera-Meada. Z powodu znacznego stopnia komplikacji nie będziemy jej samodzielnie implementować, a jedynie posłużymy się implementacją z biblioteki scipy.optimize. Dzięki niej możemy np. dopasowywać funkcję z więcej niż jednym parametrem do danych eksperymentalnych. import scipy.optimize as so #suma kwadratów def squares(a,func,xlist,ylist): return sum([(func(xlist[i],*a)-ylist[i])**2 for i in range(len(xlist))]) #funkcja liniowa

def liniowa(x,a,b): return x*a+b #generujemy przykladowe xlist xlist=np.arange(,1,0.001) #generujemy wartosci funkcji z szumem ylist=[liniowa(x,1.23,-0.73)+0.000001*np.random.randn() for x in xlist] #najlepsze dopasowanie metoda golden ration print so.fmin(squares,(1,),args=(liniowa,xlist,ylist)) Oczywiście dopasowywanie możemy przeprowadzać nie tylko metodą najmniejszych kwadratów. Zadanie - rozkład Cauchy'ego Wylosuj 10000 liczb z rozkładu Cauchy'ego z parametrami loc=1.23 i scale=2.0. Do wylosowanych danych dopasuj rozkład Cauche'ego trzema metodami METODA 1 - stwórz histogram otrzymanych wartości, znormalizuj go i metodą najmniejszych kwadratów dopasauj gęstość rozkładu do histogramu METODA 2 - dopasuj gęstość rozkładu do wylosowanych danych metodą największej wiarygodności METODA 3 - z wylosowanych danych stwórz dystrybuantę empiryczną. Metodą najmniejszych kwadratów dopasuj dystrybuantę rozkładu Cauchy'ego do dystrybuanty empirycznej. Rozwiązanie import scipy.optimize as so def rho_cauchy(x,loc,scale): return (np.pi*scale*(1.0+(x-loc)**2/(scale**2)))**(-1.0) def F_cauchy(x,loc,scale): return 0.5+np.arctan((x-loc)*1.0/scale)/np.pi #losujemy 10000 liczb z rozkladu Cauchyego o loc=1.23 i scale=2.0 x=2*np.random.standard_cauchy(10000)+1.23 N=len(x) #METODA 1 - Dopasowanie metoda najmniejszych kwadratow do histogramu #tworzymy histogram hist,bins= np.histogram(x,bins=np.linspace(-20,20,61)) #dlugosc przedzialu histogramowania

przedzial=bins[1]-bins[] #normalizujemy histogram aby moc go porownac z gestoscia hist=hist*1.0/len(x)/przedzial #liczymy wsp. srodkow przedzialow histogramowania xhist=bins[:-1]+0.5*przedzial #definiujemy sume kwadratow def squares((loc,scale)): return sum([(rho_cauchy(xhist[i],loc,scale)-hist[i])**2 for i in range(len(hist))]) #szukamy minimum funkcja fmin fit1=tuple(so.fmin(squares,(,1))) print 'wynik metody1 to '+str(fit1) #ogladamy wynik py.plot(xhist,hist) xtest=np.linspace(-20,20,1001) ytest=[rho_cauchy(a,*fit1) for a in xtest] py.plot(xtest,ytest) py.show() #METODA 2 - Metoda najwiekszej wiarygodnosci #definiujemy -funkcje wiarygodnosci def L((loc,scale)): return -sum([np.log(rho_cauchy(a,loc,scale)) for a in x]) #szukamy minimum fit2=tuple(so.fmin(l,(,1))) print 'wynik metody2 to '+str(fit2) #METODA 3 - dopasowanie dystrybuant xx=sorted(x) yy=np.linspace(,1,n) #definiujemy funkcje KS bedaca maksimum z roznicy miedzy dystrybuanta empiryczna a teoretyczna def KS((loc,scale)): return max([abs(f_cauchy(xx[i],loc,scale)-yy[i]) for i in xrange(n)]) #szukamy minimum fit3=tuple(so.fmin(ks,(,1))) print 'wynik metody3 to '+str(fit3) #ogladamy wynik cut=100 py.plot(xx[cut:-cut],yy[cut:-cut]) xtest=np.linspace(-20,20,1001) ytest=[f_cauchy(x,*fit3) for x in xtest]

py.plot(xtest,ytest) py.show() Zadanie - Data Container Napisz klasę funkcja przyjmującą w konstruktorze parametry funkcji i posiadającą reprezentację tekstową. Napisz dowolną funkcję dziedziczącą po klasie funkcja, której metoda call przyjmuje jeden argument i zwraca wartość funkcji dla podanego argumentu i parametrów podanych w konstruktorze. Napisz klasę DataContainer przyjmującą w konstruktorze dwie serie danych empirycznych o tej samej długości odpowiadające współrzędnym x i y. Obiekt klasy DataContainer powinien być wyposażony w metodę o nazwie fit, która przyjmuje jako argument obiekt klasy funkcja. Metoda fit powinna zwracać obiekt takiej samej klasy jak otrzymany w argumencie, ale z parametrami, dla których funkcja jest najlepiej (metodą najmniejszych kwadratów) dopasowana do przechowywanych w obiekcie danych. Rozwiązanie import numpy as np import pylab as py import time import scipy.optimize as so class funkcja(object): def init (self,*args): self.args=args def str (self): return 'to jest funkcja o nazwie '+self. class. name +' i argumentach '+str(self.args) class liniowa(funkcja): def call (self,x): return self.args[]*x*x+self.args[1] class DataContainer(object): def init (self,x,y): self.x=np.array(x) self.y=np.array(y) self.n=len(x) def str (self): return '''to jest Data Container z danymi: x[:10]:'''+str(self.x[:10])+''' y[:10]:'''+str(self.y[:10]) def fit(self,funkcja): parametry_poczatkowe=funkcja.args def squares(parametry):

funkcja. init (*tuple(parametry)) return sum((map(funkcja,self.x)-self.y)**2) parametry_dopasowane=so.fmin(squares,parametry_poczatkowe) funkcja. init (*tuple(parametry_dopasowane)) return funkcja #generujemy przykladowe xlist xlist=np.arange(,1,0.001) #generujemy wartosci funkcji z szumem f=liniowa(1.23,-0.73) ylist=[f(x)+0.05*np.random.randn() for x in xlist] d=datacontainer(xlist,ylist) f=liniowa(1,2) f=d.fit(f) py.plot(d.x,d.y) py.plot(d.x,map(f,d.x)) py.show() "Programowanie dla Fizyków Medycznych"