Všehochuť

Antonín Slavík
MFF UK

Pravděpodobnost, statistika

Diskrétní rozdělení pravděpodobnosti – příklady:

Rovnoměrné rozdělení DiscreteUniformDistribution[{(Subscript[i, min]),(Subscript[i, max])}]

Binomické rozdělení BinomialDistribution[n,p]

Geometrické rozdělení GeometricDistribution[p]

Poissonovo rozdělení PoissonDistribution[μ]

Spojitá rozdělení – příklady:

Rovnoměrné rozdělení UniformDistribution[{min,max}]

Normální rozdělení NormalDistribution[μ,σ]

(χ^2) rozdělení ChiSquareDistribution[ν]

Studentovo rozdělení StudentTDistribution[ν]

Střední hodnota, rozptyl:

Mean[BinomialDistribution[n,p]]

Variance[BinomialDistribution[n,p]]

Hustota:

?PDF

PDF[BinomialDistribution[n,p],x]

DiscretePlot[PDF[BinomialDistribution[30,1/2],x],{x,0,30}]

PDF[NormalDistribution[μ,σ],x]

Plot[PDF[NormalDistribution[2,3],x],{x,-5,10}]

Distribuční funkce, kvantily, inverzní distribuční funkce:

?CDF

Plot[CDF[NormalDistribution[0,1],x],{x,-3,3}]

Quantile[NormalDistribution[0,1],.95]

Quantile[rozdělení,q]je totéž jako InverseCDF[rozdělení,q].

Plot[InverseCDF[NormalDistribution[0,1],x],{x,0,1}]

Výpočet pravděpodobnosti:

?Probability

Symbol \[Distributed] se vkládá jako EscdistEsc.

Jaká je pravděpodobnost, že při 100 hodech mincí bude počet líců mezi 60 a 80?

Probability[60≤x≤80,x\[Distributed]BinomialDistribution[100,1/2]]

N[%]

Jaká je pravděpodobnost, že při pěti hodech kostkou dostaneme součet 20?

Probability[Sum[x[i],{i,1,5}]==20,Table[x[i]\[Distributed]DiscreteUniformDistribution[{1,6}],{i,1,5}]]

Pro větší počty kostek (a obecněji větší počty náhodných proměnných) trvá výpočet dlouho, případně skončí vyčerpáním paměti. Vysvětlení:

For a discrete distribution dist, the probability of pred is given by ∑Boole[pred]f[x] where f[x] is the probability density function of dist and the summation is taken over the domain of dist.

For a continuous distribution dist, the probability of pred is given by ∫Boole[pred]f[x]dx where f[x] is the probability density function of dist and the integral is taken over the domain of dist.

Jaká je pravděpodobnost, že kvadratický polynom bude mít reálné kořeny, jestliže koeficienty vybereme náhodně z intervalu [0,1]?

Probability[Discriminant[a x^2+b x+c,x]≥0,{a,b,c}\[Distributed]UniformDistribution[{{0,1},{0,1},{0,1}}]]

N[%]

Podmíněná pravděpodobnost (symbol \[Conditioned] se zapisuje pomocí EsccondEsc):

Probability[x==2\[Conditioned]x+y≤5,{x\[Distributed]DiscreteUniformDistribution[{1,6}],y\[Distributed]DiscreteUniformDistribution[{1,6}]}]
(* Pravděpodobnost, že při hodu dvěma kostkami padne na první hodnota 2, a to za předpokladu, že součet je 5. *)

Generování náhodných čísel ze zadaného rozdělení:

data=RandomVariate[NormalDistribution[2,1],10000];

Mean[data]

Variance[data]

hist=Histogram[data,Automatic,"ProbabilityDensity"]

Show[hist,Plot[PDF[NormalDistribution[2,1],x],{x,-10,10},PlotRange->All]]

Zpětné určení parametrů rozdělení metodou maximální věrohodnosti:

FindDistributionParameters[data,NormalDistribution[μ,σ]]

EstimatedDistribution[data,NormalDistribution[μ,σ]]

Vizualizace dat pomocí krabicového diagramu:

