深入浅出Python机器学习
上QQ阅读APP看书,第一时间看更新

4.1.2 线性模型的图形表示

大家肯定还记得,我们在初中数学(也可能是小学数学)中学过,两个点可以确定一条直线。假设有两个点,它们的坐标是(1,3)和(4,5),那么我们可以画一条直线来穿过这两个点,并且计算出这条直线的方程。下面我们在Jupyter Notebook中输入代码如下:

运行代码,将会得到如图4-2所示的结果。

图4-2 穿过点(1,3)和(4,5)的直线

【结果分析】图4-2表示的就是穿过上述两个数据点的直线,现在我们可以确定这条直线的方程。

在Jupyter Notebook中输入代码如下:

print('\n\n\n直线方程为:')
print('==========\n')
#打印直线方程
print('y = {:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_))
print('\n==========')
print('\n\n\n')

运行代码,将会得到如图4-3所示的结果。

图4-3 程序计算出的直线方程

【结果分析】通过程序的计算,我们很容易就可以得到这条直线的方程为

y = 0.667 x + 2.333

这是数据中只有2个点的情况,那如果是3个点会是怎样的情况呢?我们来实验一下,假设现在有第3个点,坐标是(3,3),我们把这个点添加进去,看会得到怎样的结果。输入代码如下:

运行代码,会得到如图4-4所示的结果。

图4-4 对3个点进行拟合的线性模型

【结果分析】从图4-4中我们可以看到,这次直线没有穿过任何一个点,而是位于一个和3个点的距离相加最小的位置。

下面我们可以在计算出这条直线的方程,输入代码如下:

print('\n\n\n新的直线方程为:')
print('==========\n')
#打印直线方程
print('y = {:.3f}'.format(lr.coef_[0]),'x','+ {:.3f}'.format(lr.intercept_))
print('\n==========')
print('\n\n\n')

图4-5 对3个点进行拟合的线性模型方程

运行代码,将会得到结果如图4-5所示。

【结果分析】从图4-5中我们可以看到,新的直线方程和只有2个数据点的直线方程已经发生了变化。线性模型让自己距离每个数据点的加和为最小值。这也就是线性回归模型的原理。

当然,在实际应用中,数据量要远远大于2个或是3个,下面我们就用数量更多的数据来进行实验。

现在我们以scikit-klearn生成的make_regression数据集为例,用Python语句绘制一条线性模型的预测线,更加清晰地反映出线性模型的原理。在jupyter notebook中输入代码如下:

按下shift+回车键后,会得到结果如图4-6所示的结果。

图4-6 线性回归模型的预测线

【结果分析】从图4-1中我们可以看出,黑色直线是线性回归模型在make_regression数据集中生成的预测线。接下来我们来看一下这条直线所对应的斜率和截距。

输入代码如下:

print('\n\n\n代码运行结果:')
print('==========\n')
#打印直线的系数和截距
print('直线的系数是:{:.2f}'.format(reg.coef_[0]))
print('直线的截距是:{:.2f}'.format(reg.intercept_))
print('\n==========')
print('\n\n\n')

运行代码,会得到结果如图4-7所示。

图4-7 直线的系数和截距

【结果分析】从图4-7中我们可以看到,在我们手工生成的数据集中,线性模型的方程为

y = 79.52 x +10.92

而这条直线距离50个数据点的距离之和,是最小的。这便是一般线性模型的原理。

注意 细心的读者可能注意到coef_和intercept_这两个属性非常奇怪,它们都是以下划线_结尾。这是sciki-learn的一个特点,它总是用下划线作为来自训练数据集的属性的结尾,以便将它们与由用户设置的参数区分开。