This commit is contained in:
TerenceLiu 2022-10-08 09:38:37 +08:00
parent 300f81fba8
commit 9d6006c9a6
4 changed files with 71072 additions and 50766 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -10,6 +10,7 @@ from IPython.display import display, clear_output
from tqdm import tqdm from tqdm import tqdm
import matplotlib.pyplot as plt
import plotly.graph_objects as go import plotly.graph_objects as go
import plotly.io as pio import plotly.io as pio
@ -20,7 +21,7 @@ class gradient_descent_1d(object):
def __init__(self, environ:str="jupyterlab"): def __init__(self, environ:str="jupyterlab"):
pio.renderers.default = environ # 'notebook' or 'colab' or 'jupyterlab' pio.renderers.default = environ # 'notebook' or 'colab' or 'jupyterlab'
self.wg_expr = widgets.Text(value="x**3 - x**(1/2)", self.wg_expr = widgets.Text(value="x**3 - x**(1/2)",
description="Expression:", description="Expression:",
style={'description_width': 'initial'}) style={'description_width': 'initial'})
self.wg_x0 = widgets.FloatText(value="2", self.wg_x0 = widgets.FloatText(value="2",
description="Startpoint:", description="Startpoint:",
@ -279,19 +280,26 @@ class gradient_descent_2d(object):
x1 = symbols("x1") x1 = symbols("x1")
x2 = symbols("x2") x2 = symbols("x2")
expr = sympify(self.wg_expr.value) expr = sympify(self.wg_expr.value)
xx1 = np.arange(np.array(self.xn_list)[:, 0].min()*0.5, np.array(self.xn_list)[:, 0].max()*1.5, 0.05) xx1 = np.arange(np.array(self.xn_list)[:, 0].min() * 0.5, np.array(self.xn_list)[:, 0].max() * 1.5, 0.1)
xx2 = np.arange(np.array(self.xn_list)[:, 1].min()*0.5, np.array(self.xn_list)[:, 1].max()*1.5, 0.05) xx2 = np.arange(np.array(self.xn_list)[:, 1].min() * 0.5, np.array(self.xn_list)[:, 1].max() * 1.5, 0.1)
xx1_tangent = np.arange(np.array(self.xn_list)[:, 0].min(), np.array(self.xn_list)[:, 0].max(), 0.1)
xx2_tangent = np.arange(np.array(self.xn_list)[:, 1].min(), np.array(self.xn_list)[:, 1].max(), 0.1)
xx1_o, xx2_o = xx1, xx2
xx1, xx2 = np.meshgrid(xx1, xx2) xx1, xx2 = np.meshgrid(xx1, xx2)
xx1_tangent, xx2_tangent = np.meshgrid(xx1_tangent, xx2_tangent)
f = lambdify((x1, x2), expr, "numpy") f = lambdify((x1, x2), expr, "numpy")
fx = f(xx1, xx2) fx = f(xx1, xx2)
f_xn = f(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) f_xn = f(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1])
partial_x1 = lambdify((x1, x2), diff(expr, x1), "numpy")
partial_x2 = lambdify((x1, x2), diff(expr, x2), "numpy")
plane = partial_x1(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) * (x1 - np.array(self.xn_list)[:, 0]) + partial_x2(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) * (x2 - np.array(self.xn_list)[:, 0]) + f_xn
z = [lambdify((x1, x2), plane[i], "numpy")(xx1_tangent, xx2_tangent) for i in range(0, len(plane))]
frames, steps = [], [] frames, steps = [], []
for k in range(len(f_xn)): for k in range(len(f_xn)):
#frame = go.Frame(data=[go.Surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.8)]) tmp_trace1 = go.Scatter3d(x=np.array(self.xn_list)[:k,0], y=np.array(self.xn_list)[:k,1], z=f_xn)
#fig.add_trace(go.Scatter3d(x=np.array(self.xn_list)[:k, 0], y=np.array(self.xn_list)[:k, 1], z=f_xn)) tmp_trace2 = go.Surface(x=xx1_tangent, y=xx2_tangent, z=z[k], showscale=True, opacity=0.5)
frame = go.Frame(dict(data=[go.Scatter3d(x=np.array(self.xn_list)[:k,0], y=np.array(self.xn_list)[:k,1], z=f_xn)], name=f'frame{k+1}'), traces=[1]) frame = go.Frame(dict(data=[tmp_trace1, tmp_trace2], name=f'frame{k+1}'), traces=[1, 2])
frames.append(frame) frames.append(frame)
step = dict( step = dict(
method="update", method="update",
@ -316,13 +324,12 @@ class gradient_descent_2d(object):
len=1.0) len=1.0)
] ]
trace1 = go.Surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.8) trace1 = go.Surface(x=xx1, y=xx2, z=fx, showscale=False, opacity=0.8)
trace2 = go.Scatter3d(x=None, y=None, z=None) trace2 = go.Scatter3d(x=None, y=None, z=None)
fig = go.Figure(data=[trace1, trace2], frames=frames) trace3 = go.Surface(x=None, y=None, z=None, showscale=False, opacity=0.5, colorscale='Blues')
#fig.add_surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.9) fig = go.Figure(data=[trace1, trace2, trace3], frames=frames)
#fig.update_traces(contours_z=dict(show=True, usecolormap=True, highlightcolor="limegreen", project_z=True))
#fig.update(frames=frames)
fig.update_layout(updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None, dict(fromcurrent=True)]), \ fig.update_layout(updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None, dict(fromcurrent=True)]), \
dict(label="Pause", method="animate", args=[[None], dict(fromcurrent=True, mode='immediate', transition= {'duration': 0}, frame=dict(redraw=True, duration=0))])])], dict(label="Pause", method="animate", args=[[None], \
margin=dict(l=0, r=0, b=0, t=0), sliders=sliders) dict(fromcurrent=True, mode='immediate', transition= {'duration': 0}, frame=dict(redraw=True, duration=0))])])],
margin=dict(r=20, l=10, b=10, t=10), sliders=sliders)
fig.show() fig.show()

