Dateien aus Unterordnern in einen Parentordner verschieben (Ubuntu 18.04)

Angenommen ihr habt – wie beispielsweise nach dem Download von Satellitendaten einen große Menge an Ordnern, die jeweils die Daten eines Zeitabschnitts enthalten und ihr móchtet diese all einen einen geinsamen Parentordner verschieben.

Geht dazu in den Parentordner <parent>, der die Datenordner <child1>, <child2> … <childn> enthält, deren Daten ihr in den Parentordner verschieben wollt und gebt:

 find . -mindepth 2 -type f -print -exec mv {} . \;

ein.

Anschließend músst ihr noch die Ornder lóschen. Das geht mit:

find . -maxdepth 1 -mindepth 1 -type d -exec rm -rf '{}' \;

Erledigt.

Welches Basismodell soll ich für’s Transfer Learning für Bilderkennung verwenden? (Deep Learning)

TL;DR; Benutzt ResNet50. Es ist am schnellsten und günstigsten.

TS;WM – Too Short; Want More

Wenn ihr euch diese Frage auch stellt, dann schlage ich vor einmal auf Standfords DAWNBench vorbeizuschauen: https://dawn.cs.stanford.edu/benchmark/index.html.

Im Menü links unter Image Classification (ImageNet) oder Image Classification (CIFAR10) könnnt ihr jeweils sehen, welches Basismodell gerade auf ImageNet bzw. CIRFAR10 am schnellsten (Training Time), am günstigen (Training Cost: Kosten in USD) trainiert werden kann, für welches die Erkennungsgeschwindigkeit eines Bildes am höchsten (Inference Latency) und wie teuer die Erkennung von 10.000 Bildern im Licht aktuelle Clouddienstleisterkosten ist (Inference Cost).

Der klare Gewinner ist ResNet50.

Ich würde daher für den Bau eines Bilderkennungsmodells immer mit ResNet50 beginnen. 

Ausnahme: Mobile Geräte. Wenn das Modell unbedingt auf einem Smartphone oder einem Raspberry Pi verwendet werden muss, weil  der der Einsatz einer API nicht infrage kommt, gibt es spezielle andere Architekturen. Ein Beispiel ist Mobilenet V2.

Bau meiner extendable Deep Learning Machine – “Deep Al”

Seit ich mich mit Deep Learning beschäftige habe ich bis auf bei kleineren Modelle immer auf Cloud Services gesetzt (vor allem AWS, aber auch GCP, Azure und zuletzt auch Google Colab). In letzter Zeit ist jedoch mein Wunsch nach  einer eigenen (erweiterbaren) Deep Learning Machine gewachsen. Um Modelle für meine Kunden zu rechnen, aber auch für meinen weiteren Lernfortschritt. Nach einem Monat Recherche habe ich mir nun letzte Woche (Januar 2019) folgendes Setup bestellt:

Wichtige Kritieren waren für mich:

  • Preis möglichst nicht mehr als 2000 Euro
  • gutes Preis/Performance-Verhältnis
  • gutes Performance/Energieverbrauchsverhältnis
  • niedrige Lautstärke
  • Erweiterbarkeit hin zu einem Multi-GPU-System

Zur GPU: Für Deep Learning ist die GPU entscheidend. Ich habe mich für die RTX 2070 entschieden, da diese laut diesem Artikel von Tim Dettmers das beste Preis Leistungsverältnis bietet. Das  besondere an den NVIDIA RTX 20XX-Grafikkarten, ist, dass man auf ihnen Deep Learning Modelle mit 16 Bit rechnen kann. Genug Genaugigkeit für Deep Learning und mit dem angenehmen Nebeneffekt, dass so aus 8 GB DDR6 RAM auf der Karte effektiv 16 GB werden! Daher ist auch die Performance der 20XX-RTX-Karten besser als die der GTX 10XX Karten.

Mehrere GPUs und PCIe Lanes. Um mehr als eine GPU betreiben zu können ist die Anzahl unterstützter PCIe-Lanes relevant. Bei einer GPU beträgt der Performance-Verlust von 8x gegen 16x allerdings nur wenige Prozent. PCIe Lanes transportieren Daten aus dem CPU RAM zum GPU RAM. Laut Tim Dettmers betragen die Ladezeite für ein Batch aus 32 ImageNet-Bilder (32x225x225x3) bei 32 Bit mit 16 Lanes 1,1 Millisekunden, mit 8 Lanes 2,3 Millisekunden und mit 4 Lanes 4,5 Millisekunden. Wenn man nun bedenkt, dass ein Forward- + ein Backward-Pass durch ein ResNet-152-Netzwerk 216 Millisekunden dauert, dann machen 18 zu 8 Lanes eine Geschwindigkeitsdifferenz von 0,55% bzw. 1,56%. Für eine GPU ist die Anzahl Lanes also ziemlich egal.

