update
This commit is contained in:
parent
300f81fba8
commit
9d6006c9a6
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
|
@ -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
|
||||||
|
|
||||||
|
@ -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()
|
|
@ -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
|
||||||
|
|
||||||
|
@ -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()
|
Loading…
Reference in New Issue