View File

@ -10,6 +10,7 @@ from IPython.display import display, clear_output
from tqdm import tqdm from tqdm import tqdm
import matplotlib.pyplot as plt
import plotly.graph_objects as go import plotly.graph_objects as go
import plotly.io as pio import plotly.io as pio
@ -20,7 +21,7 @@ class gradient_descent_1d(object):
def __init__(self, environ:str="jupyterlab"): def __init__(self, environ:str="jupyterlab"):
pio.renderers.default = environ # 'notebook' or 'colab' or 'jupyterlab' pio.renderers.default = environ # 'notebook' or 'colab' or 'jupyterlab'
self.wg_expr = widgets.Text(value="x**3 - x**(1/2)", self.wg_expr = widgets.Text(value="x**3 - x**(1/2)",
description="Expression:", description="Expression:",
style={'description_width': 'initial'}) style={'description_width': 'initial'})
self.wg_x0 = widgets.FloatText(value="2", self.wg_x0 = widgets.FloatText(value="2",
description="Startpoint:", description="Startpoint:",
@ -279,19 +280,26 @@ class gradient_descent_2d(object):
x1 = symbols("x1") x1 = symbols("x1")
x2 = symbols("x2") x2 = symbols("x2")
expr = sympify(self.wg_expr.value) expr = sympify(self.wg_expr.value)
xx1 = np.arange(np.array(self.xn_list)[:, 0].min()*0.5, np.array(self.xn_list)[:, 0].max()*1.5, 0.05) xx1 = np.arange(np.array(self.xn_list)[:, 0].min() * 0.5, np.array(self.xn_list)[:, 0].max() * 1.5, 0.1)
xx2 = np.arange(np.array(self.xn_list)[:, 1].min()*0.5, np.array(self.xn_list)[:, 1].max()*1.5, 0.05) xx2 = np.arange(np.array(self.xn_list)[:, 1].min() * 0.5, np.array(self.xn_list)[:, 1].max() * 1.5, 0.1)
xx1_tangent = np.arange(np.array(self.xn_list)[:, 0].min(), np.array(self.xn_list)[:, 0].max(), 0.1)
xx2_tangent = np.arange(np.array(self.xn_list)[:, 1].min(), np.array(self.xn_list)[:, 1].max(), 0.1)
xx1_o, xx2_o = xx1, xx2
xx1, xx2 = np.meshgrid(xx1, xx2) xx1, xx2 = np.meshgrid(xx1, xx2)
xx1_tangent, xx2_tangent = np.meshgrid(xx1_tangent, xx2_tangent)
f = lambdify((x1, x2), expr, "numpy") f = lambdify((x1, x2), expr, "numpy")
fx = f(xx1, xx2) fx = f(xx1, xx2)
f_xn = f(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) f_xn = f(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1])
partial_x1 = lambdify((x1, x2), diff(expr, x1), "numpy")
partial_x2 = lambdify((x1, x2), diff(expr, x2), "numpy")
plane = partial_x1(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) * (x1 - np.array(self.xn_list)[:, 0]) + partial_x2(np.array(self.xn_list)[:, 0], np.array(self.xn_list)[:, 1]) * (x2 - np.array(self.xn_list)[:, 0]) + f_xn
z = [lambdify((x1, x2), plane[i], "numpy")(xx1_tangent, xx2_tangent) for i in range(0, len(plane))]
frames, steps = [], [] frames, steps = [], []
for k in range(len(f_xn)): for k in range(len(f_xn)):
#frame = go.Frame(data=[go.Surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.8)]) tmp_trace1 = go.Scatter3d(x=np.array(self.xn_list)[:k,0], y=np.array(self.xn_list)[:k,1], z=f_xn)
#fig.add_trace(go.Scatter3d(x=np.array(self.xn_list)[:k, 0], y=np.array(self.xn_list)[:k, 1], z=f_xn)) tmp_trace2 = go.Surface(x=xx1_tangent, y=xx2_tangent, z=z[k], showscale=True, opacity=0.5)
frame = go.Frame(dict(data=[go.Scatter3d(x=np.array(self.xn_list)[:k,0], y=np.array(self.xn_list)[:k,1], z=f_xn)], name=f'frame{k+1}'), traces=[1]) frame = go.Frame(dict(data=[tmp_trace1, tmp_trace2], name=f'frame{k+1}'), traces=[1, 2])
frames.append(frame) frames.append(frame)
step = dict( step = dict(
method="update", method="update",
@ -316,13 +324,12 @@ class gradient_descent_2d(object):
len=1.0) len=1.0)
] ]
trace1 = go.Surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.8) trace1 = go.Surface(x=xx1, y=xx2, z=fx, showscale=False, opacity=0.8)
trace2 = go.Scatter3d(x=None, y=None, z=None) trace2 = go.Scatter3d(x=None, y=None, z=None)
fig = go.Figure(data=[trace1, trace2], frames=frames) trace3 = go.Surface(x=None, y=None, z=None, showscale=False, opacity=0.5, colorscale='Blues')
#fig.add_surface(x=xx1, y=xx2, z=fx, showscale=True, opacity=0.9) fig = go.Figure(data=[trace1, trace2, trace3], frames=frames)
#fig.update_traces(contours_z=dict(show=True, usecolormap=True, highlightcolor="limegreen", project_z=True))
#fig.update(frames=frames)
fig.update_layout(updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None, dict(fromcurrent=True)]), \ fig.update_layout(updatemenus=[dict(type="buttons", buttons=[dict(label="Play", method="animate", args=[None, dict(fromcurrent=True)]), \
dict(label="Pause", method="animate", args=[[None], dict(fromcurrent=True, mode='immediate', transition= {'duration': 0}, frame=dict(redraw=True, duration=0))])])], dict(label="Pause", method="animate", args=[[None], \
margin=dict(l=0, r=0, b=0, t=0), sliders=sliders) dict(fromcurrent=True, mode='immediate', transition= {'duration': 0}, frame=dict(redraw=True, duration=0))])])],
margin=dict(r=20, l=10, b=10, t=10), sliders=sliders)
fig.show() fig.show()