def plt_logistic_squared_error(X, y): """ plots logistic squared error for demonstration """ wx, by = np.meshgrid(np.linspace(-6, 12, 50), np.linspace(10, -20, 40)) points = np.c_[wx.ravel(), by.ravel()] cost = np.zeros(points.shape[0]) for i in range(points.shape[0]): w, b = points[i] cost[i] = compute_cost_logistic_sq_err(X.reshape(-1, 1), y, w, b) cost = cost.reshape(wx.shape) fig = plt.figure() fig.canvas.toolbar_visible = False fig.canvas.header_visible = False fig.canvas.footer_visible = False ax = fig.add_subplot(1, 1, 1, projection='3d') ax.plot_surface( wx, by, cost, alpha=0.6, cmap=cm.jet, ) ax.set_xlabel('w', fontsize=16) ax.set_ylabel('b', fontsize=16) ax.set_zlabel("Cost", rotation=90, fontsize=16) ax.set_title('"Logistic" Squared Error Cost vs (w, b)') ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0))
def plt_logistic_cost(X, y): """ plots logistic cost """ wx, by = np.meshgrid(np.linspace(-6, 12, 50), np.linspace(0, -20, 40)) points = np.c_[wx.ravel(), by.ravel()] cost = np.zeros(points.shape[0], dtype=np.longdouble) for i in range(points.shape[0]): w, b = points[i] cost[i] = compute_cost_matrix(X.reshape(-1, 1), y, w, b, logistic=True, safe=True) cost = cost.reshape(wx.shape) fig = plt.figure(figsize=(9, 5)) fig.canvas.toolbar_visible = False fig.canvas.header_visible = False fig.canvas.footer_visible = False ax = fig.add_subplot(1, 2, 1, projection='3d') ax.plot_surface( wx, by, cost, alpha=0.6, cmap=cm.jet, ) ax.set_xlabel('w', fontsize=16) ax.set_ylabel('b', fontsize=16) ax.set_zlabel("Cost", rotation=90, fontsize=16) ax.set_title('Logistic Cost vs (w, b)') ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax = fig.add_subplot(1, 2, 2, projection='3d') ax.plot_surface( wx, by, np.log(cost), alpha=0.6, cmap=cm.jet, ) ax.set_xlabel('w', fontsize=16) ax.set_ylabel('b', fontsize=16) ax.set_zlabel('\nlog(Cost)', fontsize=16) ax.set_title('log(Logistic Cost) vs (w, b)') ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) plt.show() return cost
def __init__(self, regularize=False): self.regularize = regularize self.lambda_ = 0 fig = plt.figure(figsize=(8, 6)) fig.canvas.toolbar_visible = False fig.canvas.header_visible = False fig.canvas.footer_visible = False fig.set_facecolor('#ffffff') #white gs = GridSpec(5, 3, figure=fig) ax0 = fig.add_subplot(gs[0:3, :]) ax1 = fig.add_subplot(gs[-2, :]) ax2 = fig.add_subplot(gs[-1, :]) ax1.set_axis_off() ax2.set_axis_off() self.ax = [ax0, ax1, ax2] self.fig = fig self.axfitdata = plt.axes([0.26, 0.124, 0.12, 0.1]) #lx,by,w,h self.bfitdata = Button(self.axfitdata, 'fit data', color=dlc['dlblue']) self.bfitdata.label.set_fontsize(12) self.bfitdata.on_clicked(self.fitdata_clicked) #clear data is a future enhancement #self.axclrdata = plt.axes([0.26,0.06,0.12,0.05 ]) #lx,by,w,h #self.bclrdata = Button(self.axclrdata , 'clear data', color='white') #self.bclrdata.label.set_fontsize(12) #self.bclrdata.on_clicked(self.clrdata_clicked) self.cid = fig.canvas.mpl_connect('button_press_event', self.add_data) self.typebut = button_manager(fig, [0.4, 0.07, 0.15, 0.15], ["Regression", "Categorical"], [False, True], self.toggle_type) self.fig.text(0.1, 0.02 + 0.21, "Degree", fontsize=12) self.degrbut = button_manager( fig, [0.1, 0.02, 0.15, 0.2], ['1', '2', '3', '4', '5', '6'], [True, False, False, False, False, False], self.update_equation) if self.regularize: self.fig.text(0.6, 0.02 + 0.21, r"lambda($\lambda$)", fontsize=12) self.lambut = button_manager( fig, [0.6, 0.02, 0.15, 0.2], ['0.0', '0.2', '0.4', '0.6', '0.8', '1'], [True, False, False, False, False, False], self.updt_lambda)
def soup_bowl(): """ creates 3D quadratic error surface """ #Create figure and plot with a 3D projection fig = plt.figure(figsize=(4, 4)) fig.canvas.toolbar_visible = False fig.canvas.header_visible = False fig.canvas.footer_visible = False #Plot configuration ax = fig.add_subplot(111, projection='3d') ax.xaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.yaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_pane_color((1.0, 1.0, 1.0, 0.0)) ax.zaxis.set_rotate_label(False) ax.view_init(15, -120) #Useful linearspaces to give values to the parameters w and b w = np.linspace(-20, 20, 100) b = np.linspace(-20, 20, 100) #Get the z value for a bowl-shaped cost function z = np.zeros((len(w), len(b))) j = 0 for x in w: i = 0 for y in b: z[i, j] = x**2 + y**2 i += 1 j += 1 #Meshgrid used for plotting 3D functions W, B = np.meshgrid(w, b) #Create the 3D surface plot of the bowl-shaped cost function ax.plot_surface(W, B, z, cmap="Spectral_r", alpha=0.7, antialiased=False) ax.plot_wireframe(W, B, z, color='k', alpha=0.1) ax.set_xlabel("$w$") ax.set_ylabel("$b$") ax.set_zlabel("Cost", rotation=90) ax.set_title("Squared Error Cost used in Linear Regression") plt.show()
def __init__(self, x_train, y_train, w_range, b_range): # setup figure fig = plt.figure(figsize=(10, 6)) fig.canvas.toolbar_visible = False fig.canvas.header_visible = False fig.canvas.footer_visible = False fig.set_facecolor('#ffffff') #white gs = GridSpec(2, 2, figure=fig) ax0 = fig.add_subplot(gs[0, 0]) ax1 = fig.add_subplot(gs[0, 1]) ax2 = fig.add_subplot(gs[1, 0], projection='3d') ax3 = fig.add_subplot(gs[1, 1]) pos = ax3.get_position().get_points() ##[[lb_x,lb_y], [rt_x, rt_y]] h = 0.05 width = 0.2 axcalc = plt.axes([pos[1, 0] - width, pos[1, 1] - h, width, h]) #lx,by,w,h ax = np.array([ax0, ax1, ax2, ax3, axcalc]) self.fig = fig self.ax = ax self.x_train = x_train self.y_train = y_train self.w = 0. #initial point, non-array self.b = 0. # initialize subplots self.dplot = data_plot(ax[0], x_train, y_train, self.w, self.b) self.con_plot = contour_and_surface_plot(ax[1], ax[2], x_train, y_train, w_range, b_range, self.w, self.b) self.cplot = cost_plot(ax[3]) # setup events self.cid = fig.canvas.mpl_connect('button_press_event', self.click_contour) self.bcalc = Button(axcalc, 'Run Gradient Descent \nfrom current w,b (click)', color=dlc["dlorange"]) self.bcalc.on_clicked(self.calc_logistic)