Anders ist das bei mehreren GPUs. Dettmers empfiehlt bei 4 GPUs 8 Lanes pro GPU. Also allein 32 Lanes für die GPUs – mehr, als die meisten Prozessoren liefern.

Prozessor. “Reguläre” Intel Prozessoren haben nur circa 16 bis 28 PCIe-Lanes. Und schon SSD, Netzwerkadapter benötigen manchmal 4 Lanes. Für einen Gaming-PC kein Problem, wohl aber für ein Multi-GPU Deep Learning System.

Damit kommen eigentlich nur Intel Xeon oder AMD Threadripper Prozessoren infrage. Neue Xeon Prozessoren sind zu teuer (>1000 EUR). Da mir auch wichtig ist bei der Vorverarbeitung (Preprocessing) von Daten nicht zu lange warten zu müssen und dafür auch die CPU eine Rolle spielt, wollte ich lieber einen aktuelleren Prozessor und habe daher den kleinsten Threadripper, das Modell 1900x, gewählt, der wie alle anderen Threadripper auch 64 PCIe Lanes unterstützt.

Motherboard: Das Aorus Pro Motherboard hat genug Platz und Steckplätze für ein 4xGPU Setup und unterstützt 16x / 16x / 8x / 8x PCIe Lanes pro Karte und ist mit circa 300 EUR Kostenpunkt das günstigste Modell für diese Kriterien.

RAM. Wieder bei Tim Dettmers habe ich gelernt, dass CPU RAM nicht besonders relevant ist. Es reicht völlig aus, wenn man soviel CPU RAM hat wie GPU RAM. Warum habe ich nun also 16 GB RAM und nicht etwa 8 GB RAM? Das liegt eben daran, dass der RTX RAM doppelt zählt (s. unter Grafikkarte).

Auch der RAM-Taktgeschwindigkeit wird oft zuviel Gewicht beigemessen: die meisten Motherboards unterstützen überaupt nur bis 2666 MHz RAM. Und da RAM für Deep Learning eh eine untergeordnete Rolle spielt, sollte man sein Geld statt in mehr und schnelleren CPU RAM zu stecken, lieber in weitere GPUs investieren! Genau das habe ich vor. Schon in ein paar Monaten stecke ich entweder eine zweite RTX 2070 dazu oder verkaufe die RTX 2070 und schaffe dafür zwei RTX 2080 an, wenn diese bis dahin im Preis gefallen sein sollten.

Zum Kühler: der Artic 33 TR, den ich gekauft habe, ist solide, sieht gut aus und macht sehr wenig Geräusche. Allerdings war die Montage nicht ganz so einfach und er deckt mit seiner Kühlfinne nicht den ganzen CPU Headspread ab. Daher würde ich von ihm zugunsten des Noctua NH-U14S TR4-SP3 Kühlers abraten. Ich werde den in den nächsten Wochen tauschen. Einen interessanten Test dazu könnt ihr hier lesen.

Zu den Speichermedien. SSD 500 GB: einfach, weil es schnell ist. Da laufen Betriebssystem und dort liegen jeweils die Daten für das aktuell in der Entwicklung befindliche Modell. HDD 3 TB: für Datensätze für frühere oder spátere Modelle.

Zum Netzteil. Ihr solltet für alle eure Komponenten den Energiebedarf vorausberechnen. Das sind bei mir:

  • Threadripper 1900X: max. 180Watt
  • ARCTIC – Freezer 33 TR (Black/White) CPU Cooler: 5Watt – 10Watt
  • Corsair – Vengeance LPX 16 GB (2 x 8 GB) DDR4-2400 Memory: 11 Wattatt
  • Seagate – Barracuda 3 TB 3.5″ 7200RPM Internal Hard Drive: 4 Watt – 20Watt
  • Samsung – 970 Evo 500 GB M.2-2280 Solid State Drive: 2 Watt – 10 Watt
  • Zotac – GeForce RTX 2070 8 GB Video Card: 46 Watt – 185 Watt
  • Insgesamt: 90 Watt – 416 Watt

Ich habe dennoch ein 1000 Watt Netzteil genommen, da dies noch 3 weitere RTX 2070 Grafikkarten mitversorgen könnte. Das wird, sofern ich auch 2080 Karten upgraden sollte schon zu knapp, da diese jeweils 225 Watt brauchen. Allerdings, will ich das nun doch erst noch einmal abwarten. Ich habe das Platinum Modell genommen, da dies im Vergleich den höchsten Leistungsgrad im Vergleich zu anderen Modellen (Gold oder Silber) hat. Warum das relevant ist? Wenn das Gerät bei mir in Zukunft für größere Kundenmodelle oder auch meine Experimente mal einen Monat durchläuft, dann wären das bei 4GPUs und einem Strompreis von circa 30 Cent pro KWh 216 EUR Stromkosten – bei einem Leistungsgrad von 100%. In Wahrheit liegt dieser natürlich niedriger. Jede PSU Klasse macht in etwa 3 % Leistungsgradunterschied. Macht auf einen Monat dann schon einmal 6.5 Euro zur nächsten Stufe (Platinum vs Gold). Für mich ist das der Anschaffungspreis von +50 EUR mehr in Ordnung. Das Netzteil soll ja auch viele Jahre halten.

