l1 l2 regularization
下文只会挑一些可以起到检验自学效果的并且有趣的地方来说明,系统的学习请前往课程资源链接。 【毕竟时间有限,和妹子吃鸡更要紧
同自学的可以相互交流
一起从“kind of understanding”
到“actual understanding”.
课程资源
- 标有对号的问题下期给答案
机器学习课程知乎问答
下文ppt截图也来自链接里NYU的课件。
上期解答
- 使用更多的数据可以减小近似误差吗?
不可以,只可以减小估计误差,近似误差只受假设空间的影响。 - 所有的估计误差都是因为我们知道data generation distribution,反过来我们能不能先去用数据估计这个分布,再利用这个分布来计算risk,做优化呢??
不可以,我们之所以搞这套机器学习方法,就是因为直接估计这个分布太难了,不现实。
l1 l2 regularization
已写在这篇博客
下面给这篇博客里两个famous pictures 的Python代码
- L1 正则化的famous picture
下图蓝色区域代表L1约束空间即 ∣ w 1 ∣ + ∣ w 2 ∣ ≤ r |w_1|+|w_2| \le r ∣w1∣+∣w2∣≤r,红色是全局最小值 w ^ \hat{w} w^附近的等值线
mport numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
# axis
fig = plt.figure(figsize=(10, 10))
ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)
ax.axis[:].set_visible(False)
ax.axis["x"] = ax.new_floating_axis(0,0)
ax.axis["x"].set_axisline_style("-|>", size = 1.0)
ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].set_axisline_style("-|>", size = 1.0)
ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")
# elliposid
step = 0.005
x = np.arange(-3, 6, step)
y = np.arange(-3, 7, step)
X, Y = np.meshgrid(x, y)
#Z = 2 * X**2 + 4*X*Y - 12 * X + 4 * Y**2 - 20 * Y + 26
Z = 2 * X**2 - 4 * X + Y**2 - 8 * Y +18
contour = plt.contour(X, Y, Z, [1,2,4,8], colors='r', linewidths=2.0)
# center
plt.scatter(1,4, c="k")
plt.annotate("$\hat{w}$", [1.1,3.8], fontsize = 14)
plt.xticks([])
plt.yticks([])
#region
plt.plot(0,0, c="b", marker="D", markersize=120, markeredgecolor = '0.75')
plt.title("The Famous Picture for $\ell_1$ Regularization ", fontsize=16)
plt.savefig("lasso.jpg")
plt.show()
- L2 正则化的famous picture
下图蓝色区域代表L2约束空间即 ∣ w 1 ∣ 2 + ∣ w 2 ∣ 2 ≤ r |w_1|^2+|w_2|^2 \le r ∣w1∣2+∣w2∣2≤r,红色是全局最小值 w ^ \hat{w} w^附近的等值线
mport numpy as np
import matplotlib.pyplot as plt
import mpl_toolkits.axisartist as axisartist
# axis
fig = plt.figure(figsize=(10, 10))
ax = axisartist.Subplot(fig, 111)
fig.add_axes(ax)
ax.axis[:].set_visible(False)
ax.axis["x"] = ax.new_floating_axis(0,0)
ax.axis["x"].set_axisline_style("-|>", size = 1.0)
ax.axis["y"] = ax.new_floating_axis(1,0)
ax.axis["y"].set_axisline_style("-|>", size = 1.0)
ax.axis["x"].set_axis_direction("bottom")
ax.axis["y"].set_axis_direction("left")
# elliposid
step = 0.005
x = np.arange(-3, 6, step)
y = np.arange(-3, 7, step)
X, Y = np.meshgrid(x, y)
#Z = 2 * X**2 + 4*X*Y - 12 * X + 4 * Y**2 - 20 * Y + 26
Z = 2 * X**2 - 4 * X + Y**2 - 8 * Y +18
contour = plt.contour(X, Y, Z, [1,2,4,8], colors='r', linewidths=2.0)
# center
plt.scatter(1,4, c="k")
plt.annotate("$\hat{w}$", [1.1,3.8], fontsize = 14)
plt.xticks([])
plt.yticks([])
#region
plt.plot(0,0, c="b", marker="o", markersize=150, markeredgecolor = '0.75')
plt.title("The Famous Picture for $\ell_1$ Regularization ", fontsize=16)
plt.savefig("lasso.jpg")
plt.show()