def test_ridge_regression_gradient(self): estimator = ridge.RidgeRegression(l2_reg=.01) d = 5 input_vals = {"x": np.random.randn(d)} outcome_vals = {"y": np.array(np.random.randn())} parameter_vals = {"w": np.random.randn(d), "b":np.array(np.random.randn())} test_utils.test_ComputationGraphFunction(estimator.graph, input_vals, outcome_vals, parameter_vals) self.assertTrue(1 == 1)
def one_dim_ridge(): x = np.array([1, 2, 4, 6, 7]) y = np.array([1, 3, 3, 5, 4]) model = ridge.RidgeRegression(1.) model.fit(x, y) b, a = model.w_ plt.scatter(x, y, color="k") xmax = x.max() plt.plot([0, xmax], [b, b + a * xmax], color="k") plt.show()
def three_dim_ridge(): n = 100 scale = 10 # np.random.seed(1) X = np.random.random((n, 2)) * scale w0 = 1 w1 = 2 w2 = 3 y = w0 + w1 * X[:, 0] + w2 * X[:, 1] + np.random.randn(n) model = ridge.RidgeRegression() model.fit(X, y) xmesh, ymesh = np.meshgrid(np.linspace(0, scale, 20), np.linspace(0, scale, 20)) zmesh = (model.w_[0] + model.w_[1] * xmesh.ravel() + model.w_[2] * ymesh.ravel()).reshape(xmesh.shape) fig = plt.figure() ax = fig.add_subplot(111, projection="3d") ax.scatter(X[:, 0], X[:, 1], y, color="k") ax.plot_wireframe(xmesh, ymesh, zmesh, color="r") plt.show()
axes[1, i].set_ylim([ymin, ymax]) # 徐々にサンプル数を増やしたいため、iの値によってデータをスプリット xx = x[:2 + i * 2] yy = y[:2 + i * 2] # 一行目、二行目ともに同じデータを散文図で設定。 axes[0, i].scatter(xx, yy, color="k") axes[1, i].scatter(xx, yy, color="k") # 普通の線形回帰 model = linearreg.LinearRegression() model.fit(xx, yy) # 線形の図の始端、終端を定義 xs = [xmin, xmax] ys = [model.w_[0] + model.w_[1] * xmin, model.w_[0] + model.w_[1] * xmax] # 図示するため0行目のi列に代入 axes[0, i].plot(xs, ys, color="k") # リッジ回帰 model = ridge.RidgeRegression(lambda_=10.) model.fit(xx, yy) xs = [xmin, xmax] ys = [model.w_[0] + model.w_[1] * xmin, model.w_[0] + model.w_[1] * xmax] axes[1, i].plot(xs, ys, color="k") plt.show() """ 図でわかる通り、リッジ回帰ではサンプル数が少ない時に、例外的なデータからの影響を受けにくい、という性質がある。 これが正則化項wによる効果。 これが望ましいかどうかは、適用しようとしているデータの性質と、「何に応用しているのか」による。 """