Zum Gehäuse. Wichtig ist, dass das Gehäuse volle ATX Größe hat, damit alle Komponenten Platz finden. Darüberhinaus hat mir das 750D Airflow Modell mit Glasscheibe von Corsair einfach gut gefallen.

Betriebssystem: Ich habe Ubuntu 18.04 LTS intalliert.

Zusammengebaut habe ich die Maschine mit Joachim Tecklenburg, der mich auch in puncto Online Marketing berät und unterstützt.

Wenn ihr Gedanken, Feedback, Vorschläge oder Kritik zu meinem Setup habt, freue ich mich von euch zu hören! Auch höre oder lese ich gerne über eure Setups!

In meinem nächsten beiden Artikel berichte ich jeweils einmal  über die Installation von fastai und pytorch sowie keras mit tensorflow Backend auf dieser Maschine.

Mit besten Grüßen und bis dahin: Forward-Pass!

Frank

Backup von mongodb: dump und restore für in docker.

Mein System: MacOS High Sierra 10.13.5 (2018), die Anleitung sollte aber auch auf den meisten Linuxmaschinen funktionieren. Über Windows kann ich leider keine Aussage machen.

Für mich stellte sich jüngst die Frage wie man eine mongodb-Datenbank aus einem Container exportiert und anschließend in einen neuen Container importiert. Hier für alle, die das auch interessiert / benötigten eine kurze Anleitung wie ich das gemacht habe, Wie immer gibt es mehrere Möglichkeiten. Ich habe mich bemüht eine Lösung zu finden, die einigermaßen einfach ist.

dump / backup der MongoDB aus docker container

Ich gehe davon aus, dass euer docker Container, der mongo beinhaltet läuft. Kümmern wir uns als erstes um das, was ihr braucht. Das sind:

  • den Namen des virtuellen Netzwerks, indem euer Container läuft
  • einen lokalen Ordner für den dump, z.B. ~/backup

Namen des virtuellen Netzwerks eines docker Container finden

container_id finden

> docker container ls

In der ersten Spalte findest du zu deinem Container die docker_id

Namen des virtuelle Netzwerks finden

Wenn ihr:

> docker inspect <container_id>

eingebt, findet ihr direkt unter “Network”, den Namen des Netzwerks. Nenne wir ihn ab jetzt <network_name>.

Dump der MongoDB aus Container

Gebt folgendes ein:

> docker run --rm --network=<network_name> --mount type=bind,src=<Pfad zu eurem Backup Folder>/backup,dst=/backup mongo bash -c 'mongodump --out /backup --host mongo:27017'

(Optional): Geht auch ohne es zu verstehen. Wer es aber verstehen will hier eine Erklärung. docker run startet einen weiteren Container. Die Option –rm stellt sicher, dass sobald der Container seine Aufgabe erfüllt hat wieder gelöscht wird. Die Option –network=<network_name> hängt den neuen temporären Container in dasselbe Netzwerk, indem sich der mongo Container befindet, von dem der dump gewünscht ist.–mount type=bind,src=<Pfad zu eurem Backup Folder>/backup,dst=/backup stellt eine Verbindung eines Backup-Folders auf eurer Maschine mit einem Ordner innerhalb des docker Containers. mongo ist der Name des Images, dass ihr für den temporären Container verwendet.  Der anschließende Befehlt: bash -c ‘mongodump –out /backup –host mongo:27017’ führt in eure Container den Bashbefehl “mongodump –out /backup –host mongo:27017” aus, der letztlich vom im virtuellen Netzwerk befindlichen mongodb Server (Option: —host mongo:27017) dessen Datenbank in den Ordner /backup dumpt (Option: –out /backup). Da der Folder /backup im Docker Container mit dem Folder <Pfad zu eurem Backup Folder> mit eurer lokalen Maschine verbunden ist, findet ihr den dump nun dort.

(Optional) Packen des Dumps:

Für den Fall, dass ihr das dump bewegen wollt, bietet sich packen an. Das geht so:

> tar -cvzf ~mongo_dump.tar.gz <Pfad zu eurem Backup Folder>

Restore der MongoDB in Container

(Optional) Entpacken des Dumps:

