Daten generieren für SGD

mit matplotlib, NumPy, pandas, SciPy, SymPy und weiteren mathematischen Programmbibliotheken.
Antworten
JimWiesel
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2017, 17:48

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.
JimWiesel
User
Beiträge: 2
Registriert: Donnerstag 23. Februar 2017, 17:48

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
Benutzeravatar
ThomasL
User
Beiträge: 1366
Registriert: Montag 14. Mai 2018, 14:44
Wohnort: Kreis Unna NRW

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()
Ich bin Pazifist und greife niemanden an, auch nicht mit Worten.
Für alle meine Code Beispiele gilt: "There is always a better way."
https://projecteuler.net/profile/Brotherluii.png
Antworten