data1=RandomInteger[{80,120},10]

data2=RandomInteger[{80,120},10]

data3=RandomInteger[{80,120},10]

BoxWhiskerChart[{data1,data2,data3}]

BoxWhiskerChart[{data1,data2,data3},ChartStyle->10,BarOrigin->Left,BaseStyle->12]

Benfordův zákon

Citace z Wikipedie:

Benfordův zákon je matematický zákon, který říká, že v mnoha souborech přírozených dat (ale ne ve všech) čísla mnohem častěji začínají číslicí 1 než na jiné číslice. Zhruba 30 % čísel začíná jedničkou. Čím vyšší je počáteční číslice, tím méně pravděpodobněji se na začátku čísel objevuje.

Benfordův zákon platí pro data z přírodního světa nebo i pro sociálně významné údaje. Soubory čísel mohou představovat částky na účtech za elektřinu, počty novinových článků, čísla popisná, ceny na burzách, velikosti populací, velikosti povodí a délky řek nebo fyzikální a matematické konstanty.

Protože lidé mají tendenci při vymýšlení falešných výsledků používat na začátku čísel všechny číslice stejně pravděpodobně, Benfordův zákon se může využívat při hledání možných zpronevěr nebo k jednoduchému testu, zda volby byly regulérní.

Pro dostatečnou platnost zákona stačí mít výsledky v rozsahu alespoň tří řádů.

Poprvé o tomto zákonu publikoval v roce 1881 americký astronom Simon Newcomb, který si prý všiml, že logaritmické tabulky jsou mnohem ohmatanější na stránkách, kde se vyskytují čísla začínající jedničkou. Zákon byl znovuobjeven roku 1938 fyzikem Frankem Benfordem, podle kterého se dnes nazývá.

BenfordDistribution[b] je Benfordovo rozdělení pro soustavu o základu b.

Pravděpodobnost počáteční číslice n∈{1,...,b-1} je (Subscript[log, b])(n+1)-(Subscript[log, b])n=((log(1+1/n))/(log b)).

Table[PDF[BenfordDistribution[10],x],{x,1,9}]

N[%]

benford=DiscretePlot[PDF[BenfordDistribution[10],x],{x,1,9},PlotStyle->PointSize[Medium]]

FirstDigit[x_]:=First[First[RealDigits[QuantityMagnitude[x],10,1]]];

sample=Table[FirstDigit[CityData[city,"Population"]],{city,CityData[{All,"UnitedStates"}]}];

Show[Histogram[sample,{0.5,9.5,1},"PDF"],benford]

sample2=Table[FirstDigit[CityData[city,"Population"]],{city,CityData[{All,"CzechRepublic"}]}];

Show[Histogram[sample2,{0.5,9.5,1},"PDF"],benford]

sample3=Table[FirstDigit[CountryData[country,"Area"]],{country,CountryData[All]}];

Show[Histogram[sample3,{0.5,9.5,1},"PDF"],benford]

sample4=DeleteCases[Table[FirstDigit[CountryData[country,"GDP"]],{country,CountryData[All]}],"NotAvailable"];

Show[Histogram[sample4,{0.5,9.5,1},"PDF"],benford]

Benfordův zákon nelze aplikovat na data, která jsou zhruba stejného řádu:

sample5=Table[CityData[city,"Population"],{city,Take[CityData[{All,"UnitedStates"}],100]}];

Min[sample5]

Max[sample5]

Show[Histogram[Map[FirstDigit,sample5],{0.5,9.5,1},"PDF"],benford]

Formátování čísel

NumberForm, EngineeringForm, ScientificForm, AccountingForm

numbers=Table[10.^i,{i,-8,8,2}]

NumberForm se chová stejně jako výchozí nastavení.

NumberForm[numbers]

EngineeringForm používá jako exponenty pouze násobky tří.

EngineeringForm[numbers]

U ScientificForm je před desetinnou čárkou vždy jen jedna cifra.

ScientificForm[numbers]

AccountingForm nepoužívá vědecký zápis a záporná čísla zobrazuje v závorkách.