Solltet ihr den dump gepackt haben, so müsst ihr diesen nun entpacken. Das geht so. Zunächst müsst ihr das Archiv in den Ordner kopieren, den ihr in einen Container mounten wollte.

> cp <Pfad zu mongo_dump.tar.gz> <Pfad zu eurem Backup Folder>

Anschließend wechselt ihr in diesen Ordner:

> cd /Users/<PROFILE-FOLDER>/backup

Und entpackt den Inhalt:

> tar -xvzf learning_locker_mongo_dump.tar.gz

Und löscht nun die Kopie des Archivs:

> rm mongo_dump.tar.gz

Import des dumps

Findet zuvor analog zur Anleitung oben den Name des virtuellen Netzwerks <network_name> heraus. Einen Backup Folder mit Pfad <Pfad zu eurem Backup Folder> sollte ihr auch haben, indem sich ein entpackter dump befindet.

Gebt nun:

> docker run --rm --network=< --mount type=bind,src=/Users/<PROFILE-FOLDER>/backup,dst=/backup mongo bash -c 'mongorestore /backup --host mongo:27017'

ein.

Viel Erfolg!

Blank Images / Leere Bilder Problem bei Google Maps lösen

Vielleicht hattet / habt ihr das Problem, dass alle oder zumindest manche Google-Maps Bilder nicht richtig angzeigt werden?

 

 

 

 

 

Das Problem sind Fehlerhafte Cookies. Um es zu lösen geht unter: chrome://settings/content/cookies  und  klickt auf “See all cookies and site data” und sucht im Suchfeld (Im Feld steht:”Search Cookies”) nach “www.google.com”. Es erscheint dann folgender Eintrag:

Klickt den Eintrag an und ihr bekommt folgende Detailansicht:

Das Problem liegt jetzt in einem oder mehreren Cookies mit dem Format:

gsScrollPos-<ZAHL>

Mir ist leider keine einfache Methode bekannt mit der man jetzt den oder die fehlerhaften unter diesen Einträgen identifizeren könnte. Es ist daher am einfachsten, ihr löscht sie einfach alle durch Klick auf das ‘x’ daneben.

Diese Cookies speichern jeweils ob man gescrollt hat – es sollten demnach keine anderen Auswirkungen resultieren. Cookies, die Google benötigt legt es sonst wieder an.

Viel Spaß nun wieder beim Nutzen von Google Maps!

Machine Learning in der Praxis – Teil 1 – Was ist Machine Learning?

Liebe Leser,

in dieser Serie von Artikeln will euch ein ganzheitliches Verständnis über Machine Learning vermitteln. Wir werden eine Reihe von Algorithmen kennenlernen, wir werden uns dazu verschiedene Typen von Lernverfahren anschauen. Darunter sind sog. überwachte Lernverfahren wie Regression, Klassifikation (z.B. mit Support Vector Machines) sowie unüberwachte Lernverfahren wie Clustering (hierarchische und nicht-hierarchische Verfahren wie z.B. k-Means ) und schließlich werden wir zu Deep-Learning mit neuronalen Netzwerken übergehen und uns Bilderkennung und Reinforcement-Learning anschauen. Euch sagen viele dieser Begriffe nichts oder ihr habt nur eine vage Vorstellung davon? Dann ist diese Artikelserie für euch richtig!

Wir werden uns zu jedem Verfahren die zugrunde liegende Intuition und Theorie aus der Vogelperspektive anschauen, Anwendungen mit scikit-learn in Python kennenlernen. Dafür werden wir anhand realer Daten sehen, was die Verfahren von uns als Input erwarten, was wir als Output erhalten können, und wie wir diesen interpretieren können.

Schließlich wollen wir uns aber auch die genaue Funktionalität anschauen, indem wir die zugrundeliegende Mathematik nachvollziehen und noch tiefer eintauchen. Dafür werden wir die Verfahren in einfacher Weise selbst programmieren. Das wird euch letztlich helfen, die Verfahren wirklich zu verstehen, was euch in Zukunft helfen wird, wenn ihr die Verfahren auf neue Problemstellungen anwenden werdet.

Voraussetzungen sind Grundkenntnisse in Python 3. Es schadet nicht, wenn ihr euch etwas in Wahrscheinlichkeitsrechnung und Statistik auskennt. Es ist aber keine zwingende Voraussetzung. Ich will versuchen es einfach zu halten.

Was ist Machine Learning? Ein erstes Beispiel.

Machine Learning ist nicht alt. Die Forschungsgeschichte beginnt in etwa in den 1950er Jahren. Machine Learning ist die Wissenschaft oder Kunst, Maschinen (bzw. Computer) so zu programmieren, dass diese selbstständig aus Daten lernen können.

Arthur Samuel (Quelle: Wikipedia)

