Seite 1 von 1

Daten generieren für SGD

Verfasst: Montag 22. April 2019, 12:31
von JimWiesel
Hallo,

ich hoffe ihr habt schöne Ostertage.

ich bestreite meine ersten Schritte mit Python im Rahmen einer Machine Learning Vorlesung.
Für eine Aufgabe mit dem Stochastic Gradient Descent, ist es erforderlich Daten (100 Datenpunkte) zu generieren.

Es sollen 100 Datenpunkte generiert werden (x,y) wobei
x random generiert werden soll im Intervall [0,1]
y = sin(2 PI x) + Epsilon (wobei Epsilon random noise ist im Interval von [-0.3, 0.3])

Wenn ich das so mache wie ich es verstanden habe, bekomme ich aber eine "perfekte" Sinuskurve
ich hätte erwartet das durch das noise die Punkte mal über und mal unter der Kurve springen (für eine Verfälschung)

Bild
picture hosting

Zelle1 aus Jupyter Notebook

Code: Alles auswählen

import numpy as np
import random

def randomNoise():
    print("randomNoise")
    noise = np.random.uniform(low=-0.3, high=0.3, size=(1,))
    print(noise)
    return noise

X = np.random.rand(100,1)

print("X")
print(X)
print()
print()
print("---------") 
k = np.sin(2 * np.pi * X) + randomNoise()
print("K")
print(k)
print("---------") 
Zelle2 aus Jupyter Notebook

Code: Alles auswählen

plt.plot(X, k, "b.")
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([-2, 2, -2, 2])
#save_fig("generated_data_plot")
plt.show()
ändere ich die size auf 100 wird für jeden X Wert 100 Y Werte generiert und im Graphen angezeigt

Bild

Mir erschließt sich nicht ganz wie die Generierung der Daten funktioniert
Beim generieren von X erhalte ich 100 Zeilen in einer Spalte mit Werten von 0 bis 1
Wie ich zu den entsprechenden Y Werten komme verstehe ich jedoch nicht so recht, da meine erste Sinus kurve zu "perfekt" aussieht, als hätte das addieren meines Noise keine Auswirkung

Würde mich sehr über einen Denkanstoss freuen.

Re: Daten generieren für SGD

Verfasst: Montag 22. April 2019, 13:35
von JimWiesel
ich habe mich noch weiter dran versucht

ich bekomme jetzt eine "verzerrte" Kurve, wie es eig von mir erwartet war
indem ich mir per for jeden X Wert hole und dazu das Noise addiere

Code: Alles auswählen

k = []
for i in range(len(X)):
    ki = np.sin(2 * np.pi * X[i]) + randomNoise()
    k.append(ki)
Bild

die Weiterverarbeitung mit den Daten klappt aber noch nicht so richtig

Code: Alles auswählen

ValueError: shapes (1,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)
ich denke mal das liegt daran das ich meine Daten in ein einfaches Array ablege
das schaue ich mir aber nochmal an bevor ich hier unnötige Fragen stelle

Re: Daten generieren für SGD

Verfasst: Montag 22. April 2019, 13:37
von ThomasL
probier mal das hier:

Code: Alles auswählen

import numpy as np

X = np.random.rand(100)
print(X.shape)

k = np.sin(2 * np.pi * X) + np.random.uniform(low=-0.3, high=0.3, size=(100))
print(k.shape)

plt.figure(figsize=(10,10))
plt.scatter(X, k)
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 1, -2, 2])
plt.show()