AccountingForm[numbers]

AccountingForm[-numbers]

Ve druhém argumentu lze zadat maximální povolený počet cifer.

p=N[Pi^9,30]

NumberForm[p,10]

EngineeringForm[p,10]

ScientificForm[p,10]

AccountingForm[p,10]

Clear[p]

Další volby

Options[NumberForm]

Tyto volby kromě ExponentFunction se vztahují i na celá čísla. Stejné volby mají také ScientificForm, EngineeringForm a AccountingForm, výchozí nastavení jsou však odlišná.

NumberForm[30!,DigitBlock->3]

NumberForm[30!,DigitBlock->3,NumberSeparator->" "]

NumberForm[{4.5,-6.8},NumberSigns->{"-","+"}]

NumberForm[N[Pi],NumberPoint->","]

ExponentFunction je funkce, která rozhoduje, zda se použije vědecký zápis čísla, a pokud ano, jaký bude příslušný exponent. Vstupem ExponentFunction je hodnota exponentu, která by odpovídala zápisu s jednou cifrou před desetinnou čárkou. Výstupem je buď Null (vědecký zápis nebude použit), nebo hodnota exponentu, která bude skutečně použita.

{8.^5,11.^7,13.^9}

Příklad: Vědecký zápis se použije, pokud je exponent v absolutní hodnotě větší než 8.