Arthur Samuel definierte etwas allgemeiner im Jahre 1959: Machine Learning ist die Erforschung von Methoden, Maschinen die Fähigkeit zu geben zu lernen, ohne sie explizit zu programmieren.

Eine quantitativere Definition ist die folgende: Eine Machine lernt aus einer Menge Daten D, in einer bestimmten Aufgabe A in Bezug auf ein Leistungsmaß L besser zu werden, wenn die Leistung in Bezug auf A gemessen in L mit der Menge D zunimmt.

Letztlich geht es darum, sich das Leben einfacher zu machen und Wissen nicht explizit in Form von Regeln programmieren zu mussen, sondern einer Maschine ein Verfahren zu geben, mit dem sie selbstständig lernt. Ein Beispiel ist der Spamfilter. Er erkennt anhand von Beispielen für Spam und Nicht-Spam (“Ham”) neuen Spam und Ham. Weil er mit Beispielen arbeitet, die ihm sagen, wonach er suchen soll, spricht man dabei von einem sog. überwachten Lernverfahren. Eine sehr simple Methode, Spam zu erkennen wäre folgende: jede neue E-Mail wird mit einer Liste von Spam-E-Mails vergleichen, von denen der Spamfilter bereits weiß, dass sie Spam sind. Es muss dann aber nur ein einzelnes Wort, ja nur ein einzlener Buchstabe in einer neuen Spam-E-Mail anders sein als in einer der bereits bekannten Spam-E-Mail und der Spamfilter würde diese E-Mail nicht mehr als Spam erkennen. Ihr könnte euch vorstellen, dass durch Austauschen oder Hinzufügen von Zeichen in bereits bekannte Spam-E-Mails unbegrenzt viele neue Varianten von Spam enstehen könnten. Es ist also kein sinnvolles Verfahren, Spam-E-Mails durch “Auswendiglernen” bzw. durch von Hand programmierte Regeln zu erkennen. Besser wäre es, wir hätten ein Verfahren, dass Spam-E-Mails automatisch, möglichst zuverlässig detektiert, ohne “echte” E-Mails auszusortieren. Wir brauchen ein echtes Vorhersageverfahren.

Hier kommt Machine Learning ins Spiel. Eine Möglichkeit wäre nun, dass ein Verfahren lernt, welche Worte häufiger in Spam und welche häufiger in Ham vorkommen. Ein Machine-Learning-Verfahren könnte nun die Wahrscheinlichkeit, ob eine Mail Spam oder Ham ist aus der Anzahl Worte ableiten, die eher in Spam oder eher in Ham auftreten.

Eine der ersten hierfür eingesetzten Methoden war der sogenannte Naive Bayes Filter. Es handet sich dabei um ein überwachtes Lernverfahren und genauer eine sog. Klassifizierungsmethode. Sie klassifiziert E-Mails entweder als Spam oder Ham.

Zu Anfang weiß der Naive-Bayes-Filter nichts. Er braucht zunächst Daten D. Diese bekommt er von uns, die wir E-Mails lesen und als Spam markieren. Immer wenn du oder ich eine E-Mail als Spam markieren, kann der Spamfilter lernen, dass die Worte aus der Spam-E-Mail für Spam typisch sind. Tritt nun in vielen Spam-E-Mails immer wieder das Wort “Viagra” auf, so werden diese in Zukunft herausgefiltert. Der Naive Bayes Filter wird mit den von uns gelieferten Daten D, in seiner Aufgabe A Spam zu erkennen in puncto Leistungsmaß “Anteil richtig erkannter Spam-E-Mails” L mit zunehmender Menge Daten D besser.

Wir werden in den nächsten Kapiteln weitere Aufgaben und weitere Methoden kennenlernen.

Wir leben im goldenen Zeitalter des Machine Learning!

Wir leben in einer aufregenden Zeit! Ihr könnt heute das Machine Learning Verfahren eurer Wahl auf  100.000 Euro teurer Hardware bei z.B. Amazon AWSGoogles Cloud oder Microsoft Azure oder vielen anderen Anbeitern auf Terrabytes von Daten anwenden und Modelle erhalten – zum Spaß, für eure Softwareprojekte oder eure Businessidee. Und das Ganze für wenige Euros pro Stunde. Gleichzeitig sind über Programmiersprachen wie Python und Module wie scikit-learn Machine-Learning-Verfahren auch für wenig erfahrene Entwickler verfügbar. Viele Verfahren lassen sich auch ohne Verständnis ihrer genauen Funktionsweise sofort anwenden. Wer es etwas genauer Wissen will und bessere Ergebnisse erzielen will und erfahren will, für welches Problem, welches Verfahren am besten geeignet ist, für den ist diese Aritkelserie!

