Das Abzählproblem, nicht unterscheidbare Kugeln auf nicht unterscheidbare Urnen zu verteilen ist äquivalent zum Problem zu einer ganzen Zahl Z Zerlegung in L Summanden zu finden. Eine derartige Zerlegung wird als Partition bezeichnet. Wie viele Partitionen es gibt, wird für mehrere Fälle untersucht: Die Vertauschung der Reihenfolge zählt (oder zählt nicht) als neue Partition, die Null ist als Summand zugelassen, die Länge der Partition wird nicht festgelegt. Man kann für diese Abzählprobleme zwar Rekursionsformeln angeben, man kann mit einfachen Mitteln aber keine expliziten Formeln angeben, die die Rekursionsformeln lösen.
Kombinationen mit Wiederholungen treten in mehreren Abzählproblemen auf, die zunächst sehr unterschiedlich wirken. Es wird ihre Äquivalenz gezeigt und die Formel hergeleitet, wie man die Anzahl aller Kombinationen mit Wiederholungen berechnet. Dazu verwendet man die Methode Stars and Bars. In den R-Skripten wird ein einfacher Algorithmus gezeigt, wie man die Menge alle Kombinationen mit Wiederholungen rekursiv berechnet.
Die Funktion sample() wird verwendet, um Stichproben zu erzeugen. Sie lässt sich so konfigurieren, dass man die Wahrscheinlichkeitsverteilungen von beliebigen selbstdefinierten diskreten Zufallsvariablen einsetzen kann. Zudem kann man das Ziehen mit beziehungsweise ohne Zurücklegen realisieren.
Mit Hilfe von Zeigern kann man Funktionen realisieren, die Felder als Eingabewert beziehungsweise als Rückgabewert besitzen. Es ist sogar möglich, Zeiger auf Funktionen zu setzen und damit Funktionen als Eingabewerte anderer Funktionen einzusetzen.
Es werden einfache Aufgaben besprochen, die grundlegende Eigenschaften von Feldern und Zeigern behandeln und die man nach einem ersten Durchgang durch diese Themen beherrschen sollte.
Mit Funktionen lassen sich Quelltexte besser strukturieren und wiederkehrende Aufgaben können mit wenig Aufwand ausgeführt werden. Zur Syntax der Definition von Funktionen gehören ihre Deklaration (Funktionskopf), die Implementierung und ihr Aufruf aus anderen Funktionen heraus. Diese Bestandteile und wie man Deklaration und Implementierung im Quelltext anordnet, werden erklärt. Mehrere Aufgaben mit ausführlichen Lösungen dienen der Veranschaulichung.
Vorgestellt werden die Schleife mit Zählvariable (for-Schleife), die kopfgesteuerte Schleife (while-Schleife) und die fußgesteuerte Schleife (do-while-Schleife). Ihre Behandlung erfolgt aber nur exemplarisch an typischen Anwendungen. Eine detailliertere Behandlung findet sich im entsprechenden Kapitel zu C++.
Die wichtigsten Konzepte der Programmiersprache C werden an einfachen Programm-Beispielen erläutert: HelloWorld-Anwendung zum Testen der Arbeitsumgebung, Konsolenein- und ausgaben, Deklaration und Initialisierung von Variablen, arithmetische und logische Operationen, Ablaufsteuerung mit Bedingung und Alternative. Zudem werden einige methodische Hinweise gegeben, wie man gerade als Anfänger beim Programmieren strukturiert vorgehen sollte.
Inhalt und Lernziele des Kapitels Einführung in die Programmiersprache C und in C-Zeiger.
Die Faltung von Wahrscheinlichkeitsmaßen ist eine der wichtigsten Begriffsbildungen, um Summen von unabhängigen Zufallsvariablen zu beschreiben, da sich mit ihr viele Eigenschaften von Zufallsvariablen und Wahrscheinlichkeitsverteilungen prägnant formulieren lassen und zahlreiche Bezüge zu anderen (scheinbar entfernten) Begriffen und Aussagen herstellen lassen. In diesem einführenden Kapitel wird auf exakte mathematische Definitionen und Beweise verzichtet, stattdessen soll der Begriff der Faltung an typischen Beispielen motiviert werden.
Im dritten Teil über die Familie der apply-Funktionen werden zwei Gruppen von Funktionen vorgestellt: Zum Einen Funktionen für Wiederholungen (entweder Objekte oder Anweisungen), wodurch viele einfache Schleifen ersetzt werden können. Zum Anderen Funktionen, die Daten zuerst gruppieren und dann erst verarbeiten; hier werden zahlreiche Querverbindungen zu Dataframes und Faktoren hergestellt. Zur ersten Gruppe gehören rep() und replicate(), zur zweiten Gruppe ave(), by() und aggregate(), die alle sehr nahe verwandt sind mit tapply().
Nach dem Erwartungswert sind die Varianz und die Standardabweichung (als Wurzel der Varianz) die wichtigsten Kennzahlen einer Verteilung. Ist der Erwartungswert ein Maß für die Lage der Verteilung, beschreiben Varianz und Standardabweichung die Streuung der Werte einer Zufallsvariable um den Erwartungswert. Die Definition und Eigenschaften werden besprochen und an zahlreichen Beispielen erläutert.
Der Erwartungswert einer Zufallsvariable ist die wichtigste Kennzahl, um Ergebnisse von Zufallsexperimenten zu beschreiben. Seine Definition und Eigenschaften werden ausführlich erläutert. An zahlreichen Beispielen wird seine Berechnung vorgeführt; dabei werden nebenbei wichtige Wahrscheinlichkeits-Verteilungen vorgestellt.
Die Herleitung der Chernoff-Schranke beruht auf der momentenerzeugenden Funktion. Für den Spezialfall der Binomialverteilung kann die optimale Chernoff-Schranke explizit berechnet werden und es geht außer der Markov-Ungleichung keine weitere Näherung ein. Um die Vorgehensweise bei der Berechnung der Chernoff-Schranke besser verständlich zu machen, werden alle Herleitungsschritte besprochen und mit zahlreichen Diagrammen veranschaulicht.
Zu den wichtigsten Wahrscheinlichkeitsverteilungen gibt es Funktionen zum Berechnen der Wahrscheinlichkeitsdichte, der Verteilungsfunktion, des p-Quantils und zum Erzeugen von Zufallszahlen. Für ausgewählte Verteilungen (Binomialverteilung, Poisson-Verteilung, kontinuierliche Gleichverteilung und Normalverteilung) werden diese Funktionen vorgestellt. Dabei werden typische Anwendungen aus der Wahrscheinlichkeitsrechnung und Statistik gezeigt, die zugleich einige Eigenschaften dieser Verteilungen illustrieren.
Dar Datentyp Tabelle (table) wird verwendet, um Kontingenz-Tabellen zu erzeugen und auszuwerten. Einfachere Anwendungen, um die levels in einem Faktor zu zählen, wurden bereits in den Kapiteln über Faktoren beschrieben.
Inhalt und Lernziele des Kapitels Zusammengesetzte Datentypen in R.
Inhalt und Lernziele des Kapitels Einfache Datentypen in R.
Zufallsvariablen können diskrete oder kontinuierliche Werte annehmen. Die mathematische Beschreibung unterscheidet sich, da die Wahrscheinlichkeiten der Werte der Zufallsvariable entweder mit Folgen oder indirekt über eine Wahrscheinlichkeitsdichte angegeben werden. Diese Beschreibung wird an speziellen Verteilungen demonstriert: diskrete Gleichverteilung, Poisson-Verteilung, kontinuierliche Gleichverteilung, Standard-Normalverteilung.
Die Tschebyscheff-Ungleichung als einfachste Konzentrations-Ungleichung wird aus mehreren Perspektiven beleuchtet: Es werden Beispiele für ihre typische Anwendung besprochen; es wird ein direkter Beweis gegeben; es wird gezeigt, dass sie als Spezialfall der verallgemeinerten Markov-Ungleichung aufgefasst werden kann; es wird diskutiert, wie gut die Abschätzung ist, die sie liefert. In den R-Skripten werden die Berechnungen aus den Anwendungsbeispielen ausgeführt, die man ohne Programmierung kaum bewältigen könnte.
Zufallsvariablen sind die geeignete Begriffsbildung um sowohl Ereignisse als auch deren Wahrscheinlichkeiten treffend zu beschreiben und zu berechnen. In späteren Anwendungen der Wahrscheinlichkeitsrechnung werden Zufallsvariablen ständig eingesetzt. Hier wird zunächst gezeigt, wie Zufallsvariablen mit der Ereignisalgebra und dem Wahrscheinlichkeitsmaß zusammenhängen und sich so nahtlos in den Aufbau der Wahrscheinlichkeitsrechnung einfügen. In den R-Skripten wird gezeigt, wie man Zufallsvariable leicht modellieren kann.
Es gibt verschiedene Versionen zu Docker: CE (Community Edition), Docker Desktop und Docker Tools. Was ist der Unterschied zwischen diesen Versionen und welche sollte man für lokale Entwicklung am besten verwenden?
Beim Entwickeln von Angular-Anwendungen kann es erforderlich sein, sowohl Query- als auch Route-Parameter gleichzeitig auszulesen. Dies ist nicht ganz trivial, da in Angular Subscriptions für Query- und Route-Parameter unabhängig voneinander und asynchron ausgeführt werden. Dadurch kann es passieren, dass die Daten aus den Route-Parametern noch nicht geladen sind, während bereits auf die Query-Parameter zugegriffen wird. Dieser Artikel zeigt, wie man diese beiden Arten von Parametern synchron mit Hifle von RxJS auslesen kann.
Ein Algorithmus zur Simulation von N Spielen am k-armigen Banditen (multi-armed bandit) wird in R implementiert. Der Algorithmus erlaubt die Auswahl einer Strategie zur Wahl des nächsten zu spielenden Armes. Als Strategien stehen die im Artikel "Der mehrarmige Bandit (multi-armed bandit): Simulationen mit einfachen Algorithmen vorgestellten Strategien zur Auswahl, es können aber leicht weitere Strategien implementiert und eingefügt werden.
Eine der grundlegenden Eigenschaften von Strings in Java ist ihre Unveränderlichkeit, auch bekannt als Immutability. Doch was genau bedeutet es, dass Strings unveränderlich sind, und welche Vorteile bringt diese Eigenschaft mit sich? Mehr in diesem Artikel.
Um beim Spiel am mehrarmigen Banditen einen möglichst hohen Gewinn zu erzielen, benötigt man eine Strategie, die einen Kompromiss zwischen Exploration und Exploitation herstellt. Es werden einfache Algorithmen vorgestellt, die dieses Problem lösen und ihre Eigenschaften werden mit Hilfe von Simulationen untersucht.
Kleiner Ratgeber mit methodischen Hinweisen zum Selbststudium.
Spring Boot und H2 Datenbanken sind eine perfekte Kombination um schnell und unkompliziert eine Anwendung auszuführen. Das liegt auch daran, dass die Integration von H2 in Spring Boot einfach ist und nur nur minimale Konfiguration erfordert. Als dateibasierte Datenbank bietet H2 eine flexible und leichte Möglichkeit, Daten zu speichern, was sie besonders nützlich für Testzwecke macht. In diesem kurzen Artikel zeigen wir, wie man über eine Spring Boot Anwendung auf die H2-Console zugreifen kann.
Beim mehrarmigen Banditen oder genauer k-armigen Banditen kann man ein Glücksspiel durch Betätigen eines Armes auslösen. Mathematisch modelliert werden sie durch Zufallsvariablen mit unterschiedlichen Erwartungswerten. Möchte man am k-armigen Banditen N Spiele durchführen und dabei einen möglichst hohen Gewinn erzielen, gerät man in ein Dilemma: Einerseits muss man alle Arme untersuchen, um ihre Kennzahlen zu schätzen (Exploration), andererseits möchte man möglichst oft den besten Arm betätigen (Exploitation). Im nächsten Kapitel werden dann Algorithmen entwickelt, die versuchen einen Kompromiss zwischen Exploration und Exploitation herzustellen.
Ein wichtiger Bestandteil des Monte-Carlo-Tree-Search-Algorithmus ist es, aus einer gegebenen Spielsituation zahlreiche Spiele auszuführen, bei denen die Züge zufällig ausgewählt werden. Die Ergebnisse dieser Simulationen bestimmen dann, wie der Algorithmus den Spielbaum weiter untersucht. Um besser nachvollziehen zu können, wie der Monte-Carlo-Tree-Search-Algorithmus den Spielbaum untersucht und für die möglichen Züge Gewinn-Wahrscheinlichkeiten schätzt, werden für das Zahlenspiel 3-5-11 die Formeln hergeleitet, wie man zu gegebenem Anfangswert die Gewinn-Wahrscheinlichkeit berechnen kann, wenn sämtliche Züge eines Spiels zufällig ausgewählt werden (mit jeweils gleicher Wahrscheinlichkeit). Ferner werden Simulationen mit unterschiedlichen Anzahlen von Spielen durchgeführt, um zu beurteilen, wie gut die Ergebnisse der Simulation mit den berechneten Gewinn-Wahrscheinlichkeiten übereinstimmen.
Als weitere Methode zur Lösung von Abzählproblemen wird die Rekursion vorgestellt. Dies geschieht am Beispiel eines Zahlenspiels, für das der vollständige Spielbaum entwickelt wird. Dieser wirkt zwar sehr unregelmäßig und kann mit den bekannten kombinatorischen Formeln nicht bewältigt werden, aber aufgrund seiner rekursiven Struktur lassen sich Abzählprobleme auf das Aufstellen der Rekursionsformel und der Behandlung des Basisfalls zurückführen.
Um die Vorgehensweise beim Monte-Carlo-Tree-Search-Algorithmus besser erklären zu können, wird zunächst ein einfaches Zahlenspiel vorgestellt und analysiert. Es handelt sich um eine Variation des Nim-Spiels, für das man eine einfache Gewinnstrategie angeben kann und bei dem mit dem Anfangswert bereits festgelegt ist, welcher Spieler den Gewinn erzwingen kann. Dies hat den Vorteil, dass man später besser nachvollziehen kann, wie der Monte-Carlo-Tree-Search-Algorithmus vorgeht.
In diesem Artikel erklären wir den Unterschied zwischen zwei beliebten npm-Befehlen: "npm install" und "npm ci" und erklären, warum man "npm install" zum Installieren von Dependencies eigentlich nicht verwenden sollte.