benötige Hilfe bei Augabe

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
PBahner
User
Beiträge: 1
Registriert: Samstag 27. April 2019, 18:18

Hallo!
Ich nehme am Bundeswettbewerb "Künstliche Intelligenz"(bw-ki.de) teil. Bei der Aufgabe 15 bin ich am Verzweifeln.
In der Aufgabe steht:
Aufgabe 15
Wie du merkst, ist es trotzdem noch sehr schwer, die Parameter durch Ausprobieren zu finden. Jetzt stell dir mal vor, man müsste das für alle Merkmale der Hunde machen.

Wir müssen also ein Verfahren entwickeln, das die besten Parameter für uns findet. Häufig verwendet man dafür das Gradientenverfahren – auf YouTube und Wikipedia kannst du dich dazu informieren, bevor wir weitermachen.

Um das Gradientenverfahren anwenden zu können, müssen wir den Gradienten, also die Richtung mit den größten Abstieg, der Kostenfunktion kennen. Den erhalten wir, indem wir die Kostenfunktion ableiten.

Die partielle Ableitung der Kostenfunktion nach einem Gewicht 𝑤𝑖 für einen einzelnen Hund mit Merkmalen 𝑥⃗ ist gegeben durch:
𝑑 / 𝑑𝑤𝑖 * cost(𝑥⃗ ,𝑤⃗ ,𝑦)=(𝑝(𝑥⃗ )−𝑦) * 𝑥𝑖

und für den Bias:
𝑑 / 𝑑𝑏 * cost(𝑥⃗ ,𝑤⃗ ,𝑦)=(𝑝(𝑥⃗ )−𝑦)

Der Gradient fuer alle Hunde ist einfach das Mittel der einzelnen Gradienten.

𝑦 ist hier wieder das Label (gesund / krank) des jeweiligen Hundes. Wir wollen das Gradientenverfahren anwenden, um Gewichte und den Bias zu finden, die uns die beste Diagnose liefern. Dazu musst du eine Funktion schreiben, die bei jedem Schritt die Werte anpasst.\ Die Werte werden immer in Gegenrichtung des Gradienten verändert, um die Kostenfunktion zu minimieren. Das heißt, du musst in der Funktion derivative_cost die Ableitungen der Kostenfunktion anwenden.

Nur für dein Interesse: In unserem Test, der dir ausgibt, ob dein Ergebnis richtig ist, starten wir den ersten Schritt, indem wir alle Gewichte und den Bias auf 0.1 setzen und die Lernrate auf alpha = 0.0001. Wenn du in deinem Jupyter Notebook deine Funktionen testest, \ kannst du auch diese Werte übernehmen.
Die Methoden namen und deren parameter waren schon vorgegeben. Die Funktionen "p()" und sigmoid wurden in vorherigen Aufgaben schon als richtig bewertet. Folgenden Code habe ich daraus geschrieben, welcher leider nicht richtig ist:

Code: Alles auswählen

import numpy as np


def sigmoid(x):
    sigm = 1 / (1 + np.exp(-x))
    return sigm

def p(X, w1, w2, b):
    """Wahrscheinlichkeit dass ein Hunde krank ist fuer alle Hunde gleichzeitig.

    Args:
        X (numpy.ndarray): Datenmatrix:
            - pro Hund eine Zeile (erster Index)
            - zwei Spalten: Herzfrequenz, ST-Depression (zweiter Index)
        w1 (float): Gewichtet die Herzfrequenz.
        w2 (float): Gewichtet die ST-Depression
        b (float): Verschiebung zur Unterscheidung des Gesundheitszustands.

        Returns:
            numpy.ndarray: Vektor:
                - pro Hund eine Wahrscheinlichkeit, dass der Hund krank ist
                    (Werte < 0.5: Hund ist wahrscheinlich gesund,
                     Werte > 0.5 Hund ist wahrcheinlich krank.)
    """
    f = np.array([X[0], X[1]])
    w = np.array([w1, w2])
    v = sigmoid(np.dot(w, f) + b)
    return v

def derivative(X, Y, w1, w2, b):
    """Ableitung der Gewichte und des Bias.

    Args:
        X (numpy.ndarray): Datenmatrix:
            - pro Hund eine Zeile (erster Index)
            - zwei Spalten: Herzfrequenz, ST-Depression (zweiter Index)
        Y (numpy.ndarray): Vektor mit den Lables:
            - pro Hund ein Wert mit dem tatsaechlichem
                Gesundheitszustand des Hundes.
        w1 (float): Gewichtet die Herzfrequenz.
        w2 (float): Gewichtet die ST-Depression
        b (float): Verschiebung zur Unterscheidung des Gesundheitszustands.

        Returns:
            (float, float, float): Die neuen Gewichte (w1, w2) und den neuen Bias (b).
    """
    d_w1 = (p(X, w1, w2, b) - Y) * X[0]
    d_w2 = (p(X, w1, w2, b) - Y) * X[1]
    d_b = (p(X, w1, w2, b) - Y)
    return d_w1, d_w2, d_b

def step(D, w1, w2, b, alpha):
    """Durchfuehren eines Optimierungsschritts.

    Args:
        D (numpy.ndarray): Datenmatrix:
            - pro Hund eine Zeile (erster Index)
            - pro Eigenschaft eine Spalte (zweiter Index)
        w1 (float): Gewichtet die Herzfrequenz.
        w2 (float): Gewichtet die ST-Depression
        b (float): Verschiebung zur Unterscheidung des Gesundheitszustands.
        alpha (float): Learning rate.

        Returns:
            (float, float, float): Die neuen Gweichte (w1, w2) und den neuen Bias (b).
    """
    x = np.array([D[:, 7], D[:, 9]])
    d_w1, d_w2, d_b = derivative(x, D[:, 13], w1, w2, b)
    w1_new = np.mean(w1 - alpha * d_w1)
    w2_new = np.mean(w2 - alpha * d_w2)
    b_new = np.mean(b - alpha * d_b)
    return w1_new, w2_new, b_new
Vielleicht kann mir jemand ja einen kleinen Tipp geben
Antworten