设置步长适当:
步长是算法自己学习不出来的,它必须由外界指定。
这种算法不能学习,需要人为设定的参数,就叫做超参数。
最终我们找到了线性模型来解释自变量x与因变量y之间的关系,这就是线性回归。回归的解释是,事物总是倾向于朝着某种“平均”发展,这种趋势叫做回归,所以回归多用于预测。
上图,红线是我们拟合出的最佳模型,在此模型上我们可以寻找到2.2,2.6,2.8的预测值,分别对应图中的三个红点。
这也是线性回归的基本意义。
代码实践准备数据:
import numpy as np import matplotlib.pyplot as plt np.random.seed(42) X = 2 * np.random.rand(10) y = 4 + 3 * X + np.random.randn(10) plt.plot(X, y, "bo") plt.xlabel("$X$", fontsize=18) plt.ylabel("$y$", rotation=0, fontsize=18) plt.axis([0, 2, 0, 15]) plt.show()绘制y=3x+2和y=4x+4两条直线:
plt.plot(X, y, "bo") plt.plot(X, 3*X+2, "r-", lw="5", label = "y=3x+2") plt.plot(X, 4*X+4, "g:", lw="5", label = "y=4x+4") plt.xlabel("$X$", fontsize=18) plt.ylabel("$y$", rotation=0, fontsize=18) plt.axis([0, 2, 0, 15]) plt.legend(loc="upper left") plt.show()计算损失,并比较y=3x+2和y=4x+4两条直线:
fig, ax_list = plt.subplots(nrows=1, ncols=2,figsize=(20,10)) ax_list[0].plot(X, y, "bo") ax_list[0].plot(X, 3*X+2, "r-", lw="5", label = "y=3x+2") loss = 0 for i in range(10): ax_list[0].plot([X[i],X[i]], [y[i],3*X[i]+2], color='grey') loss= loss + np.square(3*X[i]+2-y[i]) pass ax_list[0].axis([0, 2, 0, 15]) ax_list[0].legend(loc="upper left") ax_list[0].title.set_text('loss=%s'%loss) ax_list[1].plot(X, y, "bo") ax_list[1].plot(X, 4*X+4, "g:", lw="5", label = "y=4x+4") loss = 0 for i in range(10): ax_list[1].plot([X[i],X[i]], [y[i],4*X[i]+4], color='grey') loss= loss + np.square(4*X[i]+4-y[i]) pass ax_list[1].axis([0, 2, 0, 15]) ax_list[1].legend(loc="upper left") ax_list[1].title.set_text('loss=%s'%loss) fig.subplots_adjust(wspace=0.1,hspace=0.5) fig.suptitle("Calculate loss",fontsize=16)训练模型,并预测:
from sklearn.linear_model import LinearRegression lr = LinearRegression() lr.fit(X.reshape(-1,1),y.reshape(-1,1)) X_test = [[2.2],[2.6],[2.8]] y_test = lr.predict(X_test) X_pred = 3 * np.random.rand(100, 1) y_pred = lr.predict(X_pred) plt.scatter(X,y, c='b', label='real') plt.plot(X_test,y_test, 'r', label='predicted point' ,marker=".", ms=20) plt.plot(X_pred,y_pred, 'r-', label='predicted') plt.xlabel("$X$", fontsize=18) plt.ylabel("$y$", rotation=0, fontsize=18) plt.axis([0, 3, 0, 15]) plt.legend(loc="upper left") loss = 0 for i in range(10): loss = loss + np.square(y[i]-lr.predict([[X[i]]])) plt.title("loss=%s"%loss) plt.show() 其他回归要怎么真正理解回归(regression)呢?通过大量的数据统计,个体小的豆子往往倾向于产生比其更大的后代,而个体大的豆子往往倾向于产生比其更小的后代,新产生的个体有向着豆子的平均值的一种趋势,这种趋势就是回归。我们本篇文章讲的线性回归就是应用于预测的一种技术。这时,回归往往与分类相对。
线性回归、逻辑回归、多项式回归、逐步回归、岭回归、套索(Lasso)回归、弹性网络(ElasticNet)回归是最常用的回归技术。我先对这些技术做一个简单整理,让大家把脉络理清,等大家实际需要再深入探索。试图去穷尽知识只会把自己拖向疲累。
名称 解释 公式线性回归(Linear Regression) 一种以线性模型来建模自变量与因变量关系的方法 $$ y = wx+b $$
逻辑回归(Logistic Regression) 对特定类别进行建模,用于二分类 $$ y=\frac{1}{1+e^{-x}} $$
多项式回归(Polynomial Regression) 自变量 x 和因变量 y 之间的关系被建模为关于 x 的 n 次多项式 $$ y=\beta_0 + \beta_1x + \beta_2x^2 + ... + \beta_mx^m + \varepsilon $$ (cαiyongji水印)
逐步回归(Stepwise Regression) 将多个变量一个一个地引入到模型,找到其对模型影响大的变量
套索回归(Lasso Regression) 稀疏矩阵,消除不重要的特征,MSE+L1范数 $$ J(\theta)=MSE(\theta) + \alpha\sum\mid\theta\mid $$ ,其中,α越大模型权重越小
岭回归(Ridge Regression) 正则化线性回归,增加模型自由度,防止过拟合,MSE+L2范数 $$ J(\theta)=MSE(\theta) + \alpha\frac{1}{2}\sum\theta^2 $$ ,其中,α越大模型权重越小
弹性网络(ElasticNet) 介于岭回归和Lasso回归之间 $$ J(\theta)=MSE(\theta) + \gamma\alpha\sum\mid\theta\mid + \alpha\frac{1-\gamma}{2}\sum\theta^2 $$ ,其中,γ介于0和1之间,接近0则更倾向于岭回归,接近1则更倾向于Lasso回归