Im nächsten Teil werden wir uns Machine Learning noch etwas genauer aus der Vogelperspektive anschauen und lernen, welche Arten von Verfahren es gibt. Im übernächsten Artikel werden wir bereits eine erste Aufgabe und eine praktische Lösung dafür kennenlernen.

Viel Spaß und beste Grüße

Frank Wolf

 

How to ignore *.pyc files in Atom

You are furious about all theses *.pyc files in you workfolder? I hear you. Here is how you can get rid of them.

  • Go to Atom -> Preferences -> Core Tab
  • Scroll down to “Ignored Names”
  • add -> *.pyc

 

 

  • in Packages -> type: tree-view
  • click on the card “tree view”
  • check the checkbox next to “Hide Ignored Filenames”

 

 

 

 

  • You are done! Time to be happy again 🙂

3. Platz auf dem Bertelsmann Hackathon

Anfang April war wieder der Bertelsmann Hackathon im Denkwerk in Herford. Designer, Programmierer und Softwarevisionäre entwarfen und bauten dort über die nächsten 36 Stunden an coolen Lösungen für Challenges aus den Tochterfirmen der Arvato-Unternehmensbereichs. Arvato gehört zum Bertelsmannkonzern und betreibt Servicecenter und IT-Systeme und bietet weltweit u.a. Logistik- und Finanz- und IT-Dienstleistungen.

Hier ein paar Worte einiger Teilnehmer, Teamkollegen und mir im Film zum Bertelsmann Hackathon 2018.

Zu fünft haben wir an einer Lösung gearbeitet Bluethooth Beacons (Bluethoothsender) zur Ortung im Raum einzusetzen.  Wir haben Raspberry Pis mit Bluethooth Dongle im Raum verteilt, die die Beacons empfangen können und aus den anfallenden Entfernungsdaten die räumliche Position der Beacons berechnet. Ich habe zusammen mit zwei Teamkollegen an der Software gearbeitet. Jeweils ein Teamkollege haben am Flask-Backend und einer an der Rapsberry Pi Programmierung gekümmert (Python). Ich habe mich um Berechnungsverfahren (Trilateration), Frontend (Vanilla JS + heatmap.js) gekümmert und die Kommunikation im Softwareteam moderiert. Zwei weitere Teammember haben sich um Businessmodell, Kommunikation, Marketing und Sales gekümmert. Sie sind sogar  “auf die Straße” gegangen und haben in Startup-Weekend-Tradition echte Kunde angesprochen und sie um ihr Feedback bzw. nach ihrem Interesse gefragt. Die Ergebnisse waren gut und wir waren gespannt auf das Feedback der Jury am Sonntag. Bevor wir dazu kommen ein paar Worte zur Hackathons allgemein und im besonderen des Bertelmann Hackathons.

Warum solltest auch du an einem Hackathon teilnehmen?

Hackathons sind eine großartige Gelegenheit dazuzulernen. Sie sind meist kostenlos, es gibt meist Verpflegung und Unterkunft und oft auch eine Reisekostenerstattung – was insbesondere für Stundenten und junge Professionals interessant sein kann. Alle diese Bedingungen waren beim Bertelsmann Hackathon erfüllt.

Ich kann jedem – egal wie fit ihr im Coden seid. Der Erfolg von Softwareprojekten liegt in der Zusammenarbeit der Teammitglieder und/oder von Kunden und Auftraggebern. Es kommt darauf an mit Menschen unterschiedlicher Hintergründe und unterschiedlichen Fähigkeiten gut zusammenzuarbeiten. Ich denke es gibt keinen besseren Weg als das auf einem Hackathon zu lernen. Man lernt definitiv viel neues kennen: übers Entwernfen, Coden, Teambildung und Zusammenarbeit. Und natürlich nette Leute – unter den Teilnehmern und Veranstaltern. Man gewinnt zudem  hautnahe Einblicke in die Arbeit eines interessanten Unternehmens und Konakte zu Mitarbeitern und Personalern.

Trotzdem ich bereits seit vielen Jahren arbeite, macht mir das Format immer noch großen Spaß und es gibt immer wieder vieles neues zu lernen – so sind Hackathons unabhängig von der Erfahrungsstufe ein tolles Event.

Warum sich die Teilnahme am Bertelsmann Hackathon lohnt

Den Bertelsmann Hackathon fand ich insbesondere gut, da es viele unterschiedliche Challenges gab, bei denen viele aktuell Technologie zum Einsatz kam: Roboter, verteilte Systeme, Blockchain, Bilderkennung und Bots.  In der Vorstellung der Challanges hat man zudem gute Einblicke in vier verschiedene Unternehmen von Arvato erhalten. Auch ist das Denkwerk als Location absolut genial. Nicht nur war das Essen gut, sondern es gab auch Möglichkeiten zum Trainieren, Schlafmöglichkeiten sowie angenehm eingerichtete Arbeits- und Gruppenräume sowie Rückzugsräume, um auch tagsüber mal 30min Ruhe tanken zu können. Das Arvato-Team hat zudem erfolgreich für eine angenehme Atmosphäre gesorgt und interessante Einblicke in ihren Arbeitsalltag gegeben. Ansprechpartner waren praktsch 24/7 anwesend und ansprechbar.

