Task02:回归

1.线性模型(linear model)概念:
线性模型自变量有一元、二元或者多元,也有一次,二次或者多次,比如y = b + w1 * x1 + w2 * x2 + w3 * x3 …, 我们一般意义上认为线性模型代表直线、平面或者更高维的线性映射,如下图
微信截图_20220615175042
微信截图_20220615175102
但是线性模型(linear model)的线性并不是指自变量是一次线性这么简单,比如下面这张图是曲线,y = w1 * x1² 的平方,但是如果把 x1² 看作是自变量,那么它就是线性的
抛物线
那么线性模型(linear model)该怎么定义呢?我们可以把W这个系数是否是线性(次数为1)作为判断模型是否是线性的依据,为什么可以这样呢?
1)线性模型y = b + w1 * x1 + w2 * x2 + w3 * x3 …, 只要w是一次,W系数就表示各个特征x1, x2, x3在最终预测值中所占的权重,如果把x1,x2,x3…各个整体看作特征,那么它就符合直线线性的定义
2)线性模型通过梯度下降法来求解w和b系数,损失函数w和b求偏导,他们的次数都是一次,损失函数只有一个峰底,满足线性的需求
微信截图_20220615183945
深度神经网络有很多层,w系数就不满足为线性的,它有很多的峰谷、峰底
2. 正则化
1)当参数特征过多时,会出现overfitting的现象,比如y = b + w1 * x1 + w2 * x2 + w3 * x3…后面还接了很多参数,如下图


为什么会出现这个现象呢?因为参数特征越多,那么模型的学习能力就越强,说白了,W系数越多,可以表达更多的特征的权重,可以表达更多特征的影响力细节,很多training data的细节都拟合出来了,但是过于精细的细节,其实test data是不需要的,因为test data数据里面的细节很可能是不一样的,这样就会导致损失函数结果很大
2)那么怎么样才能将过拟合解决呢,过拟合的表现其实就是线性图形的波动很剧烈,频繁,为什么波动会这么大呢?看下图,其实就是w系数很大的原因,所以我们的目标将线性图形变得不波动大,就是将w系数变得很小,这样就可以了
正则化
3)怎么样才能将w系数变得很小呢?我们梯度下降法的目标是将损失函数最小化,如果我们将w系数最小化跟损失函数值最小化统一起来,那么梯度下降完成,w系数就很小了,可以让线性图形变得很平滑,也就是不会过拟合了,这就是正则化;
线性
3. 代码实践
1)代码
import numpy as np
import matplotlib.pyplot as plt

#training data
x_data = [338., 333., 328., 207., 226., 25., 179., 60., 208., 606.]
y_data = [640., 633., 619., 393., 428., 27., 193., 66., 226., 1591.]
x_d = np.asarray(x_data)
y_d = np.asarray(y_data)
#loss #(y- (b + w*x))**2
y = np.linspace(-5, 5, num=100) #代表w的所有取值
x = np.linspace(-200, 100, num= 300) #代表的b的所有取值
X, Y = np.meshgrid(x, y) #用来绘制等高线的b,w矩阵
Z = np.zeros((len(y), len(x))) #用来绘制等高线b, w点对应的损失值
for i in range(len(y)):
for j in range(len(x)):
y_hat = y[i]*x_d + x[j]
Z[i][j] = np.dot(y_d - y_hat, y_d - y_hat)
#grid descent
itration = 2000000
b = -120
w = -4
b_history = [b]
w_history = [w]
lr = 0.0000005
for i in range(itration):
y_hat = b + w * x_d
grid_b = -2 * np.sum(y_d - y_hat)
grid_w = -2 * np.dot(x_d, y_d - y_hat)
b -= lr * grid_b
w -= lr * grid_w
b_history.append(b)
w_history.append(w)
#figure
plt.contourf(X, Y, Z, 50,alpha= 0.5, cmap=plt.get_cmap(‘jet’))
plt.plot(b_history, w_history, ‘o-’, ms=3, lw=1.5, color=‘black’)
plt.plot([-188.4], [2.67], ‘x’, ms=12, mew=3, color=“orange”)
plt.xlim(-200, -100)
plt.ylim(-5, 5)
plt.show()
2) 效果

1赞
浙ICP备19012682号