NumberForm[%,ExponentFunction->(If[-8≤#≤8,Null,#]&)]

Simulace EngineeringForm pomocí ExponentFunction:

NumberForm[%,ExponentFunction->(3 Quotient[#,3]&)]

NumberFormat nastavuje výstupní formát. Zadáváme funkci tří argumentů (mantisa, základ, exponent).

ScientificForm[1.77 10^5,NumberFormat ->(Row[{#1,"E",#3}]&)]

Zarovnávání pomocí PaddedForm

?PaddedForm

PaddedForm[{456,12345,12},7]

PaddedForm[Column[{456,12345,12}],7]

PaddedForm[Column[{456,12345,12}],7,NumberPadding ->"0"]

PaddedForm[Column[{-6.7,6.888,6.99999}],{7,4}]

PaddedForm[Column[{6.7*10^8,48.7,-2.3* 10^-16}],{4,2}]

Operace s víceúrovňovými seznamy

s={1,{2,3,4,5},{1,6,1,7},{1,{{1,8,1},1}},1,1,{{1}},9,10,11};

Úroveň prvku = počet indexů potřebných k popsání pozice prvku

TreeForm[s,ImageSize->Large]

Funkce pro práci se seznamy často umožňují specifikovat úrovně,které se mají brát v úvahu.
({{syntaxe, význam}, {n, úrovně 1 až n}, {Infinity, úrovně 1 až nekonečno}, {{n}, úroveň n}, {{(Subscript[n, 1]),(Subscript[n, 2])}, úrovně (Subscript[n, 1]) až (Subscript[n, 2])}})

Map standardně pracuje s úrovní 1.

Map[f,{1,{2,3},{4,5,6},7,8}]

Map[f,{1,{2,3},{4,5,6},7,8},{2}]

Map[f,{1,{2,3},{4,5,6},7,8},2]

Apply standardně pracuje s úrovní 0 (=celý výraz).

Apply[Plus,{{1,2,3},{4,5,6}}]

Apply[Plus,{{1,2,3},{4,5,6}},{1}]

Apply[Plus,{{1,2,3},{4,5,6}},{0,1}]

Count standardně pracuje s úrovní 1.

Count[s,1]

Count[s,1,Infinity]

Position standardně pracuje s úrovní {0,Infinity}.

Position[s,1]

Příklad: Vyznačení prvočísel v matici

m=RandomInteger[1000,{10,10}]

Grid[m]

?Framed

Map[If[PrimeQ[#],Framed[#],#]&,m,{2}]//Grid

Algebraická čísla a jejich reprezentace

(m=Table[1/(i +j+1),{i,5},{j,5}])//MatrixForm

Eigenvalues[m]

s=Solve[1+3 x+2 (x^2)+(x^5)+(x^6)==0,x]

?Root

N[s]

S kořeny definovanými pomocí Root lze počítat jako s běžnými čísly.

x/.s

Simplify[Times@@(x/.s)]

Simplify[Plus@@(x/.s)]

?RootReduce

s=(Sqrt[2])+(Sqrt[3])

N[s]

RootReduce[s]

N[%]

Clear[s]

Příklad použití: Důkaz rovnosti dvou algebraických čísel

l=(Sqrt[2])+(Sqrt[3])+(Sqrt[5]);
p=(Sqrt[10+2 (Sqrt[15])+4 (Sqrt[4+(Sqrt[15])])]);

N[l-p]

RootReduce[l]

RootReduce[p]

FullSimplify toto provádí automaticky:

FullSimplify[l-p]

?ToRadicals

Příklad použití: Zjednodušení výrazu s odmocninami

RootReduce[(Sqrt[3+(Sqrt[(1/2) (3+(Sqrt[5]))])])]

ToRadicals[%]

FullSimplify opět provádí automaticky:

FullSimplify[(Sqrt[3+(Sqrt[(1/2) (3+(Sqrt[5]))])])]

Union a SameTest

?Union

?SameTest

Union[{0,3,2,4,2,0,2,-5,2,0}]

Union[{0,3,2,4,2,0,2,-5,2,0},SameTest->(Mod[#1,3]==Mod[#2,3]&)]

Příklad: Enumerace stromů pomocí Prüferova kódu

Cayleyho vzorec: Počet stromů s n vrcholy je (n^(n-2)) (C. W. Borchardt 1860, A. Cayley 1889)

H. Prüfer (1918): Každému stromu s n vrcholy lze přiřadit posloupnost n-2 cifer z {1,…,n} a naopak.

Balíček Combinatorica obsahuje funkce CodeToLabeledTree a LabeledTreeToCode pro převod mezi stromy a jejich kódy.

Needs["Combinatorica`"]

graf=FromUnorderedPairs[{{1,2},{2,3},{1,4},{4,5},{1,6}}];
TreePlot[graf,VertexLabeling->True,BaseStyle->{FontSize->16},ImageSize->Small]

Kód získáme tak, že pokaždé uthrneme list s nejmenším číslem a zaznamenáme číslo jeho souseda. Toto opakujeme tak dlouho, dokud nezůstanou poslední dva vrcholy.

LabeledTreeToCode[graf]

Konverze zpět z kódu na strom:

TreePlot[CodeToLabeledTree[%],VertexLabeling->True,BaseStyle->{FontSize->16},ImageSize->Small]

Nalezení všech stromů s n vrcholy.

allTrees[n_]:=Map[CodeToLabeledTree,Tuples[Range[n],n-2]]

Všechny stromy s pěti vrcholy:

GraphicsGrid[Partition[Map[TreePlot[#,VertexLabeling->True]&,allTrees[5]],5],Dividers->All,ImageSize->{800,Automatic}]

Cayley's interest in graph theory goes back to the 1850s. It was originally motivated by questions from organic chemistry. This led him in 1857 to introduce the idea of a "tree" in graph theory. In the 1870s, Cayley worked on the problem of enumerating "unrooted trees". These mathematical problems were closely connected to chemistry, and Cayley's theory successfully predicted the existence of some alcohols before they were known to exist in nature.
(Henry E. Heatherly v recenzi knihy Arthur Cayley, Mathematician Laureate of the Victorian Age, The Mathematical Intelligencer, 2009)

Nalezení všech neizomorfních stromů

Predikát IsomorphicQ z balíčku Combinatorica testuje, zda jsou zadané dva stromy izomorfní.

distinctTrees[n_]:=Union[allTrees[n],SameTest->IsomorphicQ]

Map[TreePlot[#,VertexLabeling->True]&,distinctTrees[5]]

Map[TreePlot[#,VertexLabeling->True]&,distinctTrees[6]]

Map[TreePlot[#,VertexLabeling->True]&,distinctTrees[7]]//Timing