3. Platz!

Für uns hat sich die Teilnahme gleich doppelt gelohnt. Nicht nur hatten wir großen Spaß, sondern konnten als eines von drei Teams am Sonntag die Jury mit unserer Lösung überzeugen und haben so den 3. Platz gemacht und jeder einen Raspberry Pi gewonnen. Nicht schlecht für eine kostenlose Veranstaltung.

Also, ich kann euch Hackathons speziell und den von Bertelsmann im bersonderen empfehlen. Schaut doch nächstes Jahr einmal vorbei! Vielleicht lernen wir uns dann dort kennen!

Hackathons nach Ort findet ihr übrigens hier:

Ich werde als nächstes wahrscheinlich zum Healthcare Hackathon im September nach Kiel gehen.

Mit Rambox Ordnung ins Messenger-Chaos bringen

Liebe Leser,

ich bin vor einigen Tagen auf Rambox gestoßen und habe es mir nach und nach eingerichtet. Rambox ist eine Anwendung für Windows, Mac und Linux, in der ihr (fast) alle gängigen Messenger in einer Anwendung zusammenfassen könnt.

Ich verwende es u.a. mit Mattermost, Telegram, Whatsapp, Skype und Google Hangouts.

Die Einrichtung ist einfach und wird über leicht nachvollziebare Dialoge begleitet.

Rambox macht das Schreiben von Nachrichten sehr viel angenehmer mit individuellen Messenger-Apps auf dem Telefon, Laptop oder im Browser.

Schaut’s auch mal an!

Euch eine gute Zeit!

Frank Wolf

Was ist eigentlich statistische Signifikanz?

Statistische … was?

Wenn etwas statistisch signifikant ist, sagen wir, dass das Ergebnis einer Untersuchung (z.B. der Wirkung eines Medikamentes) nicht zufällig gewesen sein kann.

Die statistisch Signifikanz (der sog. p-Wert) gibt an wie unwahrscheinlich es ist, dass das Ergebnis einer Untersuchung zufällig passiert ist. Je kleiner er ist, desto unwahrscheinlicher, dass der Zufall am Werk war. Umgekehrt halten wir ein statistsiches signifikantes Untersuchungsergebnis für ein Ergebnis, dass nicht zufällig passiert ist.

Was?!

Schauen wir uns dazu ein einfaches Beispiel an.

Ein einfaches Beispiel: Kinder beim Zähneputzen.

Kinder sollen sich abends vor dem Schlafengehen die Zähne putzen. Bei mir war das so und bei den meisten Kindern, die ich kenne, ist das auch heute noch so. Und, es hat sich nicht viel geändert, seit ich klein war: Kinder haben noch immer nicht so große Lust dazu. Also muss man sie immer wieder daran erinnern. Sagen wir eine Mutter erinnert ihre Tochter Jule, sie soll sich die  Zähne putzen. Jule entgegnet nun aber: “Ich habe mir schon die Zähne geputzt!” Allerdings ist ihre Zahnbürste noch trocken.

Unsere Schlussfolgerung ist: da die Zahnpürste noch trocken ist, ist es unwahrscheinlich, dass sich Jule schon die Zähne geputzt hat. Ihre Mutter wird also davon ausgehen, dass Jule die Zähne noch nicht geputzt hat und sie nochmals ins Bad schicken.

Aus Sicht des Statistikers sieht die Situation so aus:

  • Daten: die Zahnbürste ist trocken
  • Hypothese: Jule hat sich die Zähne schon geputzt
  • Folgerung: falls die Hypothese wirklich wahr wäre, wären die Daten außergewöhnlich, daher verwerfen wir diese Hyothese und nehmen die stattdessen ihr Gegenteil (Jule hat ihre Zähne noch nicht geputzt) als wahr an

Wie bereits am Anfang gesagt: die statistische Signifikanz gibt an wie wahrscheinlich es ist, dass das Ergebnis einer Untersuchung zufällig ist.

Probleme bei statischen Tests

