Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 1/29 Předzpracování dat Pavel Kordík Department of Computer Systems Faculty of Information Technology Czech Technical University in Prague Cvičení 2: Import a příprava dat v Matlabu MI-PDD, 09/2011 MI-POA Evropský sociální fond Praha & EU: Investujeme do vaší budoucnosti
Matlab, pracovní adresář Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 2/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 3/29 Skaláry skalár = matice 1x1 >> s = 1 >> s = 1; >> s >> disp(s); s = s = 1 1 1 operace >> t = s + 3 >> t ^ 2 t = ans = 4 16 Př.: zadejte rozměry obdélníku, vypočtěte obsah
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 4/29 Vektory řádkové, sloupcové = matice Dx1 nebo 1xD >> vrow = [1 2 3] >> vcol = [1; 2; 3] vrow = nebo 1 2 3 >> vcol = [1 2 3]' vcol = >> vrow(2) 1 ans = 2 2 3 >> length(vrow) ans = 3
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 5/29 Vektory operátor : vytvoření vektoru s ekvidistantními prvky >> v1 = 1:10 v1 = 1 2 3 4 5 6 7 8 9 10 >> v2 = 10:-2:1 v2 = 10 8 6 4 2 Př.: vytvořte sloupcový vektor lichých čísel mezi 12^2 a 13^2
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 6/29 Matice vytvoření vektoru s ekvidistantními prvky >> M = [11 12 13; 21 22 23; 31 32 33] >> M = [M; [41 42 43]] >> M = [M [14 24 34 44]'] >> [M M] >> [M; M] >> [M M; M M] >> size([m M]) Př.: vytvořte dvouřádkovou matici s prvky 0 až 9 v prvním řádku a 10 až 19 v druhém řádku
Matice přístup k prvkům indexování pomocí kulatých závorek >> M = [0:9; 10:19, 20:29] >> M(2,3) >> M(10) výběr podmatice >> M(1:2,[1 2 4]) >> M(2,:) % cely radek >> M(:) % sl. vektor >> M(:,3) % cely sloupec přiřazování >> M(2,3) = -23 >> M(1,:) = [1 2 3 4] %radek >> M(1:2,[2 4]) = [-12-14; -22-24] % podmatice >> M(end,:) = [] % vymazani posledniho radku Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 7/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 8/29 Matice spec., operace speciální typy zeros(2,3) ones(2,3) eye(2,3) rand(2,3) randn(2,3) % normální rozdělení maticové operace Ma = [1 2; 3 4]; Mb = [11 12; 13 14]; Ma + Mb Ma * Mb Ma.* Mb inv(ma) inv(ma)*ma Ma ^ 2 Ma.^ 2 Ma / 2 Mb./ Ma eig(ma)
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 9/29 Lineární algebra řešení soustavy Ax = b >> A = [1 2 3; -1 0 2; 1 3 1]; b = [1 0 0]'; >> x = inv(a)*b % pomoci inverzni matice >> x = A\b % lepe, pomoci Gaussovy eliminace >> A*x-b % kontrola spravnosti
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 10/29 Logické operace >> a = 1:6; b = a>3 >> b = (a>3) (a==1) >> b = (a>3) & (a~=5) >> ind = find(b) % indexy nenulovych prvku
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 11/29 Grafy plot >> x = [0:0.05:1] * 2*pi; >> ysin = sin(x); >> plot(x,ysin); >> hold on; % Podrzime obrazek, aby se graf pridal >> ycos = cos(x); >> plot(x,ycos,'mx:'); >> plot(x,ysin,'ro--'); % nastaveni barvy (r), bodu % (o) a vzoru cary (--)
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 12/29 Grafy 2 >> close all; % Zavreme vsechny otevrene grafy >> x = 1:10; >> y = exp(-x); >> plot(x,y); >> semilogy(x,y); >> subplot(2,1,1); >> plot(x,y); >> subplot(2,1,2); >> semilogy(x,y);
Příklad vytvořte vektor v1, obsahující 100 náhodných čísel od -0.5 do 0.5 vytvořte matici s následujícími sloupci (i je číslo řádku): i v1(i) log(i) vykreslete modře sloupeček log(i) a červeně log(i)+v1(i) Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 13/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 14/29 Řešení >> v1 = rand(100,1) 0.5 >> M = [(1:100)' v1 log(1:100)'] >> hold on >> plot(m(:,1), M(:,3), 'b') >> plot(m(:,1), M(:,3)+M(:,2), 'r')
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 15/29 Programování - funkce funkce v m-souborech function [soucet,rozdil] = SlozitaFunkce(a,b) % % Tohle je help k funkci SlozitaFunkce. Vypisuje se % zadanim prikazu 'help SlozitaFunkce'. % soucet = a+b; rozdil = a-b; end % Nepovinne
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 16/29 Programování - funkce vypsání, spuštění, nápověda >> type SlozitaFunkce >> [s,r] = SlozitaFunkce(8,3) >> help SlozitaFunkce funkce return okamžitě ukončuje funkci v místě svého volání a předává řízení volající funkci.
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 17/29 Programování - větvení if-else if s > 11 disp('soucet vetsi nez 11.'); elseif r < 5, else end disp('soucet neni > nez 11 a rozdil je < nez 5.') disp('soucet neni vetsi nez 11 a rozdil neni mensi nez 5.');
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 18/29 Programování - větvení switch-case switch r case {0, 1, 2, 3} disp('rozdil je v intervalu 0-3.'); case 4 disp('rozdil je 4.'); case {5, 6, 7} disp('rozdil je v intervalu 5-7.') otherwise disp('rozdil uplne jiny.') end
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 19/29 Programování - cykly často se dají nahradit vektorovými operacemi, které jsou mnohem efektivnější for for i = 1:10 end fprintf('%d ',i); for i = [1 6 10000] end fprintf('%d ',i);
Programování - cykly while i = 1; while i < 10 fprintf('%d ',i); i = i+1; end break ukončuje cyklus if i == 5, break, end continue přeskakuje zbytek iterace if i == 5, continue, end Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 20/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 21/29 Další příkazy různé help, doc - nápověda k funkcím a příkazům who (whos) - výpis proměnných v pracovním prostoru which - kde je uložen daný m-soubor edit - otevře m-file v editoru určitě vyzkoušejte path, addpath format, disp, fprintf, sprintf, load, save inf, nan, any, all, isempty, round, ceil, floor, ops min, max, sort, sum, mean, std axis, title, xlabel, ylabel, legend, plot3, contour,
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 22/29 Založení projektu menu File->New->Blank M-File uložte do aktuálního adresáře následující příkazy pište do vytvořeného souboru a vyvolávejte z řádky jeho jménem
Načtení dat stáhnout dataset auto-mpg.data-mod objekt dataset ze Statistics Toolboxu auta = dataset('file','auto-mpg.data-mod',... 'ReadVarNames', false,... 'ReadObsNames', false,... 'delimiter', '\t',... 'TreatAsEmpty', 'NA'); pojmenování sloupců auta = set(auta,... 'VarNames', {'mpg', 'cyl', 'disp', 'hp',... 'wgt', 'acc', 'year', 'org', 'name'}); auta(1:5, :) Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 23/29
Převody, souhrn Převedení proměnné org na nominální (1 - Amerika, 2 - Evropa, 3 - Japonsko) tmporg = nominal(auta.org, {'America','Europe','Japan'}); auta = replacedata(auta, tmporg, 'org'); auta(1:5,:) Původní hodnoty zůstávají v datové sadě double(auta.org(1:13)') Počáteční průzkum dat summary(auta) Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 24/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 25/29 Chybějící hodnoty NaN nejjednodušší je zbavit se řádků promenne = get(auta,'varnames'); for prom = 1:numel(promenne), if isnumeric( auta.(promenne{prom}) ), indchybejicich = isnan( auta.(promenne{prom}) ); auta( indchybejicich, : ) = []; end end summary(auta)
Normalizace funkce minmax pro jeden vektor function x01 = minmax(x) x01 = (x - min(x)) / (max(x) - min(x)); end aplikace na sloupce 1-7 datové sady auta01 = auta; x01 = datasetfun( @minmax, auta01(:,1:7),... 'UniformOutput', false ); x01 = [x01{:}]; % Převod cell array na matici auta01 = replacedata( auta01, x01, 1:7); mins = datasetfun( @min, auta01(:,1:7) ) maxs = datasetfun( @max, auta01(:,1:7) ) Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 26/29
Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 27/29 Načtení dat UCI repository - databáze automobilů moodle cars = csvread('auto-mpg.data-mod.csv'); atributy: mpg: miles-per-galon, počet mil ujetých na 1 galon paliva cyl: cylinders, počet válců disp: displacement, zdiv hp: horsepower, koňských sil wgt: weight, hmotnost acc: acceleration, zrychlení year: rok výroby org: origin, původ (1 -Amerika, 2 -Evropa, 3 -Japonsko)
Normalizace dat Verze 1: maticově Obsah souboru norm01v1.m: function data = norm01v1(data) pocet = size(data,1); minima = min(data); maxima = max(data); rozsah = maxima - minima; data = (data - repmat(minima,pocet,1))./ repmat(rozsah,pocet,1); end K normalizaci prvnich 7 sloupcu v matici cars volat treba jako: >> cars(:,1:7) = norm01v1( cars(:,1:7) ); Nevýhody: zbytečné vytváření velkých matic pomocí funkce repmat Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 28/29
Normalizace dat Verze 2: po sloupcích Obsah souboru norm01v2.m (může obsahovat obě funkce, vně bude přístupná jen ta se stejným názvem jako má m-file): function data = norm01v2(data) for i = 1:size(data,2), data(:,i) = norm01vec(data(:,i)); end end function vec = norm01vec(vec) end vec = (vec - min(vec)) / (max(vec) - min(vec)); Pavel Kordík(ČVUT FIT) Předzpracování dat MI-PDD, 2012, Cvičení 2 29/29