Interessant ist auch folgendes: nur, weil wir ein Test aussagt, dass eine Untersuchung statistische signifikant wahr, heißt das noch lange nicht, dass sie auch notwendigerweise wahr ist. Beispielsweise hätte Jule auch so vor dem Zähneputzen drücken können, indem sie die Zahnbürste einfach eine Sekunde unter laufendes Wasser hält. Dann ist sie nass und es erscheint so, als ob sie sich die Zähne geputzt hätte – zumindest, wenn wir die Trockenheit bzw. Nassheit der Zahnbürste als alleiniges Kritierum für die Untersuchung heranziehen. Um also sicher zu gehen müssten noch weitere Faktoren untersucht werden: z.B. Füllstand der Zahnpastatube oder die Menge Wasser, die durch den Wasserhahn gelaufen ist, als sie im Bad war. Man könnte auch ihren älteren Bruder befragen usw. Auch diese Messwerte könnten ihre Probleme haben, geben uns aber zunehmend mehr Sicherheit für das Für und Wider der Hypthese.

Ein weiterer Punkt: wir können uns nie 100% sicher sein. Wenn ihre Mutte Jule z.B. um 18:00 daran erinnert hat Zähne zu putzen und Jule das sofort gemacht hat, der Tag warm war und im Bad die Heizung voll aufgedreht, weil es nachts noch kalt gewesen war, dann ist es nicht ausgeschlossen, dass die Zahnbürste 2 Stunden später schon wieder außen trocken ist und die Mutter, die die Zahnbürste nur äußerlich kontrolliert hat nun zu der Schlussfolgerung gekommen ist, die Zahnbürste wäre trocken.

Die Resultate solcher Untesuchungen sind immer nur mit einer bestimmten Wahrscheinlichkeit zutreffend oder unzutreffend.

Akzeptable Irrtumswahrscheinlichkeit

Häufig fordern Experimente oder Untersuchung ein sog. Signifikanzniveau. Oft liegt das bei 5%. In Formeln sagt man: p < 0.05 muss erfüllt sein. p ist der sog. Wahrscheinlichkeitswert. Und wir akzeptieren Untersuchungen dann, wenn Fehler in weniger als einem von 20 Fallen auftreten – bzw. in weniger als 5% der Fälle. Daher spricht man von einem 5%-Signifikanzniveau.

Beispiel: Wirkt das Medikament?

Betrachten wir z.B. die Wirksamkeit eines Medikaments. Ein Signifikanzniveau von 5% heißt nun, dass sofern wir sehen, dass ein Medikament statistisch signifikant wirksam ist, die Wahrscheinlichkeit, dafür, dass das reiner Zufall ist bei 5% liegt.

Zwar wird ein Wert von 5% oft verwendet, ist aber willkürlich. Gerade bei Medikamententest möchten wir vielleicht lieber ein Signifikanzniveau von 1% oder sogar 0,1%. Wir wollen also, dass die Irrtumswahrscheinlichkeit für die Wirksamkeit des Medikaments geringer ist.

Ergibt ein Signifikanztest beim Vergleich von zwei Gruppen von Patienten – eine mit und eine ohne Medikament – eine Heilungsdifferenz von 10% zugunsten der Gruppe mit Medikament und ergibt sich ferner dafür ein p-Wert von 0,0005, dann bedeutet das: die Wahrscheinlichkeit dafür, dass die Gruppe mit Medikament 10% schneller geheilt ist, ist mit einer Wahrscheinlichkeit von 0.05% auf den Zufall zurückzuführen. Also sehr unwahrscheinlich zufällig und daher sehr wahrscheinlich auf das Medikament zurückzuführen!

Wobei natürlich auch für diese Untersuchung ähnlich wie für die Betrachtung von Jule beim Zähneputzen gilt: auch, wenn die Untersuchung sehr für das Medikament spricht, kann es immer noch sein, dass wir nicht richtig oder nicht genug messen. Es könnte z.B. sein, dass die Gruppe mit Medikament im Mittel 20 Jahre jünger war, als die Gruppe ohne Medikament oder die Gruppe mit Medikament könnte sich jeden Tag Blaubeeren reinhauen, die entweder unabhängig vom und gemeinsam mit dem Medikament die Heilung positiv beeinfluss haben könnte. Daher ist es wichtig wie wir die Patienten für Studien oder allgemeiner die Attribute für unsere Untersuchung auswählen und zudem die Zusammenhänge zwischen den Attributen und dem Ergebnis untersuchen. Für Experimente, deren Ergebnis möglichst zweifelsfrei auf die Maßnahme (hier: das Medikament) zurückgeführt werden kann, müssen wir die Auswahl der Stichproble (hier: der Patienten) randomisieren, also zufällig gestalten und zusätzlich für wichtige Attribute kontrollieren: z.B. Alter, Ernährungsgewohnheiten, andere Erkrankungen, bestimmte Genausprägungen usw., wovon wir wissen, dass es die Untersuchungsergebnisse verfälschen könnte.

Im nächsten Artikel möchte ich zeigen wie man für einen konrekten Fall einen p-Wert berechnen kann.